pax_global_header00006660000000000000000000000064150327724110014514gustar00rootroot0000000000000052 comment=3d568a1ba58c89725aef145752ba48a88588b1d0 hip-rocm-6.4.3/000077500000000000000000000000001503277241100132445ustar00rootroot00000000000000hip-rocm-6.4.3/.azuredevops/000077500000000000000000000000001503277241100156715ustar00rootroot00000000000000hip-rocm-6.4.3/.azuredevops/rocm-ci.yml000066400000000000000000000025341503277241100177510ustar00rootroot00000000000000resources: repositories: - repository: pipelines_repo type: github endpoint: ROCm name: ROCm/ROCm - repository: matching_repo type: github endpoint: ROCm name: ROCm/clr ref: $(Build.SourceBranch) - repository: hipother_repo type: github endpoint: ROCm name: ROCm/hipother ref: $(Build.SourceBranch) pipelines: - pipeline: rocr-runtime_pipeline source: \ROCR-Runtime trigger: branches: include: - amd-staging - amd-mainline - pipeline: rocprofiler-register_pipeline source: \rocprofiler-register trigger: branches: include: - amd-staging - amd-mainline variables: - group: common - template: /.azuredevops/variables-global.yml@pipelines_repo trigger: batch: true branches: include: - amd-staging - amd-mainline paths: exclude: - docs - '.github' - '.jenkins' - '.*.yaml' - CODEOWNERS - Jenkinsfile - LICENSE.txt - '**/*.md' - VERSION pr: autoCancel: true branches: include: - amd-staging - amd-mainline paths: exclude: - docs - '.github' - '.jenkins' - '.*.yaml' - CODEOWNERS - Jenkinsfile - LICENSE.txt - '**/.md' - VERSION drafts: false jobs: - template: ${{ variables.CI_COMPONENT_PATH }}/HIP.yml@pipelines_repo hip-rocm-6.4.3/.clang-format000066400000000000000000000004031503277241100156140ustar00rootroot00000000000000Language: Cpp BasedOnStyle: Google AlignEscapedNewlinesLeft: false AlignOperands: false ColumnLimit: 100 AlwaysBreakTemplateDeclarations: false DerivePointerAlignment: false IndentFunctionDeclarationAfterType: false MaxEmptyLinesToKeep: 2 SortIncludes: false hip-rocm-6.4.3/.gitattributes000066400000000000000000000011621503277241100161370ustar00rootroot00000000000000# Set the default behavior, in case people don't have core.autolf set. * text=auto # Explicitly declare text files you want to always be normalized and converted # to have LF line endings on checkout. *.c text eol=lf *.cpp text eol=lf *.cc text eol=lf *.h text eol=lf *.hpp text eol=lf *.txt text eol=lf # Define files to support auto-remove trailing white space # Need to run the command below, before add modified file(s) to the staging area # git config filter.trimspace.clean 'sed -e "s/[[:space:]]*$//g"' *.cpp filter=trimspace *.c filter=trimspace *.h filter=trimspacecpp *.hpp filter=trimspace *.md filter=trimspace hip-rocm-6.4.3/.github/000077500000000000000000000000001503277241100146045ustar00rootroot00000000000000hip-rocm-6.4.3/.github/dependabot.yml000066400000000000000000000012651503277241100174400ustar00rootroot00000000000000# To get started with Dependabot version updates, you'll need to specify which # package ecosystems to update and where the package manifests are located. # Please see the documentation for all configuration options: # https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates version: 2 updates: - package-ecosystem: "pip" # See documentation for possible values directory: "/docs/sphinx" # Location of package manifests open-pull-requests-limit: 10 schedule: interval: "daily" labels: - "documentation" - "dependencies" - "ci:docs-only" target-branch: "docs/develop" reviewers: - "samjwu" hip-rocm-6.4.3/.github/workflows/000077500000000000000000000000001503277241100166415ustar00rootroot00000000000000hip-rocm-6.4.3/.github/workflows/linting.yml000066400000000000000000000004641503277241100210340ustar00rootroot00000000000000name: Linting on: push: branches: - develop - main - 'docs/*' - 'roc**' pull_request: branches: - develop - main - 'docs/*' - 'roc**' jobs: call-workflow-passing-data: name: Documentation uses: ROCm/rocm-docs-core/.github/workflows/linting.yml@develop hip-rocm-6.4.3/.github/workflows/rocm-ci-caller.yml000066400000000000000000000036661503277241100221700ustar00rootroot00000000000000name: ROCm CI Caller on: pull_request: branches: [amd-staging, amd-npi, release/rocm-rel-*, amd-mainline] types: [opened, reopened, synchronize] push: branches: [amd-mainline] workflow_dispatch: issue_comment: types: [created] jobs: call-workflow: if: github.event_name != 'issue_comment' ||(github.event_name == 'issue_comment' && github.event.issue.pull_request && (startsWith(github.event.comment.body, '!verify') || startsWith(github.event.comment.body, '!linux-hip-psdb') || startsWith(github.event.comment.body, '!verify release') || startsWith(github.event.comment.body, '!verify retest'))) uses: AMD-ROCm-Internal/rocm_ci_infra/.github/workflows/rocm_ci.yml@mainline secrets: inherit with: input_sha: ${{github.event_name == 'pull_request' && github.event.pull_request.head.sha || (github.event_name == 'push' && github.sha) || (github.event_name == 'issue_comment' && github.event.issue.pull_request.head.sha) || github.sha}} input_pr_num: ${{github.event_name == 'pull_request' && github.event.pull_request.number || (github.event_name == 'issue_comment' && github.event.issue.number) || 0}} input_pr_url: ${{github.event_name == 'pull_request' && github.event.pull_request.html_url || (github.event_name == 'issue_comment' && github.event.issue.pull_request.html_url) || ''}} input_pr_title: ${{github.event_name == 'pull_request' && github.event.pull_request.title || (github.event_name == 'issue_comment' && github.event.issue.pull_request.title) || ''}} repository_name: ${{ github.repository }} base_ref: ${{github.event_name == 'pull_request' && github.event.pull_request.base.ref || (github.event_name == 'issue_comment' && github.event.issue.pull_request.base.ref) || github.ref}} trigger_event_type: ${{ github.event_name }} comment_text: ${{ github.event_name == 'issue_comment' && github.event.comment.body || '' }} hip-rocm-6.4.3/.gitignore000066400000000000000000000007331503277241100152370ustar00rootroot00000000000000.* !.gitignore *.o *.exe *.swp lib packages build bin/hipInfo bin/hipBusBandwidth bin/hipDispatchLatency bin/hipify-clang tags samples/0_Intro/module_api/runKernel.hip.out samples/0_Intro/module_api/vcpy_isa.code samples/0_Intro/module_api/vcpy_isa.hsaco samples/0_Intro/module_api/vcpy_kernel.co samples/0_Intro/module_api/vcpy_kernel.code samples/1_Utils/hipInfo/hipInfo samples/1_Utils/hipBusBandwidth/hipBusBandwidth samples/1_Utils/hipDispatchLatency/hipDispatchLatency hip-rocm-6.4.3/.jenkins/000077500000000000000000000000001503277241100147635ustar00rootroot00000000000000hip-rocm-6.4.3/.jenkins/Jenkinsfile000066400000000000000000000105311503277241100171470ustar00rootroot00000000000000def hipBuildTest(String backendLabel) { node(backendLabel) { stage("SYNC - ${backendLabel}") { // Checkout hip repository with the PR patch dir("${WORKSPACE}/hip") { checkout scm env.HIP_DIR = "${WORKSPACE}" + "/hip" } // Clone hip-tests repository dir("${WORKSPACE}/hip-tests") { git branch: 'develop', url: 'https://github.com/ROCm-Developer-Tools/hip-tests' env.HIP_TESTS_DIR = "${WORKSPACE}" + "/hip-tests" } // Clone clr repository dir("${WORKSPACE}/clr") { git branch: 'develop', credentialsId: 'branch-credentials', url: 'https://github.com/ROCm-Developer-Tools/clr' env.CLR_DIR = "${WORKSPACE}" + "/clr" } // Clone hipcc repspoitory dir("${WORKSPACE}/hipcc") { git branch: 'develop', credentialsId: 'branch-credentials', url: 'https://github.com/ROCm-Developer-Tools/hipcc' env.HIPCC_DIR = "${WORKSPACE}" + "/hipcc" } } stage("BUILD HIP - ${backendLabel}") { // Running the build on clr workspace dir("${WORKSPACE}/clr") { sh """#!/usr/bin/env bash set -x rm -rf build mkdir -p build cd build # Check if backend label contains string "amd" or backend host is a server with amd gpu if [[ $backendLabel =~ amd ]]; then cmake -DCLR_BUILD_HIP=ON -DHIP_PATH=\$PWD/install -DHIPCC_BIN_DIR=\$HIPCC_DIR/bin -DHIP_COMMON_DIR=\$HIP_DIR -DCMAKE_PREFIX_PATH="/opt/rocm/" -DCMAKE_INSTALL_PREFIX=\$PWD/install .. else cmake -DCLR_BUILD_HIP=ON -DHIP_PLATFORM=nvidia -DHIPCC_BIN_DIR=\$HIPCC_DIR/bin -DHIP_COMMON_DIR=\$HIP_DIR -DCMAKE_INSTALL_PREFIX=\$PWD/install .. fi make -j\$(nproc) make install -j\$(nproc) """ } } stage("BUILD HIP TESTS - ${backendLabel}") { // Running the build on HIP TESTS workspace dir("${WORKSPACE}/hip-tests") { env.HIP_PATH = "${CLR_DIR}" + "/build/install" sh """#!/usr/bin/env bash set -x rm -rf build mkdir -p build cd build echo "testing $HIP_PATH" # Check if backend label contains string "amd" or backend host is a server with amd gpu if [[ $backendLabel =~ amd ]]; then cmake -DHIP_PLATFORM=amd -DHIP_PATH=\$CLR_DIR/build/install ../catch else export HIP_PLATFORM=nvidia cmake -DHIP_PLATFORM=nvidia -DHIP_PATH=\$CLR_DIR/build/install ../catch fi make -j\$(nproc) build_tests """ } } timeout(time: 1, unit: 'HOURS') { stage("TEST - ${backendLabel}") { dir("${WORKSPACE}/hip-tests") { sh """#!/usr/bin/env bash set -x cd build if [[ $backendLabel =~ amd ]]; then ctest --overwrite BuildDirectory=. --output-junit hiptest_output_catch_amd.xml else ctest --overwrite BuildDirectory=. --output-junit hiptest_output_catch_nvidia.xml -E 'Unit_hipMemcpyHtoD_Positive_Synchronization_Behavior|Unit_hipMemcpy_Positive_Synchronization_Behavior|Unit_hipFreeNegativeHost' fi """ } } } } } timestamps { node('external-bootstrap') { skipDefaultCheckout() // labels belonging to each backend - AMD, NVIDIA String[] labels = ['hip-amd-gfx908-ubu2004', 'hip-nvidia-rtx5000-ubu2004'] buildMap = [:] labels.each { backendLabel -> echo "backendLabel: ${backendLabel}" buildMap[backendLabel] = { hipBuildTest(backendLabel) } } buildMap['failFast'] = false parallel buildMap } } hip-rocm-6.4.3/.markdownlint-cli2.yaml000066400000000000000000000000651503277241100175470ustar00rootroot00000000000000ignores: - RELEASE.md - docs/doxygen/mainpage.md hip-rocm-6.4.3/.readthedocs.yaml000066400000000000000000000017711503277241100165010ustar00rootroot00000000000000# Read the Docs configuration file # See https://docs.readthedocs.io/en/stable/config-file/v2.html for details version: 2 sphinx: configuration: docs/conf.py formats: [] python: install: - requirements: docs/sphinx/requirements.txt conda: environment: docs/environment.yml # needed until ubuntu ships doxygen >= 1.9.8 build: os: ubuntu-22.04 tools: python: "mambaforge-22.9" # needed until ubuntu ships doxygen >= 1.9.8 apt_packages: - "gfortran" # For pre-processing fortran sources - "graphviz" # For dot graphs in doxygen jobs: post_checkout: - if [ -d ../clr ]; then rm -rf ../clr; fi - if [ -d ../ROCR-Runtime ]; then rm -rf ../ROCR-Runtime; fi - git clone --depth=1 --single-branch --branch docs/develop https://github.com/ROCm/clr.git ../clr - git clone --depth=1 --single-branch --branch master https://github.com/ROCm/ROCR-Runtime.git ../ROCR-Runtime post_build: - rm -rf ../clr - rm -rf ../ROCR-Runtime hip-rocm-6.4.3/.wordlist.txt000066400000000000000000000023331503277241100157330ustar00rootroot00000000000000.hip_fatbin ALU ALUs AmgX APU APUs AQL AXPY Asynchrony backtrace Bitcode bitcode bitcodes builtins Builtins CAS clr coroutines Ctx cuBLASLt cuCtx CUDA's cuDNN cuModule dataflow deallocate decompositions denormal Dereferencing dll DirectX EIGEN EIGEN's enqueue enqueues entrypoint entrypoints enum enums embeded extern fatbin fatbinary foundationally frontends fnuz FNUZ fp gedit GPGPU GWS hardcoded HC hcBLAS HIP-Clang HIP's hipcc hipCtx hipexamine hipified hipModule hipModuleLaunchKernel hipother HIPRTC icc IILE iGPU inplace Interoperation interoperate Interprocess interprocess Intrinsics intrinsics IPC IPs isa Lapack latencies libc libstdc lifecycle linearizing LOC LUID ltrace makefile Malloc malloc memset multicore multigrid multithreading multitenant MALU NaN NCCL NDRange nonnegative NOP Numa Nsight ocp overindex overindexing oversubscription pixelated pragmas preallocated preconditioners predefining prefetched preprocessor PTX PyHIP queryable prefetching quad representable RMW ROCm's rocTX roundtrip RTC RTTI rvalue SAXPY scalarizing sceneries shaders SIMT SOMA SPMV structs SYCL syntaxes texel texels tradeoffs templated toolkits typedefs unintuitive UMM unmap upscaled variadic WinGDB zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz hip-rocm-6.4.3/CODEOWNERS000066400000000000000000000000661503277241100146410ustar00rootroot00000000000000* @chrispaquot @gandryey @saleelk @mangupta @rakesroy hip-rocm-6.4.3/CONTRIBUTING.md000066400000000000000000000214401503277241100154760ustar00rootroot00000000000000# Contributing to HIP # We welcome contributions to the HIP project. Please follow these details to help ensure your contributions will be successfully accepted. If you want to contribute to our documentation, refer to {doc}`Contribute to ROCm docs `. ## Issue Discussion ## Please use the [GitHub Issue](https://github.com/ROCm/HIP/issues) tab to notify us of issues. * Use your best judgement for issue creation. If your issue is already listed, upvote the issue and comment or post to provide additional details, such as how you reproduced this issue. * If you're not sure if your issue is the same, err on the side of caution and file your issue. You can add a comment to include the issue number (and link) for the similar issue. If we evaluate your issue as being the same as the existing issue, we'll close the duplicate. * If your issue doesn't exist, use the issue template to file a new issue. * When filing an issue, be sure to provide as much information as possible, including script output so we can collect information about your configuration. This helps reduce the time required to reproduce your issue. * Check your issue regularly, as we may require additional information to successfully reproduce the issue. * You may also open an issue to ask questions to the maintainers about whether a proposed change meets the acceptance criteria, or to discuss an idea pertaining to the library. ## Acceptance Criteria ## HIP is a C++ Runtime API and Kernel Language that allows developers to create portable applications for AMD and NVIDIA GPUs from single source code. Contributors wishing to submit new HIP Features (ie functions, classes, types) should resemble CUDA APIs. Differences or limitations of HIP APIs as compared to CUDA APIs should be clearly documented and described. Some guidelines are outlined below: ### Add a new HIP API ### * Add a translation to the hipify-clang tool ; many examples abound. * For stat tracking purposes, place the API into an appropriate stat category ("dev", "mem", "stream", etc). * Add a inlined NVIDIA implementation for the function in /hipnv/include/hip/nvidia_detail/nvidia_hip_runtime_api.h in the repository [hipother](https://github.com/ROCm/hipother). * These are typically headers * Add an HIP definition and Doxygen comments for the function in /include/hip/hip_runtime_api.h, in the repository [hip](https://github.com/ROCm/hip). * Source implementation typically go in clr/hipamd/src/hip_*.cpp in the reposotory [clr](https://github.com/ROCm/clr). The implementation involves calls to HIP runtime (ie for hipStream_t). ### Run Unit Tests ### For new features or bug fixes, it's mandatory to run associate [hip-tests](https://github.com/ROCm/hip-tests). Please go to the repo and follow the steps. For applications and benchmarks outside the hip-tests environment, developments should use a two-step development flow: * #1. Compile, link, and install HIP. See {ref}`Building the HIP runtime` notes. * #2. Relink the target application to include changes in HIP runtime file. ## Coding Style ## * Code Indentation: * Tabs should be expanded to spaces. * Use 4 spaces indentation. * Capitalization and Naming * Prefer camelCase for HIP interfaces and internal symbols. Note HCC uses _ for separator. This guideline is not yet consistently followed in HIP code * eventual compliance is aspirational. * Member variables should begin with a leading "_". This allows them to be easily distinguished from other variables or functions. * `{}` placement * namespace should be on same line as `{` and separated by a space. * Single-line if statement should still use `{/}` pair (even though C++ does not require). * For functions, the opening `{` should be placed on a new line. * For if/else blocks, the opening `{` is placed on same line as the if/else. Use a space to separate `{` from if/else. For example, ```console if (foo) { doFoo() } else { doFooElse(); } ``` * Miscellaneous * All references in function parameter lists should be const. * "ihip" means internal hip structures. These should not be exposed through the HIP API. * Keyword TODO refers to a note that should be addressed in long-term. Could be style issue, software architecture, or known bugs. * FIXME refers to a short-term bug that needs to be addressed. * `HIP_INIT_API()` should be placed at the start of each top-level HIP API. This function will make sure the HIP runtime is initialized, and also constructs an appropriate API string for tracing and CodeXL marker tracing. The arguments to HIP_INIT_API should match those of the parent function. * `hipExtGetLastError()` can be called as the AMD platform specific API, to return error code from last HIP API called from the active host thread. `hipGetLastError()` and `hipPeekAtLastError()` can also return the last error that was returned by any of the HIP runtime calls in the same host thread. * All HIP environment variables should begin with the keyword HIP_ Environment variables should be long enough to describe their purpose but short enough so they can be remembered * perhaps 10-20 characters, with 3-4 parts separated by underscores. To see the list of current environment variables, along with their values, set HIP_PRINT_ENV and run any hip applications on ROCm platform. HIPCC or other tools may support additional environment variables which should follow the above convention. ## Pull Request Guidelines ## By creating a pull request, you agree to the statements made in the code license section. Your pull request should target the default branch. Our current default branch is the develop branch, which serves as our integration branch. Follow existing best practice for writing a good Git commit message. Some tips: http://chris.beams.io/posts/git-commit/ https://robots.thoughtbot.com/5-useful-tips-for-a-better-commit-message In particular : * Use imperative voice, ie "Fix this bug", "Refactor the XYZ routine", "Update the doc". Not : "Fixing the bug", "Fixed the bug", "Bug fix", etc. * Subject should summarize the commit. Do not end subject with a period. Use a blank line after the subject. ### Deliverables ### HIP is an open source library. Because of this, we include the following license description at the top of every source file. If you create new source files in the repository, please include this text in them as well (replacing "xx" with the digits for the current year): ```cpp // Copyright (c) 20xx Advanced Micro Devices, Inc. All rights reserved. // // 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. ``` ### Process ### After you create a PR, you can take a look at a diff of the changes you made using the PR's "Files" tab. PRs must pass through the checks and the code review described in the [Acceptance Criteria](#acceptance-criteria) section before they can be merged. Checks may take some time to complete. You can view their progress in the table near the bottom of the pull request page. You may also be able to use the links in the table to view logs associated with a check if it fails. During code reviews, another developer will take a look through your proposed change. If any modifications are requested (or further discussion about anything is needed), they may leave a comment. You can follow up and respond to the comment, and/or create comments of your own if you have questions or ideas. When a modification request has been completed, the conversation thread about it will be marked as resolved. To update the code in your PR (eg. in response to a code review discussion), you can simply push another commit to the branch used in your pull request. ### Doxygen Editing Guidelines ### * bugs should be marked with @bugs near the code where the bug might be fixed. The @bug message will appear in the API description and also in the doxygen bug list. hip-rocm-6.4.3/Jenkinsfile000066400000000000000000000404051503277241100154330ustar00rootroot00000000000000#!/usr/bin/env groovy // Copyright (c) 2017 - 2021 Advanced Micro Devices, Inc. All Rights Reserved. // 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. // Generated from snippet generator 'properties; set job properties' properties([buildDiscarder(logRotator( artifactDaysToKeepStr: '', artifactNumToKeepStr: '', daysToKeepStr: '', numToKeepStr: '10')), disableConcurrentBuilds(), parameters([booleanParam( name: 'push_image_to_docker_hub', defaultValue: false, description: 'Push hip & hcc image to rocm docker-hub' )]), [$class: 'CopyArtifactPermissionProperty', projectNames: '*'] ]) //////////////////////////////////////////////////////////////////////// // -- AUXILLARY HELPER FUNCTIONS //////////////////////////////////////////////////////////////////////// // Return build number of upstream job @NonCPS int get_upstream_build_num( ) { def upstream_cause = currentBuild.rawBuild.getCause( hudson.model.Cause$UpstreamCause ) if( upstream_cause == null) return 0 return upstream_cause.getUpstreamBuild() } //////////////////////////////////////////////////////////////////////// // Return project name of upstream job @NonCPS String get_upstream_build_project( ) { def upstream_cause = currentBuild.rawBuild.getCause( hudson.model.Cause$UpstreamCause ) if( upstream_cause == null) return null return upstream_cause.getUpstreamProject() } //////////////////////////////////////////////////////////////////////// // Construct the docker build image name String docker_build_image_name( ) { return "build-ubuntu-16.04" } //////////////////////////////////////////////////////////////////////// // Construct the relative path of the build directory String build_directory_rel( String build_config ) { if( build_config.equalsIgnoreCase( 'release' ) ) { return "build/release" } else { return "build/debug" } } //////////////////////////////////////////////////////////////////////// // Lots of images are created above; no apparent way to delete images:tags with docker global variable def docker_clean_images( String org, String image_name ) { // Check if any images exist first grepping for image names int docker_images = sh( script: "docker images | grep \"${org}/${image_name}\"", returnStatus: true ) // The script returns a 0 for success (images were found ) if( docker_images == 0 ) { // Deleting images can fail, if other projects have built on top of that image and are now dependent on it. // This should not be treated as a hip build failure. This requires cleanup at a later time, possibly through // another job try { // Best attempt to run bash script to clean images // deleting images based on hash seems to be more stable than through name:tag values because of tags sh "docker images | grep \"${org}/${image_name}\" | awk '{print \$1 \":\" \$2}' | xargs docker rmi" } catch( err ) { println 'Failed to cleanup a few images; probably the images are used as a base for other images' currentBuild.result = 'SUCCESS' } } } //////////////////////////////////////////////////////////////////////// // -- BUILD RELATED FUNCTIONS //////////////////////////////////////////////////////////////////////// // Checkout source code, source dependencies and update version number numbers // Returns a relative path to the directory where the source exists in the workspace String checkout_and_version( String platform ) { String source_dir_rel = "src" String source_hip_rel = "${source_dir_rel}/hip" stage("${platform} clone") { dir( "${source_hip_rel}" ) { // checkout hip checkout([ $class: 'GitSCM', branches: scm.branches, doGenerateSubmoduleConfigurations: scm.doGenerateSubmoduleConfigurations, extensions: scm.extensions + [[$class: 'CleanCheckout']], userRemoteConfigs: scm.userRemoteConfigs ]) } } return source_hip_rel } //////////////////////////////////////////////////////////////////////// // This creates the docker image that we use to build the project in // The docker images contains all dependencies, including OS platform, to build def docker_build_image( String platform, String org, String optional_build_parm, String source_hip_rel, String from_image ) { String build_image_name = docker_build_image_name( ) String dockerfile_name = "dockerfile-build-ubuntu-16.04" def build_image = null stage("${platform} build image") { dir("${source_hip_rel}") { def user_uid = sh( script: 'id -u', returnStdout: true ).trim() // Docker 17.05 introduced the ability to use ARG values in FROM statements // Docker inspect failing on FROM statements with ARG https://issues.jenkins-ci.org/browse/JENKINS-44836 // build_image = docker.build( "${org}/${build_image_name}:latest", "--pull -f docker/${dockerfile_name} --build-arg user_uid=${user_uid} --build-arg base_image=${from_image} ." ) // JENKINS-44836 workaround by using a bash script instead of docker.build() sh "docker build -t ${org}/${build_image_name}:latest -f docker/${dockerfile_name} ${optional_build_parm} --build-arg user_uid=${user_uid} --build-arg base_image=${from_image} ." build_image = docker.image( "${org}/${build_image_name}:latest" ) } } return build_image } //////////////////////////////////////////////////////////////////////// // This encapsulates the cmake configure, build and package commands // Leverages docker containers to encapsulate the build in a fixed environment def docker_build_inside_image( def build_image, String inside_args, String platform, String optional_configure, String build_config, String source_hip_rel, String build_dir_rel ) { String source_hip_abs = pwd() + "/" + source_hip_rel build_image.inside( inside_args ) { stage("${platform} make ${build_config}") { // The rm command needs to run as sudo because the test steps below create files owned by root sh """#!/usr/bin/env bash set -x rm -rf ${build_dir_rel} mkdir -p ${build_dir_rel} cd ${build_dir_rel} cmake -DCMAKE_BUILD_TYPE=${build_config} -DCMAKE_INSTALL_PREFIX=staging ${optional_configure} ${source_hip_abs} make -j\$(nproc) """ } // Cap the maximum amount of testing, in case of hangs // Excluding hipMultiThreadDevice-pyramid & hipMemoryAllocateCoherentDriver tests from automation; due to its flakiness which requires some investigation timeout(time: 1, unit: 'HOURS') { stage("${platform} unit testing") { sh """#!/usr/bin/env bash set -x cd ${build_dir_rel} make install -j\$(nproc) make build_tests -i -j\$(nproc) ctest --output-on-failure -E "(hipMultiThreadDevice-pyramid|hipMemoryAllocateCoherentDriver)" """ // If unit tests output a junit or xunit file in the future, jenkins can parse that file // to display test results on the dashboard // junit "${build_dir_rel}/*.xml" } } // Only create packages from hcc based builds if( platform.toLowerCase( ).startsWith( 'rocm-' ) ) { stage("${platform} packaging") { sh """#!/usr/bin/env bash set -x cd ${build_dir_rel} make package """ // No matter the base platform, all packages have the same name // Only upload 1 set of packages, so we don't have a race condition uploading packages if( platform.toLowerCase( ).startsWith( 'rocm-head' ) ) { archiveArtifacts artifacts: "${build_dir_rel}/*.deb", fingerprint: true archiveArtifacts artifacts: "${build_dir_rel}/*.rpm", fingerprint: true } } } } return void } //////////////////////////////////////////////////////////////////////// // This builds a fresh docker image FROM a clean base image, with no build dependencies included // Uploads the new docker image to internal artifactory String docker_upload_artifactory( String hcc_ver, String artifactory_org, String from_image, String source_hip_rel, String build_dir_rel ) { def hip_install_image = null String image_name = "hip-${hcc_ver}-ubuntu-16.04" stage( 'artifactory' ) { println "artifactory_org: ${artifactory_org}" // We copy the docker files into the bin directory where the .deb lives so that it's a clean build everytime sh "cp -r ${source_hip_rel}/docker/* ${build_dir_rel}" // Docker 17.05 introduced the ability to use ARG values in FROM statements // Docker inspect failing on FROM statements with ARG https://issues.jenkins-ci.org/browse/JENKINS-44836 // hip_install_image = docker.build( "${artifactory_org}/${image_name}:${env.BUILD_NUMBER}", "--pull -f ${build_dir_rel}/dockerfile-hip-ubuntu-16.04 --build-arg base_image=${from_image} ${build_dir_rel}" ) // JENKINS-44836 workaround by using a bash script instead of docker.build() sh "docker build -t ${artifactory_org}/${image_name} --pull -f ${build_dir_rel}/dockerfile-hip-ubuntu-16.04 --build-arg base_image=${from_image} ${build_dir_rel}" hip_install_image = docker.image( "${artifactory_org}/${image_name}" ) // The connection to artifactory can fail sometimes, but this should not be treated as a build fail try { // Don't push pull requests to artifactory, these tend to accumulate over time if( env.BRANCH_NAME.toLowerCase( ).startsWith( 'pr-' ) ) { println 'Pull Request (PR-xxx) detected; NOT pushing to artifactory' } else { docker.withRegistry('http://compute-artifactory:5001', 'artifactory-cred' ) { hip_install_image.push( "${env.BUILD_NUMBER}" ) hip_install_image.push( 'latest' ) } } } catch( err ) { currentBuild.result = 'SUCCESS' } } return image_name } //////////////////////////////////////////////////////////////////////// // Uploads the new docker image to the public docker-hub def docker_upload_dockerhub( String local_org, String image_name, String remote_org ) { stage( 'docker-hub' ) { // Do not treat failures to push to docker-hub as a build fail try { sh """#!/usr/bin/env bash set -x echo inside sh docker tag ${local_org}/${image_name} ${remote_org}/${image_name} """ docker_hub_image = docker.image( "${remote_org}/${image_name}" ) docker.withRegistry('https://registry.hub.docker.com', 'docker-hub-cred' ) { docker_hub_image.push( "${env.BUILD_NUMBER}" ) docker_hub_image.push( 'latest' ) } } catch( err ) { currentBuild.result = 'SUCCESS' } } } //////////////////////////////////////////////////////////////////////// // -- MAIN // Following this line is the start of MAIN of this Jenkinsfile String build_config = 'Release' String job_name = env.JOB_NAME.toLowerCase( ) // The following launches 3 builds in parallel: rocm-head, rocm-3.3.x and cuda-10.x parallel rocm_3_3: { node('hip-rocm') { String hcc_ver = 'rocm-3.3.x' String from_image = 'ci_test_nodes/rocm-3.3.x/ubuntu-16.04:latest' String inside_args = '--device=/dev/kfd --device=/dev/dri --group-add=video' // Checkout source code, dependencies and version files String source_hip_rel = checkout_and_version( hcc_ver ) // Create/reuse a docker image that represents the hip build environment def hip_build_image = docker_build_image( hcc_ver, 'hip', '', source_hip_rel, from_image ) // Print system information for the log hip_build_image.inside( inside_args ) { sh """#!/usr/bin/env bash set -x /opt/rocm/bin/rocm_agent_enumerator -t ALL /opt/rocm/bin/hcc --version """ } // Conctruct a binary directory path based on build config String build_hip_rel = build_directory_rel( build_config ); // Build hip inside of the build environment docker_build_inside_image( hip_build_image, inside_args, hcc_ver, '', build_config, source_hip_rel, build_hip_rel ) // Clean docker build image docker_clean_images( 'hip', docker_build_image_name( ) ) // After a successful build, upload a docker image of the results /* String hip_image_name = docker_upload_artifactory( hcc_ver, job_name, from_image, source_hip_rel, build_hip_rel ) if( params.push_image_to_docker_hub ) { docker_upload_dockerhub( job_name, hip_image_name, 'rocm' ) docker_clean_images( 'rocm', hip_image_name ) } docker_clean_images( job_name, hip_image_name ) */ } }, rocm_head: { node('hip-rocm') { String hcc_ver = 'rocm-head' String from_image = 'ci_test_nodes/rocm-head/ubuntu-16.04:latest' String inside_args = '--device=/dev/kfd --device=/dev/dri --group-add=video' // Checkout source code, dependencies and version files String source_hip_rel = checkout_and_version( hcc_ver ) // Create/reuse a docker image that represents the hip build environment def hip_build_image = docker_build_image( hcc_ver, 'hip', '', source_hip_rel, from_image ) // Print system information for the log hip_build_image.inside( inside_args ) { sh """#!/usr/bin/env bash set -x /opt/rocm/bin/rocm_agent_enumerator -t ALL /opt/rocm/bin/hcc --version """ } // Conctruct a binary directory path based on build config String build_hip_rel = build_directory_rel( build_config ); // Build hip inside of the build environment docker_build_inside_image( hip_build_image, inside_args, hcc_ver, '', build_config, source_hip_rel, build_hip_rel ) // Clean docker image docker_clean_images( 'hip', docker_build_image_name( ) ) // After a successful build, upload a docker image of the results /* String hip_image_name = docker_upload_artifactory( hcc_ver, job_name, from_image, source_hip_rel, build_hip_rel ) if( params.push_image_to_docker_hub ) { docker_upload_dockerhub( job_name, hip_image_name, 'rocm' ) docker_clean_images( 'rocm', hip_image_name ) } docker_clean_images( job_name, hip_image_name ) */ } }, cuda_10_x: { node('hip-cuda') { //////////////////////////////////////////////////////////////////////// // Block of string constants customizing behavior for cuda String nvcc_ver = 'cuda-10.x' String from_image = 'ci_test_nodes/cuda-10.x/ubuntu-16.04:latest' String inside_args = '--gpus all'; // Checkout source code, dependencies and version files String source_hip_rel = checkout_and_version( nvcc_ver ) // Create/reuse a docker image that represents the hip build environment def hip_build_image = docker_build_image( nvcc_ver, 'hip', '', source_hip_rel, from_image ) // Print system information for the log hip_build_image.inside( inside_args ) { sh """#!/usr/bin/env bash set -x nvidia-smi nvcc --version """ } // Conctruct a binary directory path based on build config String build_hip_rel = build_directory_rel( build_config ); // Build hip inside of the build environment docker_build_inside_image( hip_build_image, inside_args, nvcc_ver, "-DHIP_NVCC_FLAGS=--Wno-deprecated-gpu-targets", build_config, source_hip_rel, build_hip_rel ) // Clean docker image docker_clean_images( 'hip', docker_build_image_name( ) ) } } hip-rocm-6.4.3/LICENSE.txt000066400000000000000000000020671503277241100150740ustar00rootroot00000000000000Copyright (c) 2008 - 2025 Advanced Micro Devices, Inc. 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. hip-rocm-6.4.3/README.md000066400000000000000000000256141503277241100145330ustar00rootroot00000000000000## What is this repository for? **HIP is a C++ Runtime API and Kernel Language that allows developers to create portable applications for AMD and NVIDIA GPUs from single source code.** Key features include: * HIP is very thin and has little or no performance impact over coding directly in CUDA mode. * HIP allows coding in a single-source C++ programming language including features such as templates, C++11 lambdas, classes, namespaces, and more. * HIP allows developers to use the "best" development environment and tools on each target platform. * The [HIPIFY](https://github.com/ROCm/HIPIFY/blob/amd-staging/README.md) tools automatically convert source from CUDA to HIP. * Developers can specialize for the platform (CUDA or AMD) to tune for performance or handle tricky cases. New projects can be developed directly in the portable HIP C++ language and can run on either NVIDIA or AMD platforms. Additionally, HIP provides porting tools which make it easy to port existing CUDA codes to the HIP layer, with no loss of performance as compared to the original CUDA application. HIP is not intended to be a drop-in replacement for CUDA, and developers should expect to do some manual coding and performance tuning work to complete the port. ## DISCLAIMER The information presented in this document is for informational purposes only and may contain technical inaccuracies, omissions, and typographical errors. The information contained herein is subject to change and may be rendered inaccurate for many reasons, including but not limited to product and roadmap changes, component and motherboard versionchanges, new model and/or product releases, product differences between differing manufacturers, software changes, BIOS flashes, firmware upgrades, or the like. Any computer system has risks of security vulnerabilities that cannot be completely prevented or mitigated.AMD assumes no obligation to update or otherwise correct or revise this information. However, AMD reserves the right to revise this information and to make changes from time to time to the content hereof without obligation of AMD to notify any person of such revisions or changes.THIS INFORMATION IS PROVIDED ‘AS IS.” AMD MAKES NO REPRESENTATIONS OR WARRANTIES WITH RESPECT TO THE CONTENTS HEREOF AND ASSUMES NO RESPONSIBILITY FOR ANY INACCURACIES, ERRORS, OR OMISSIONS THAT MAY APPEAR IN THIS INFORMATION. AMD SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR ANY PARTICULAR PURPOSE. IN NO EVENT WILL AMD BE LIABLE TO ANY PERSON FOR ANY RELIANCE, DIRECT, INDIRECT, SPECIAL, OR OTHER CONSEQUENTIAL DAMAGES ARISING FROM THE USE OF ANY INFORMATION CONTAINED HEREIN, EVEN IF AMD IS EXPRESSLY ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. AMD, the AMD Arrow logo, and combinations thereof are trademarks of Advanced Micro Devices, Inc. Other product names used in this publication are for identification purposes only and may be trademarks of their respective companies. © 2023 Advanced Micro Devices, Inc. All Rights Reserved. ## Repository branches The HIP repository maintains several branches. The branches that are of importance are: * develop branch: This is the default branch, on which the new features are still under development and visible. While this maybe of interest to many, it should be noted that this branch and the features under development might not be stable. * Main branch: This is the stable branch. It is up to date with the latest release branch, for example, if the latest HIP release is rocm-4.3, main branch will be the repository based on this release. * Release branches. These are branches corresponding to each ROCM release, listed with release tags, such as rocm-4.2, rocm-4.3, etc. ## Release tagging HIP releases are typically naming convention for each ROCM release to help differentiate them. * rocm x.yy: These are the stable releases based on the ROCM release. This type of release is typically made once a month.* ## More Info * [Installation](docs/install/install.rst) * [HIP FAQ](docs/how-to/faq.md) * [HIP C++ Language Extensions](docs/reference/cpp_language_extensions.rst) * [HIP Porting Guide](docs/how-to/hip_porting_guide.md) * [HIP Porting Driver Guide](docs/how-to/hip_porting_driver_api.md) * [HIP Programming Guide](docs/how-to/programming_manual.md) * [HIP Logging](docs/how-to/logging.rst) * [Building HIP From Source](docs/install/build.rst) * [HIP Debugging](docs/how-to/debugging.rst) * [HIP RTC](docs/how-to/hip_rtc.md) * [HIP Terminology](docs/reference/terms.md) (including Rosetta Stone of GPU computing terms across CUDA/HIP/OpenCL) * [HIPIFY](https://github.com/ROCm/HIPIFY/blob/amd-staging/README.md) * Supported CUDA APIs: * [Runtime API](https://github.com/ROCm/HIPIFY/blob/amd-staging/docs/tables/CUDA_Runtime_API_functions_supported_by_HIP.md) * [Driver API](https://github.com/ROCm/HIPIFY/blob/amd-staging/docs/tables/CUDA_Driver_API_functions_supported_by_HIP.md) * [cuComplex API](https://github.com/ROCm/HIPIFY/blob/amd-staging/docs/tables/cuComplex_API_supported_by_HIP.md) * [Device API](https://github.com/ROCm/HIPIFY/blob/amd-staging/docs/tables/CUDA_Device_API_supported_by_HIP.md) * [cuBLAS](https://github.com/ROCm/HIPIFY/blob/amd-staging/docs/tables/CUBLAS_API_supported_by_ROC.md) * [cuRAND](https://github.com/ROCm/HIPIFY/blob/amd-staging/docs/tables/CURAND_API_supported_by_HIP.md) * [cuDNN](https://github.com/ROCm/HIPIFY/blob/amd-staging/docs/tables/CUDNN_API_supported_by_HIP.md) * [cuFFT](https://github.com/ROCm/HIPIFY/blob/amd-staging/docs/tables/CUFFT_API_supported_by_HIP.md) * [cuSPARSE](https://github.com/ROCm/HIPIFY/blob/amd-staging/docs/tables/CUSPARSE_API_supported_by_HIP.md) * [Developer/CONTRIBUTING Info](CONTRIBUTING.md) * [Release Notes](RELEASE.md) ## How do I get set up? See the [Installation](docs/install/install.rst) notes. ## Simple Example The HIP API includes functions such as hipMalloc, hipMemcpy, and hipFree. Programmers familiar with CUDA will also be able to quickly learn and start coding with the HIP API. Compute kernels are launched with the "hipLaunchKernelGGL" macro call. Here is simple example showing a snippet of HIP API code: ```cpp hipMalloc(&A_d, Nbytes); hipMalloc(&C_d, Nbytes); hipMemcpy(A_d, A_h, Nbytes, hipMemcpyHostToDevice); const unsigned blocks = 512; const unsigned threadsPerBlock = 256; hipLaunchKernelGGL(vector_square, /* compute kernel*/ dim3(blocks), dim3(threadsPerBlock), 0/*dynamic shared*/, 0/*stream*/, /* launch config*/ C_d, A_d, N); /* arguments to the compute kernel */ hipMemcpy(C_h, C_d, Nbytes, hipMemcpyDeviceToHost); ``` The HIP kernel language defines builtins for determining grid and block coordinates, math functions, short vectors, atomics, and timer functions. It also specifies additional defines and keywords for function types, address spaces, and optimization controls (See the [HIP C++ Language Extensions](docs/reference/cpp_language_extensions.rst) for a full description). Here's an example of defining a simple 'vector_square' kernel. ```cpp template __global__ void vector_square(T *C_d, const T *A_d, size_t N) { size_t offset = (blockIdx.x * blockDim.x + threadIdx.x); size_t stride = blockDim.x * gridDim.x; for (size_t i=offset; i 16186. - Expanded math functions (device and host). Document unsupported functions. - hipFree with null pointer initializes runtime and returns success. - Improve error code reporting on nvcc. - Add hipPeekAtError for nvcc. =================================================================================================== Release:0.86.00 Date: 2016.06.06 - Add clang-hipify : clang-based hipify tool. Improved parsing of source code, and automates creation of hipLaunchParm variable. - Implement memory register / unregister commands (hipHostRegister, hipHostUnregister) - Add cross-linking support between G++ and HCC, in particular for interfaces that use standard C++ libraries (ie std::vectors, std::strings). HIPCC now uses libstdc++ by default on the HCC compilation path. - More samples including gpu-burn, SHOC, nbody, rtm. See [HIP-Examples](https://github.com/ROCm/HIP-Examples) =================================================================================================== Release:0.84.01 Date: 2016.04.25 - Refactor HIP make and install system: - Move to CMake. Refer to the installation section in README.md for details. - Split source into multiple modular .cpp and .h files. - Create static library and link. - Set HIP_PATH to install. - Make hipDevice and hipStream thread-safe. - Preferred hipStream usage is still to create new streams for each new thread, but it works even if you don;t. - Improve automated platform detection: If AMD GPU is installed and detected by driver, default HIP_PLATFORM to hcc. - HIP_TRACE_API now prints arguments to the HIP function (in addition to name of function). - Deprecate hipDeviceGetProp (Replace with hipGetDeviceProp) - Deprecate hipMallocHost (Replace with hipHostMalloc) - Deprecate hipFreeHost (Replace with hipHostFree) - The mixbench benchmark tool for measuring operational intensity now has a HIP target, in addition to CUDA and OpenCL. Let the comparisons begin. :) See here for more : https://github.com/ekondis/mixbench. =================================================================================================== Release:0.82.00 Date: 2016.03.07 - Bump minimum required HCC workweek to 16074. - Bump minimum required ROCK-Kernel-Driver and ROCR-Runtime to Developer Preview 2. - Enable multi-GPU support. * Use hipSetDevice to select a device for subsequent kernel calls and memory allocations. * CUDA_VISIBLE_DEVICES / HIP_VISIBLE_DEVICE environment variable selects devices visible to the runtime. - Support hipStreams – send sequences of copy and kernel commands to a device. * Asynchronous copies supported. - Optimize memory copy operations. - Support hipPointerGetAttribute – can determine if a pointer is host or device. - Enable atomics to local memory. - Support for LC Direct-To-ISA path. - Improved free memory reporting. * hipMemGetInfo (report full memory used in current process). * hipDeviceReset (deletes all memory allocated by current process). =================================================================================================== Release:0.80.01 Date: 2016.02.18 - Improve reporting and support for device-side math functions. - Update Runtime Documentation. - Improve implementations of cross-lane operations (_ballot, _any, _all). - Provide shuffle intrinsics (performance optimization in-progress). - Support hipDeviceAttribute for querying "one-shot" device attributes, as an alternative to hipGetDeviceProperties. =================================================================================================== Release:0.80.00 Date: 2016.01.25 Initial release with GPUOpen Launch. hip-rocm-6.4.3/VERSION000066400000000000000000000001031503277241100143060ustar00rootroot00000000000000#HIP_VERSION_MAJOR 6 #HIP_VERSION_MINOR 4 #HIP_VERSION_PATCH 43484 hip-rocm-6.4.3/bin/000077500000000000000000000000001503277241100140145ustar00rootroot00000000000000hip-rocm-6.4.3/bin/hipcc_cmake_linker_helper000077500000000000000000000027441503277241100211020ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 2017 - 2021 Advanced Micro Devices, Inc. All rights reserved. # # 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. SOURCE="${BASH_SOURCE[0]}" HIP_PATH="$( command cd -P "$( dirname "$SOURCE" )/.." && pwd )" HIP_COMPILER=$(eval "$HIP_PATH/bin/hipconfig --compiler") if [ "$HIP_COMPILER" = "hcc" ]; then HCC_HOME=$1 $HIP_PATH/bin/hipcc "${@:2}" elif [ "$HIP_COMPILER" = "clang" ]; then HIP_CLANG_PATH=$1 $HIP_PATH/bin/hipcc "${@:2}" else $HIP_PATH/bin/hipcc "${@:1}" fihip-rocm-6.4.3/bin/hipdemangleatp000077500000000000000000000035011503277241100167230ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 2016 - 2021 Advanced Micro Devices, Inc. All rights reserved. # # 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. # usage: hipdemangleatp.sh ATP_FILE # HIP kernels kernels=$(grep grid_launch_parm $1 | cut -d" " -f1 | sort | uniq) for mangled_sym in $kernels; do real_sym=$(c++filt -p $(c++filt _$mangled_sym | cut -d: -f3 | sed 's/_functor//g' | sed 's/ /\\\ /g')) #echo "$mangled_sym => $real_sym" >> $1.log sed -i "s/$mangled_sym/$real_sym/g" $1 done # HC kernels kernels=$(grep cxxamp_trampoline $1 | cut -d" " -f1 | sort | uniq) for mangled_sym in $kernels; do real_sym=$(echo $mangled_sym | sed "s/^/_/g; s/_EC_/$/g" | c++filt -p | cut -d\( -f1 | cut -d" " -f1 --complement | sed 's/ /\\\ /g') #echo "$mangled_sym => $real_sym" >> $1.log sed -i "s/$mangled_sym/$real_sym/g" $1 done hip-rocm-6.4.3/cmake/000077500000000000000000000000001503277241100143245ustar00rootroot00000000000000hip-rocm-6.4.3/cmake/FindHIP.cmake000066400000000000000000001051261503277241100165540ustar00rootroot00000000000000# Copyright (c) 2016 - 2021 Advanced Micro Devices, Inc. All Rights Reserved. # # 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. ############################################################################### # FindHIP.cmake ############################################################################### include(CheckCXXCompilerFlag) ############################################################################### # SET: Variable defaults ############################################################################### # User defined flags set(HIP_HIPCC_FLAGS "" CACHE STRING "Semicolon delimited flags for HIPCC") set(HIP_CLANG_FLAGS "" CACHE STRING "Semicolon delimited flags for CLANG") set(HIP_NVCC_FLAGS "" CACHE STRING "Semicolon delimted flags for NVCC") mark_as_advanced(HIP_HIPCC_FLAGS HIP_CLANG_FLAGS HIP_NVCC_FLAGS) set(_hip_configuration_types ${CMAKE_CONFIGURATION_TYPES} ${CMAKE_BUILD_TYPE} Debug MinSizeRel Release RelWithDebInfo) list(REMOVE_DUPLICATES _hip_configuration_types) foreach(config ${_hip_configuration_types}) string(TOUPPER ${config} config_upper) set(HIP_HIPCC_FLAGS_${config_upper} "" CACHE STRING "Semicolon delimited flags for HIPCC") set(HIP_CLANG_FLAGS_${config_upper} "" CACHE STRING "Semicolon delimited flags for CLANG") set(HIP_NVCC_FLAGS_${config_upper} "" CACHE STRING "Semicolon delimited flags for NVCC") mark_as_advanced(HIP_HIPCC_FLAGS_${config_upper} HIP_CLANG_FLAGS_${config_upper} HIP_NVCC_FLAGS_${config_upper}) endforeach() option(HIP_HOST_COMPILATION_CPP "Host code compilation mode" ON) option(HIP_VERBOSE_BUILD "Print out the commands run while compiling the HIP source file. With the Makefile generator this defaults to VERBOSE variable specified on the command line, but can be forced on with this option." OFF) mark_as_advanced(HIP_HOST_COMPILATION_CPP) ############################################################################### # FIND: HIP and associated helper binaries ############################################################################### if(NOT HIP_CXX_COMPILER) set(HIP_CXX_COMPILER ${CMAKE_CXX_COMPILER}) endif() # Approach: To find HIP_CLANG_PATH for HIP_CXX_COMPILER types # For HIP_CXX_COMPILER as *hipcc use hipconfig -l option to get the clang path. # For HIP_CXX_COMPILER as *clang use real path of HIP_CXX_COMPILER # IF not successful in getting the CLANG_PATH using HIP_CXX_COMPILER # fallback to Old Method to find HIP_CLANG_PATH from ENV Vars, ROCMPATH, HIPPATH etc. if(HIP_CXX_COMPILER MATCHES ".*hipcc") get_filename_component(HIPCC_PATH "${HIP_CXX_COMPILER}" DIRECTORY) set(_HIPCONFIG_EXECUTABLE "${HIPCC_PATH}/hipconfig") execute_process(COMMAND ${_HIPCONFIG_EXECUTABLE} -l OUTPUT_VARIABLE _HIP_CLANG_INSTALL_PATH OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_VARIABLE _HIPCONFIG_EXE_ERROR ERROR_STRIP_TRAILING_WHITESPACE RESULT_VARIABLE _HIPCONFIG_EXE_EXIT_CODE) if( _HIPCONFIG_EXE_ERROR ) message( STATUS "hipconfig -l option failed with error: ${_HIPCONFIG_EXE_ERROR}" ) else() #IF hipconfig -l executed with no error if( "${_HIPCONFIG_EXE_EXIT_CODE}" STREQUAL "0" ) set(HIP_CLANG_PATH "${_HIP_CLANG_INSTALL_PATH}") else() message( STATUS "${_HIPCONFIG_EXECUTABLE} Failed with Exit code: ${_HIPCONFIG_EXE_EXIT_CODE}" ) endif() endif() elseif (HIP_CXX_COMPILER MATCHES ".*clang\\+\\+") get_filename_component(_HIP_CLANG_REAL_PATH "${HIP_CXX_COMPILER}" REALPATH) get_filename_component(_HIP_CLANG_BIN_PATH "${_HIP_CLANG_REAL_PATH}" DIRECTORY) set(HIP_CLANG_PATH "${_HIP_CLANG_BIN_PATH}") endif() if(WIN32) # In windows FindHIP.cmake is installed in /cmake get_filename_component(_IMPORT_PREFIX "${CMAKE_CURRENT_LIST_DIR}/../" REALPATH) else() # In Linux FindHIP.cmake is installed in /lib/cmake/hip # RealPath: /lib/cmake/hip/FindHIP.cmake # Go 4 level up to get IMPORT PREFIX as get_filename_component(_FILE_PATH "${CMAKE_CURRENT_LIST_FILE}" REALPATH) get_filename_component(_IMPORT_PREFIX "${_FILE_PATH}/../../../../" ABSOLUTE) endif() # HIP is currently not supported for apple if(NOT APPLE) # Search for HIP installation if(NOT HIP_ROOT_DIR) # Search in user specified path first find_path( HIP_ROOT_DIR NAMES bin/hipconfig PATHS "$ENV{ROCM_PATH}" "$ENV{ROCM_PATH}/hip" ENV HIP_PATH ${_IMPORT_PREFIX} DOC "HIP installed location" NO_DEFAULT_PATH ) if(NOT EXISTS ${HIP_ROOT_DIR}) if(HIP_FIND_REQUIRED) message(FATAL_ERROR "Specify HIP_ROOT_DIR") elseif(NOT HIP_FIND_QUIETLY) message("HIP_ROOT_DIR not found or specified") endif() endif() # And push it back to the cache set(HIP_ROOT_DIR ${HIP_ROOT_DIR} CACHE PATH "HIP installed location" FORCE) endif() # Find HIPCC executable find_program( HIP_HIPCC_EXECUTABLE NAMES hipcc PATHS "${HIP_ROOT_DIR}" ENV ROCM_PATH ENV HIP_PATH PATH_SUFFIXES bin NO_DEFAULT_PATH ) if(NOT HIP_HIPCC_EXECUTABLE) # Now search in default paths find_program(HIP_HIPCC_EXECUTABLE hipcc) endif() # Find HIPCONFIG executable find_program( HIP_HIPCONFIG_EXECUTABLE NAMES hipconfig PATHS "${HIP_ROOT_DIR}" ENV ROCM_PATH ENV HIP_PATH PATH_SUFFIXES bin NO_DEFAULT_PATH ) if(NOT HIP_HIPCONFIG_EXECUTABLE) # Now search in default paths find_program(HIP_HIPCONFIG_EXECUTABLE hipconfig) endif() if(NOT UNIX) get_filename_component(HIPCONFIG_EXECUTABLE_EXT ${HIP_HIPCONFIG_EXECUTABLE} EXT) if(NOT HIPCONFIG_EXECUTABLE_EXT STREQUAL ".bat") set(HIP_HIPCONFIG_EXECUTABLE "${HIP_HIPCONFIG_EXECUTABLE}.bat") set(HIP_HIPCC_EXECUTABLE "${HIP_HIPCC_EXECUTABLE}.bat") endif() endif() mark_as_advanced(HIP_HIPCONFIG_EXECUTABLE) mark_as_advanced(HIP_HIPCC_EXECUTABLE) # Find HIPCC_CMAKE_LINKER_HELPER executable find_program( HIP_HIPCC_CMAKE_LINKER_HELPER NAMES hipcc_cmake_linker_helper PATHS "${HIP_ROOT_DIR}" ENV ROCM_PATH ENV HIP_PATH PATH_SUFFIXES bin NO_DEFAULT_PATH ) if(NOT HIP_HIPCC_CMAKE_LINKER_HELPER) # Now search in default paths find_program(HIP_HIPCC_CMAKE_LINKER_HELPER hipcc_cmake_linker_helper) endif() mark_as_advanced(HIP_HIPCC_CMAKE_LINKER_HELPER) if(HIP_HIPCONFIG_EXECUTABLE AND NOT HIP_VERSION) # Compute the version execute_process( COMMAND ${HIP_HIPCONFIG_EXECUTABLE} --version OUTPUT_VARIABLE _hip_version ERROR_VARIABLE _hip_error OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_STRIP_TRAILING_WHITESPACE ) if(NOT _hip_error) set(HIP_VERSION ${_hip_version} CACHE STRING "Version of HIP as computed from hipcc") else() set(HIP_VERSION "0.0.0" CACHE STRING "Version of HIP as computed by FindHIP()") endif() mark_as_advanced(HIP_VERSION) endif() if(HIP_VERSION) string(REPLACE "." ";" _hip_version_list "${HIP_VERSION}") list(GET _hip_version_list 0 HIP_VERSION_MAJOR) list(GET _hip_version_list 1 HIP_VERSION_MINOR) list(GET _hip_version_list 2 HIP_VERSION_PATCH) set(HIP_VERSION_STRING "${HIP_VERSION}") endif() if(HIP_HIPCONFIG_EXECUTABLE AND NOT HIP_PLATFORM) # Compute the platform execute_process( COMMAND ${HIP_HIPCONFIG_EXECUTABLE} --platform OUTPUT_VARIABLE _hip_platform OUTPUT_STRIP_TRAILING_WHITESPACE ) set(HIP_PLATFORM ${_hip_platform} CACHE STRING "HIP platform as computed by hipconfig") mark_as_advanced(HIP_PLATFORM) endif() if(HIP_HIPCONFIG_EXECUTABLE AND NOT HIP_COMPILER) # Compute the compiler execute_process( COMMAND ${HIP_HIPCONFIG_EXECUTABLE} --compiler OUTPUT_VARIABLE _hip_compiler OUTPUT_STRIP_TRAILING_WHITESPACE ) set(HIP_COMPILER ${_hip_compiler} CACHE STRING "HIP compiler as computed by hipconfig") mark_as_advanced(HIP_COMPILER) endif() if(HIP_HIPCONFIG_EXECUTABLE AND NOT HIP_RUNTIME) # Compute the runtime execute_process( COMMAND ${HIP_HIPCONFIG_EXECUTABLE} --runtime OUTPUT_VARIABLE _hip_runtime OUTPUT_STRIP_TRAILING_WHITESPACE ) set(HIP_RUNTIME ${_hip_runtime} CACHE STRING "HIP runtime as computed by hipconfig") mark_as_advanced(HIP_RUNTIME) endif() endif() include(FindPackageHandleStandardArgs) find_package_handle_standard_args( HIP REQUIRED_VARS HIP_ROOT_DIR HIP_HIPCC_EXECUTABLE HIP_HIPCONFIG_EXECUTABLE HIP_PLATFORM HIP_COMPILER HIP_RUNTIME VERSION_VAR HIP_VERSION ) ############################################################################### # Set HIP CMAKE Flags ############################################################################### # Copy the invocation styles from CXX to HIP set(CMAKE_HIP_ARCHIVE_CREATE ${CMAKE_CXX_ARCHIVE_CREATE}) set(CMAKE_HIP_ARCHIVE_APPEND ${CMAKE_CXX_ARCHIVE_APPEND}) set(CMAKE_HIP_ARCHIVE_FINISH ${CMAKE_CXX_ARCHIVE_FINISH}) set(CMAKE_SHARED_LIBRARY_SONAME_HIP_FLAG ${CMAKE_SHARED_LIBRARY_SONAME_CXX_FLAG}) set(CMAKE_SHARED_LIBRARY_CREATE_HIP_FLAGS ${CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS}) set(CMAKE_SHARED_LIBRARY_HIP_FLAGS ${CMAKE_SHARED_LIBRARY_CXX_FLAGS}) #set(CMAKE_SHARED_LIBRARY_LINK_HIP_FLAGS ${CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS}) set(CMAKE_SHARED_LIBRARY_RUNTIME_HIP_FLAG ${CMAKE_SHARED_LIBRARY_RUNTIME_CXX_FLAG}) set(CMAKE_SHARED_LIBRARY_RUNTIME_HIP_FLAG_SEP ${CMAKE_SHARED_LIBRARY_RUNTIME_CXX_FLAG_SEP}) set(CMAKE_SHARED_LIBRARY_LINK_STATIC_HIP_FLAGS ${CMAKE_SHARED_LIBRARY_LINK_STATIC_CXX_FLAGS}) set(CMAKE_SHARED_LIBRARY_LINK_DYNAMIC_HIP_FLAGS ${CMAKE_SHARED_LIBRARY_LINK_DYNAMIC_CXX_FLAGS}) set(HIP_CLANG_PARALLEL_BUILD_COMPILE_OPTIONS "") set(HIP_CLANG_PARALLEL_BUILD_LINK_OPTIONS "") if("${HIP_COMPILER}" STREQUAL "nvcc") # Set the CMake Flags to use the nvcc Compiler. set(CMAKE_HIP_CREATE_SHARED_LIBRARY "${HIP_HIPCC_CMAKE_LINKER_HELPER} -o ") set(CMAKE_HIP_CREATE_SHARED_MODULE "${HIP_HIPCC_CMAKE_LINKER_HELPER} -o -shared" ) set(CMAKE_HIP_LINK_EXECUTABLE "${HIP_HIPCC_CMAKE_LINKER_HELPER} -o ") elseif("${HIP_COMPILER}" STREQUAL "clang") #Set HIP_CLANG_PATH if("x${HIP_CLANG_PATH}" STREQUAL "x") # IF HIP_CLANG_INSTALL_DIR is Found if( HIP_CLANG_INSTALL_DIR ) set(HIP_CLANG_PATH ${HIP_CLANG_INSTALL_DIR}) else() # IF HIP_CLANG_INSTALL_DIR is not found if(DEFINED ENV{HIP_CLANG_PATH}) set(HIP_CLANG_PATH $ENV{HIP_CLANG_PATH}) elseif(DEFINED ENV{ROCM_PATH}) set(HIP_CLANG_PATH "$ENV{ROCM_PATH}/llvm/bin") elseif(DEFINED ENV{HIP_PATH}) if(EXISTS "$ENV{HIP_PATH}/llvm/bin") #File Reorg backward compatibility set(HIP_CLANG_PATH "$ENV{HIP_PATH}/llvm/bin") else() set(HIP_CLANG_PATH "$ENV{HIP_PATH}/../llvm/bin") endif() elseif(DEFINED HIP_PATH) if(EXISTS "${HIP_PATH}/llvm/bin") #File Reorg backward compatibility set(HIP_CLANG_PATH "${HIP_PATH}/llvm/bin") else() set(HIP_CLANG_PATH "${HIP_PATH}/../llvm/bin") endif() # Handle the case where ROCM_PATH is defined and not set in ENV elseif(DEFINED ROCM_PATH) set(HIP_CLANG_PATH "${ROCM_PATH}/llvm/bin") else() message(FATAL_ERROR "Unable to find the clang compiler path. Set ROCM_PATH or HIP_PATH in env ") endif() endif() # HIP_CLANG_INSTALL_DIR Check endif() # Set HIP_CLANG_PATH #Number of parallel jobs by default is 1 if(NOT DEFINED HIP_CLANG_NUM_PARALLEL_JOBS) set(HIP_CLANG_NUM_PARALLEL_JOBS 1) endif() #Add support for parallel build and link if(${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang") check_cxx_compiler_flag("-parallel-jobs=1" HIP_CLANG_SUPPORTS_PARALLEL_JOBS) endif() if(HIP_CLANG_NUM_PARALLEL_JOBS GREATER 1) if(${HIP_CLANG_SUPPORTS_PARALLEL_JOBS}) set(HIP_CLANG_PARALLEL_BUILD_COMPILE_OPTIONS "-Wno-format-nonliteral -parallel-jobs=${HIP_CLANG_NUM_PARALLEL_JOBS}") set(HIP_CLANG_PARALLEL_BUILD_LINK_OPTIONS "-parallel-jobs=${HIP_CLANG_NUM_PARALLEL_JOBS}") else() message("clang compiler doesn't support parallel jobs") endif() endif() # Set the CMake Flags to use the HIP-Clang Compiler. set(CMAKE_HIP_CREATE_SHARED_LIBRARY "${HIP_HIPCC_CMAKE_LINKER_HELPER} ${HIP_CLANG_PATH} ${HIP_CLANG_PARALLEL_BUILD_LINK_OPTIONS} -o ") set(CMAKE_HIP_CREATE_SHARED_MODULE "${HIP_HIPCC_CMAKE_LINKER_HELPER} ${HIP_CLANG_PATH} ${HIP_CLANG_PARALLEL_BUILD_LINK_OPTIONS} -o -shared" ) set(CMAKE_HIP_LINK_EXECUTABLE "${HIP_HIPCC_CMAKE_LINKER_HELPER} ${HIP_CLANG_PATH} ${HIP_CLANG_PARALLEL_BUILD_LINK_OPTIONS} -o ") if("${HIP_RUNTIME}" STREQUAL "rocclr") if(TARGET host) message(STATUS "host interface - found") set(HIP_HOST_INTERFACE host) endif() endif() endif() ############################################################################### # MACRO: Locate helper files ############################################################################### macro(HIP_FIND_HELPER_FILE _name _extension) set(_hip_full_name "${_name}.${_extension}") get_filename_component(CMAKE_CURRENT_LIST_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH) set(HIP_${_name} "${CMAKE_CURRENT_LIST_DIR}/FindHIP/${_hip_full_name}") if(NOT EXISTS "${HIP_${_name}}") set(error_message "${_hip_full_name} not found in ${CMAKE_CURRENT_LIST_DIR}/FindHIP") if(HIP_FIND_REQUIRED) message(FATAL_ERROR "${error_message}") else() if(NOT HIP_FIND_QUIETLY) message(STATUS "${error_message}") endif() endif() endif() # Set this variable as internal, so the user isn't bugged with it. set(HIP_${_name} ${HIP_${_name}} CACHE INTERNAL "Location of ${_full_name}" FORCE) endmacro() ############################################################################### hip_find_helper_file(run_make2cmake cmake) hip_find_helper_file(run_hipcc cmake) ############################################################################### ############################################################################### # MACRO: Reset compiler flags ############################################################################### macro(HIP_RESET_FLAGS) unset(HIP_HIPCC_FLAGS) unset(HIP_CLANG_FLAGS) unset(HIP_NVCC_FLAGS) foreach(config ${_hip_configuration_types}) string(TOUPPER ${config} config_upper) unset(HIP_HIPCC_FLAGS_${config_upper}) unset(HIP_CLANG_FLAGS_${config_upper}) unset(HIP_NVCC_FLAGS_${config_upper}) endforeach() endmacro() ############################################################################### # MACRO: Separate the options from the sources ############################################################################### macro(HIP_GET_SOURCES_AND_OPTIONS _sources _cmake_options _hipcc_options _clang_options _nvcc_options) set(${_sources}) set(${_cmake_options}) set(${_hipcc_options}) set(${_clang_options}) set(${_nvcc_options}) set(_hipcc_found_options FALSE) set(_clang_found_options FALSE) set(_nvcc_found_options FALSE) foreach(arg ${ARGN}) if("x${arg}" STREQUAL "xHIPCC_OPTIONS") set(_hipcc_found_options TRUE) set(_clang_found_options FALSE) set(_nvcc_found_options FALSE) elseif("x${arg}" STREQUAL "xCLANG_OPTIONS") set(_hipcc_found_options FALSE) set(_clang_found_options TRUE) set(_nvcc_found_options FALSE) elseif("x${arg}" STREQUAL "xNVCC_OPTIONS") set(_hipcc_found_options FALSE) set(_clang_found_options FALSE) set(_nvcc_found_options TRUE) elseif( "x${arg}" STREQUAL "xEXCLUDE_FROM_ALL" OR "x${arg}" STREQUAL "xSTATIC" OR "x${arg}" STREQUAL "xSHARED" OR "x${arg}" STREQUAL "xMODULE" ) list(APPEND ${_cmake_options} ${arg}) else() if(_hipcc_found_options) list(APPEND ${_hipcc_options} ${arg}) elseif(_clang_found_options) list(APPEND ${_clang_options} ${arg}) elseif(_nvcc_found_options) list(APPEND ${_nvcc_options} ${arg}) else() # Assume this is a file list(APPEND ${_sources} ${arg}) endif() endif() endforeach() endmacro() ############################################################################### # MACRO: Add include directories to pass to the hipcc command ############################################################################### set(HIP_HIPCC_INCLUDE_ARGS_USER "") macro(HIP_INCLUDE_DIRECTORIES) foreach(dir ${ARGN}) list(APPEND HIP_HIPCC_INCLUDE_ARGS_USER $<$:-I${dir}>) endforeach() endmacro() ############################################################################### # FUNCTION: Helper to avoid clashes of files with the same basename but different paths ############################################################################### function(HIP_COMPUTE_BUILD_PATH path build_path) # Convert to cmake style paths file(TO_CMAKE_PATH "${path}" bpath) if(IS_ABSOLUTE "${bpath}") string(FIND "${bpath}" "${CMAKE_CURRENT_BINARY_DIR}" _binary_dir_pos) if(_binary_dir_pos EQUAL 0) file(RELATIVE_PATH bpath "${CMAKE_CURRENT_BINARY_DIR}" "${bpath}") else() file(RELATIVE_PATH bpath "${CMAKE_CURRENT_SOURCE_DIR}" "${bpath}") endif() endif() # Remove leading / string(REGEX REPLACE "^[/]+" "" bpath "${bpath}") # Avoid absolute paths by removing ':' string(REPLACE ":" "_" bpath "${bpath}") # Avoid relative paths that go up the tree string(REPLACE "../" "__/" bpath "${bpath}") # Avoid spaces string(REPLACE " " "_" bpath "${bpath}") # Strip off the filename get_filename_component(bpath "${bpath}" PATH) set(${build_path} "${bpath}" PARENT_SCOPE) endfunction() ############################################################################### # MACRO: Parse OPTIONS from ARGN & set variables prefixed by _option_prefix ############################################################################### macro(HIP_PARSE_HIPCC_OPTIONS _option_prefix) set(_hip_found_config) foreach(arg ${ARGN}) # Determine if we are dealing with a per-configuration flag foreach(config ${_hip_configuration_types}) string(TOUPPER ${config} config_upper) if(arg STREQUAL "${config_upper}") set(_hip_found_config _${arg}) # Clear arg to prevent it from being processed anymore set(arg) endif() endforeach() if(arg) list(APPEND ${_option_prefix}${_hip_found_config} "${arg}") endif() endforeach() endmacro() ############################################################################### # MACRO: Try and include dependency file if it exists ############################################################################### macro(HIP_INCLUDE_HIPCC_DEPENDENCIES dependency_file) set(HIP_HIPCC_DEPEND) set(HIP_HIPCC_DEPEND_REGENERATE FALSE) # Create the dependency file if it doesn't exist if(NOT EXISTS ${dependency_file}) file(WRITE ${dependency_file} "# Generated by: FindHIP.cmake. Do not edit.\n") endif() # Include the dependency file include(${dependency_file}) # Verify the existence of all the included files if(HIP_HIPCC_DEPEND) foreach(f ${HIP_HIPCC_DEPEND}) if(NOT EXISTS ${f}) # If they aren't there, regenerate the file again set(HIP_HIPCC_DEPEND_REGENERATE TRUE) endif() endforeach() else() # No dependencies, so regenerate the file set(HIP_HIPCC_DEPEND_REGENERATE TRUE) endif() # Regenerate the dependency file if needed if(HIP_HIPCC_DEPEND_REGENERATE) set(HIP_HIPCC_DEPEND ${dependency_file}) file(WRITE ${dependency_file} "# Generated by: FindHIP.cmake. Do not edit.\n") endif() endmacro() ############################################################################### # MACRO: Prepare cmake commands for the target ############################################################################### macro(HIP_PREPARE_TARGET_COMMANDS _target _format _generated_files _source_files) set(_hip_flags "") string(TOUPPER "${CMAKE_BUILD_TYPE}" _hip_build_configuration) if(HIP_HOST_COMPILATION_CPP) set(HIP_C_OR_CXX CXX) else() set(HIP_C_OR_CXX C) endif() set(generated_extension ${CMAKE_${HIP_C_OR_CXX}_OUTPUT_EXTENSION}) # Initialize list of includes with those specified by the user. Append with # ones specified to cmake directly. set(HIP_HIPCC_INCLUDE_ARGS ${HIP_HIPCC_INCLUDE_ARGS_USER}) # Add the include directories set(include_directories_generator "$") list(APPEND HIP_HIPCC_INCLUDE_ARGS "$<$:-I$>") get_directory_property(_hip_include_directories INCLUDE_DIRECTORIES) list(REMOVE_DUPLICATES _hip_include_directories) if(_hip_include_directories) foreach(dir ${_hip_include_directories}) list(APPEND HIP_HIPCC_INCLUDE_ARGS $<$:-I${dir}>) endforeach() endif() HIP_GET_SOURCES_AND_OPTIONS(_hip_sources _hip_cmake_options _hipcc_options _clang_options _nvcc_options ${ARGN}) HIP_PARSE_HIPCC_OPTIONS(HIP_HIPCC_FLAGS ${_hipcc_options}) HIP_PARSE_HIPCC_OPTIONS(HIP_CLANG_FLAGS ${_clang_options}) HIP_PARSE_HIPCC_OPTIONS(HIP_NVCC_FLAGS ${_nvcc_options}) # Add the compile definitions set(compile_definition_generator "$") list(APPEND HIP_HIPCC_FLAGS "$<$:-D$>") # Check if we are building shared library. set(_hip_build_shared_libs FALSE) list(FIND _hip_cmake_options SHARED _hip_found_SHARED) list(FIND _hip_cmake_options MODULE _hip_found_MODULE) if(_hip_found_SHARED GREATER -1 OR _hip_found_MODULE GREATER -1) set(_hip_build_shared_libs TRUE) endif() list(FIND _hip_cmake_options STATIC _hip_found_STATIC) if(_hip_found_STATIC GREATER -1) set(_hip_build_shared_libs FALSE) endif() # If we are building a shared library, add extra flags to HIP_HIPCC_FLAGS if(_hip_build_shared_libs) list(APPEND HIP_CLANG_FLAGS "-fPIC") list(APPEND HIP_NVCC_FLAGS "--shared -Xcompiler '-fPIC'") endif() # Set host compiler set(HIP_HOST_COMPILER "${CMAKE_${HIP_C_OR_CXX}_COMPILER}") # Set compiler flags set(_HIP_HOST_FLAGS "set(CMAKE_HOST_FLAGS ${CMAKE_${HIP_C_OR_CXX}_FLAGS})") set(_HIP_HIPCC_FLAGS "set(HIP_HIPCC_FLAGS ${HIP_HIPCC_FLAGS})") set(_HIP_CLANG_FLAGS "set(HIP_CLANG_FLAGS ${HIP_CLANG_FLAGS})") set(_HIP_NVCC_FLAGS "set(HIP_NVCC_FLAGS ${HIP_NVCC_FLAGS})") foreach(config ${_hip_configuration_types}) string(TOUPPER ${config} config_upper) set(_HIP_HOST_FLAGS "${_HIP_HOST_FLAGS}\nset(CMAKE_HOST_FLAGS_${config_upper} ${CMAKE_${HIP_C_OR_CXX}_FLAGS_${config_upper}})") set(_HIP_HIPCC_FLAGS "${_HIP_HIPCC_FLAGS}\nset(HIP_HIPCC_FLAGS_${config_upper} ${HIP_HIPCC_FLAGS_${config_upper}})") set(_HIP_CLANG_FLAGS "${_HIP_CLANG_FLAGS}\nset(HIP_CLANG_FLAGS_${config_upper} ${HIP_CLANG_FLAGS_${config_upper}})") set(_HIP_NVCC_FLAGS "${_HIP_NVCC_FLAGS}\nset(HIP_NVCC_FLAGS_${config_upper} ${HIP_NVCC_FLAGS_${config_upper}})") endforeach() # Reset the output variable set(_hip_generated_files "") set(_hip_source_files "") # Iterate over all arguments and create custom commands for all source files foreach(file ${ARGN}) # Ignore any file marked as a HEADER_FILE_ONLY get_source_file_property(_is_header ${file} HEADER_FILE_ONLY) # Allow per source file overrides of the format. Also allows compiling non .cu files. get_source_file_property(_hip_source_format ${file} HIP_SOURCE_PROPERTY_FORMAT) if((${file} MATCHES "\\.cu$" OR _hip_source_format) AND NOT _is_header) set(host_flag FALSE) else() set(host_flag TRUE) endif() if(NOT host_flag) # Determine output directory HIP_COMPUTE_BUILD_PATH("${file}" hip_build_path) set(hip_compile_output_dir "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${_target}.dir/${hip_build_path}") get_filename_component(basename ${file} NAME) set(generated_file_path "${hip_compile_output_dir}/${CMAKE_CFG_INTDIR}") set(generated_file_basename "${_target}_generated_${basename}${generated_extension}") # Set file names set(generated_file "${generated_file_path}/${generated_file_basename}") set(cmake_dependency_file "${hip_compile_output_dir}/${generated_file_basename}.depend") set(custom_target_script_pregen "${hip_compile_output_dir}/${generated_file_basename}.cmake.pre-gen") set(custom_target_script "${hip_compile_output_dir}/${generated_file_basename}.cmake") # Set properties for object files set_source_files_properties("${generated_file}" PROPERTIES EXTERNAL_OBJECT true # This is an object file not to be compiled, but only be linked ) # Don't add CMAKE_CURRENT_SOURCE_DIR if the path is already an absolute path get_filename_component(file_path "${file}" PATH) if(IS_ABSOLUTE "${file_path}") set(source_file "${file}") else() set(source_file "${CMAKE_CURRENT_SOURCE_DIR}/${file}") endif() # Bring in the dependencies HIP_INCLUDE_HIPCC_DEPENDENCIES(${cmake_dependency_file}) # Configure the build script configure_file("${HIP_run_hipcc}" "${custom_target_script_pregen}" @ONLY) file(GENERATE OUTPUT "${custom_target_script}" INPUT "${custom_target_script_pregen}" ) set(main_dep DEPENDS ${source_file}) if(CMAKE_GENERATOR MATCHES "Makefiles") set(verbose_output "$(VERBOSE)") elseif(HIP_VERBOSE_BUILD) set(verbose_output ON) else() set(verbose_output OFF) endif() # Create up the comment string file(RELATIVE_PATH generated_file_relative_path "${CMAKE_BINARY_DIR}" "${generated_file}") set(hip_build_comment_string "Building HIPCC object ${generated_file_relative_path}") # Build the generated file and dependency file add_custom_command( OUTPUT ${generated_file} # These output files depend on the source_file and the contents of cmake_dependency_file ${main_dep} DEPENDS ${HIP_HIPCC_DEPEND} DEPENDS ${custom_target_script} # Make sure the output directory exists before trying to write to it. COMMAND ${CMAKE_COMMAND} -E make_directory "${generated_file_path}" COMMAND ${CMAKE_COMMAND} ARGS -D verbose:BOOL=${verbose_output} -D build_configuration:STRING=${_hip_build_configuration} -D "generated_file:STRING=${generated_file}" -P "${custom_target_script}" WORKING_DIRECTORY "${hip_compile_output_dir}" COMMENT "${hip_build_comment_string}" ) # Make sure the build system knows the file is generated set_source_files_properties(${generated_file} PROPERTIES GENERATED TRUE) list(APPEND _hip_generated_files ${generated_file}) list(APPEND _hip_source_files ${file}) endif() endforeach() # Set the return parameter set(${_generated_files} ${_hip_generated_files}) set(${_source_files} ${_hip_source_files}) endmacro() ############################################################################### # HIP_ADD_EXECUTABLE ############################################################################### macro(HIP_ADD_EXECUTABLE hip_target) # Separate the sources from the options HIP_GET_SOURCES_AND_OPTIONS(_sources _cmake_options _hipcc_options _clang_options _nvcc_options ${ARGN}) HIP_PREPARE_TARGET_COMMANDS(${hip_target} OBJ _generated_files _source_files ${_sources} HIPCC_OPTIONS ${_hipcc_options} CLANG_OPTIONS ${_clang_options} NVCC_OPTIONS ${_nvcc_options}) if(_source_files) list(REMOVE_ITEM _sources ${_source_files}) endif() if("${HIP_COMPILER}" STREQUAL "clang") if("x${HIP_CLANG_PATH}" STREQUAL "x") # IF HIP_CLANG_INSTALL_DIR is Found if( HIP_CLANG_INSTALL_DIR ) set(HIP_CLANG_PATH ${HIP_CLANG_INSTALL_DIR}) else() # IF HIP_CLANG_INSTALL_DIR is not found if(DEFINED ENV{HIP_CLANG_PATH}) set(HIP_CLANG_PATH $ENV{HIP_CLANG_PATH}) elseif(DEFINED ENV{ROCM_PATH}) set(HIP_CLANG_PATH "$ENV{ROCM_PATH}/llvm/bin") elseif(DEFINED ENV{HIP_PATH}) if(EXISTS "$ENV{HIP_PATH}/llvm/bin") #file reorg backward compatibility set(HIP_CLANG_PATH "$ENV{HIP_PATH}/llvm/bin") else() set(HIP_CLANG_PATH "$ENV{HIP_PATH}/../llvm/bin") endif() elseif(DEFINED HIP_PATH) if(EXISTS "${HIP_PATH}/llvm/bin") #file reorg backward compatibility set(HIP_CLANG_PATH "${HIP_PATH}/llvm/bin") else() set(HIP_CLANG_PATH "${HIP_PATH}/../llvm/bin") endif() # Handle the case where ROCM_PATH is defined and not set in ENV elseif(DEFINED ROCM_PATH) set(HIP_CLANG_PATH "${ROCM_PATH}/llvm/bin") else() message(FATAL_ERROR "Unable to find the clang compiler path. Set ROCM_PATH or HIP_PATH in env") endif() endif() # HIP_CLANG_INSTALL_DIR Check endif() set(CMAKE_HIP_LINK_EXECUTABLE "${HIP_HIPCC_CMAKE_LINKER_HELPER} ${HIP_CLANG_PATH} ${HIP_CLANG_PARALLEL_BUILD_LINK_OPTIONS} -o ") else() set(CMAKE_HIP_LINK_EXECUTABLE "${HIP_HIPCC_CMAKE_LINKER_HELPER} -o ") endif() if ("${_sources}" STREQUAL "") add_executable(${hip_target} ${_cmake_options} ${_generated_files} "") else() add_executable(${hip_target} ${_cmake_options} ${_generated_files} ${_sources}) endif() #LINK_OPTIONS if("${HIP_COMPILER}" STREQUAL "nvcc") # Some arch flags need be sent to linker. _nvcc_options mixes compiling and linker flags. string(REPLACE ";" " " _nvcc_flags "${_nvcc_options}") # Replace ',' with space if(NOT "x${_nvcc_flags}" STREQUAL "x") set_target_properties(${hip_target} PROPERTIES LINK_FLAGS "${_nvcc_flags}") endif() endif() set_target_properties(${hip_target} PROPERTIES LINKER_LANGUAGE HIP) # Link with host if (HIP_HOST_INTERFACE) # hip rt should be rocclr, compiler should be clang target_link_libraries(${hip_target} ${HIP_HOST_INTERFACE}) endif() endmacro() ############################################################################### # HIP_ADD_LIBRARY ############################################################################### macro(HIP_ADD_LIBRARY hip_target) # Separate the sources from the options HIP_GET_SOURCES_AND_OPTIONS(_sources _cmake_options _hipcc_options _clang_options _nvcc_options ${ARGN}) HIP_PREPARE_TARGET_COMMANDS(${hip_target} OBJ _generated_files _source_files ${_sources} ${_cmake_options} HIPCC_OPTIONS ${_hipcc_options} CLANG_OPTIONS ${_clang_options} NVCC_OPTIONS ${_nvcc_options}) if(_source_files) list(REMOVE_ITEM _sources ${_source_files}) endif() if ("${_sources}" STREQUAL "") add_library(${hip_target} ${_cmake_options} ${_generated_files} "") else() add_library(${hip_target} ${_cmake_options} ${_generated_files} ${_sources}) endif() set_target_properties(${hip_target} PROPERTIES LINKER_LANGUAGE ${HIP_C_OR_CXX}) # Link with host if (HIP_HOST_INTERFACE) # hip rt should be rocclr, compiler should be clang target_link_libraries(${hip_target} ${HIP_HOST_INTERFACE}) endif() endmacro() # vim: ts=4:sw=4:expandtab:smartindent hip-rocm-6.4.3/cmake/FindHIP/000077500000000000000000000000001503277241100155455ustar00rootroot00000000000000hip-rocm-6.4.3/cmake/FindHIP/run_hipcc.cmake000066400000000000000000000170341503277241100205260ustar00rootroot00000000000000# Copyright (c) 2016 - 2021 Advanced Micro Devices, Inc. All Rights Reserved. # # 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. ############################################################################### # Runs commands using HIPCC ############################################################################### ############################################################################### # This file runs the hipcc commands to produce the desired output file # along with the dependency file needed by CMake to compute dependencies. # # Input variables: # # verbose:BOOL=<> OFF: Be as quiet as possible (default) # ON : Describe each step # build_configuration:STRING=<> Build configuration. Defaults to Debug. # generated_file:STRING=<> File to generate. Mandatory argument. if(NOT build_configuration) set(build_configuration Debug) endif() if(NOT generated_file) message(FATAL_ERROR "You must specify generated_file on the command line") endif() # Set these up as variables to make reading the generated file easier set(HIP_HIPCC_EXECUTABLE "@HIP_HIPCC_EXECUTABLE@") # path set(HIP_HIPCONFIG_EXECUTABLE "@HIP_HIPCONFIG_EXECUTABLE@") #path set(HIP_HOST_COMPILER "@HIP_HOST_COMPILER@") # path set(CMAKE_COMMAND "@CMAKE_COMMAND@") # path set(HIP_run_make2cmake "@HIP_run_make2cmake@") # path set(HIP_CLANG_PATH "@HIP_CLANG_PATH@") #path set(HIP_CLANG_PARALLEL_BUILD_COMPILE_OPTIONS "@HIP_CLANG_PARALLEL_BUILD_COMPILE_OPTIONS@") @HIP_HOST_FLAGS@ @_HIP_HIPCC_FLAGS@ @_HIP_CLANG_FLAGS@ @_HIP_NVCC_FLAGS@ #Needed to bring the HIP_HIPCC_INCLUDE_ARGS variable in scope set(HIP_HIPCC_INCLUDE_ARGS @HIP_HIPCC_INCLUDE_ARGS@) # list set(cmake_dependency_file "@cmake_dependency_file@") # path set(source_file "@source_file@") # path set(host_flag "@host_flag@") # bool # Determine compiler and compiler flags execute_process(COMMAND ${HIP_HIPCONFIG_EXECUTABLE} --platform OUTPUT_VARIABLE HIP_PLATFORM OUTPUT_STRIP_TRAILING_WHITESPACE) execute_process(COMMAND ${HIP_HIPCONFIG_EXECUTABLE} --compiler OUTPUT_VARIABLE HIP_COMPILER OUTPUT_STRIP_TRAILING_WHITESPACE) execute_process(COMMAND ${HIP_HIPCONFIG_EXECUTABLE} --runtime OUTPUT_VARIABLE HIP_RUNTIME OUTPUT_STRIP_TRAILING_WHITESPACE) if(NOT host_flag) set(__CC ${HIP_HIPCC_EXECUTABLE}) if("${HIP_PLATFORM}" STREQUAL "amd") if("${HIP_COMPILER}" STREQUAL "clang") if(NOT "x${HIP_CLANG_PATH}" STREQUAL "x") set(ENV{HIP_CLANG_PATH} ${HIP_CLANG_PATH}) endif() set(__CC_FLAGS ${HIP_CLANG_PARALLEL_BUILD_COMPILE_OPTIONS} ${HIP_HIPCC_FLAGS} ${HIP_CLANG_FLAGS} ${HIP_HIPCC_FLAGS_${build_configuration}} ${HIP_CLANG_FLAGS_${build_configuration}}) endif() else() set(__CC_FLAGS ${HIP_HIPCC_FLAGS} ${HIP_NVCC_FLAGS} ${HIP_HIPCC_FLAGS_${build_configuration}} ${HIP_NVCC_FLAGS_${build_configuration}}) endif() else() set(__CC ${HIP_HOST_COMPILER}) set(__CC_FLAGS ${CMAKE_HOST_FLAGS} ${CMAKE_HOST_FLAGS_${build_configuration}}) endif() set(__CC_INCLUDES ${HIP_HIPCC_INCLUDE_ARGS}) # hip_execute_process - Executes a command with optional command echo and status message. # status - Status message to print if verbose is true # command - COMMAND argument from the usual execute_process argument structure # ARGN - Remaining arguments are the command with arguments # HIP_result - Return value from running the command macro(hip_execute_process status command) set(_command ${command}) if(NOT "x${_command}" STREQUAL "xCOMMAND") message(FATAL_ERROR "Malformed call to hip_execute_process. Missing COMMAND as second argument. (command = ${command})") endif() if(verbose) execute_process(COMMAND "${CMAKE_COMMAND}" -E echo -- ${status}) # Build command string to print set(hip_execute_process_string) foreach(arg ${ARGN}) # Escape quotes if any string(REPLACE "\"" "\\\"" arg ${arg}) # Surround args with spaces with quotes if(arg MATCHES " ") list(APPEND hip_execute_process_string "\"${arg}\"") else() list(APPEND hip_execute_process_string ${arg}) endif() endforeach() # Echo the command execute_process(COMMAND ${CMAKE_COMMAND} -E echo ${hip_execute_process_string}) endif() # Run the command execute_process(COMMAND ${ARGN} RESULT_VARIABLE HIP_result) endmacro() # Delete the target file hip_execute_process( "Removing ${generated_file}" COMMAND "${CMAKE_COMMAND}" -E remove "${generated_file}" ) # Generate the dependency file hip_execute_process( "Generating dependency file: ${cmake_dependency_file}.pre" COMMAND "${__CC}" -M "${source_file}" -o "${cmake_dependency_file}.pre" ${__CC_FLAGS} ${__CC_INCLUDES} ) if(HIP_result) message(FATAL_ERROR "Error generating ${generated_file}") endif() # Generate the cmake readable dependency file to a temp file hip_execute_process( "Generating temporary cmake readable file: ${cmake_dependency_file}.tmp" COMMAND "${CMAKE_COMMAND}" -D "input_file:FILEPATH=${cmake_dependency_file}.pre" -D "output_file:FILEPATH=${cmake_dependency_file}.tmp" -D "verbose=${verbose}" -P "${HIP_run_make2cmake}" ) if(HIP_result) message(FATAL_ERROR "Error generating ${generated_file}") endif() # Copy the file if it is different hip_execute_process( "Copy if different ${cmake_dependency_file}.tmp to ${cmake_dependency_file}" COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${cmake_dependency_file}.tmp" "${cmake_dependency_file}" ) if(HIP_result) message(FATAL_ERROR "Error generating ${generated_file}") endif() # Delete the temporary file hip_execute_process( "Removing ${cmake_dependency_file}.tmp and ${cmake_dependency_file}.pre" COMMAND "${CMAKE_COMMAND}" -E remove "${cmake_dependency_file}.tmp" "${cmake_dependency_file}.pre" ) if(HIP_result) message(FATAL_ERROR "Error generating ${generated_file}") endif() # Generate the output file hip_execute_process( "Generating ${generated_file}" COMMAND "${__CC}" -c "${source_file}" -o "${generated_file}" ${__CC_FLAGS} ${__CC_INCLUDES} ) if(HIP_result) # Make sure that we delete the output file hip_execute_process( "Removing ${generated_file}" COMMAND "${CMAKE_COMMAND}" -E remove "${generated_file}" ) message(FATAL_ERROR "Error generating file ${generated_file}") else() if(verbose) message("Generated ${generated_file} successfully.") endif() endif() # vim: ts=4:sw=4:expandtab:smartindent hip-rocm-6.4.3/cmake/FindHIP/run_make2cmake.cmake000066400000000000000000000055741503277241100214460ustar00rootroot00000000000000# Copyright (c) 2016 - 2021 Advanced Micro Devices, Inc. All Rights Reserved. # # 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. ############################################################################### # Computes dependencies using HIPCC ############################################################################### ############################################################################### # This file converts dependency files generated using hipcc to a format that # cmake can understand. # Input variables: # # input_file:STRING=<> Dependency file to parse. Required argument # output_file:STRING=<> Output file to generate. Required argument if(NOT input_file OR NOT output_file) message(FATAL_ERROR "You must specify input_file and output_file on the command line") endif() file(READ ${input_file} depend_text) if (NOT "${depend_text}" STREQUAL "") string(REPLACE " /" "\n/" depend_text ${depend_text}) string(REGEX REPLACE "^.*:" "" depend_text ${depend_text}) string(REGEX REPLACE "[ \\\\]*\n" ";" depend_text ${depend_text}) set(dependency_list "") foreach(file ${depend_text}) string(REGEX REPLACE "^ +" "" file ${file}) if(NOT EXISTS "${file}") message(WARNING " Removing non-existent dependency file: ${file}") set(file "") endif() if(NOT IS_DIRECTORY "${file}") get_filename_component(file_absolute "${file}" ABSOLUTE) list(APPEND dependency_list "${file_absolute}") endif() endforeach() endif() # Remove the duplicate entries and sort them. list(REMOVE_DUPLICATES dependency_list) list(SORT dependency_list) foreach(file ${dependency_list}) set(hip_hipcc_depend "${hip_hipcc_depend} \"${file}\"\n") endforeach() file(WRITE ${output_file} "# Generated by: FindHIP.cmake. Do not edit.\nSET(HIP_HIPCC_DEPEND\n ${hip_hipcc_depend})\n\n") # vim: ts=4:sw=4:expandtab:smartindent hip-rocm-6.4.3/configure000066400000000000000000000000001503277241100151360ustar00rootroot00000000000000hip-rocm-6.4.3/docker/000077500000000000000000000000001503277241100145135ustar00rootroot00000000000000hip-rocm-6.4.3/docker/dockerfile-build-ubuntu-16.04000066400000000000000000000031751503277241100216360ustar00rootroot00000000000000# Copyright (c) 2017 - 2021 Advanced Micro Devices, Inc. All Rights Reserved. # # 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. # Parameters related to building hip ARG base_image FROM ${base_image} MAINTAINER Maneesh Gupta ARG user_uid # docker pipeline runs containers with particular uid # create a jenkins user with this specific uid so it can use sudo priviledges # Grant any member of sudo group password-less sudo privileges RUN useradd --create-home -u ${user_uid} -G sudo,video --shell /bin/bash jenkins && \ mkdir -p /etc/sudoers.d/ && \ echo '%sudo ALL=(ALL) NOPASSWD:ALL' | tee /etc/sudoers.d/sudo-nopasswd hip-rocm-6.4.3/docker/dockerfile-hip-ubuntu-16.04000066400000000000000000000033521503277241100213140ustar00rootroot00000000000000# Copyright (c) 2017 - 2021 Advanced Micro Devices, Inc. All Rights Reserved. # # 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. # Parameters related to building hip ARG base_image FROM ${base_image} MAINTAINER Kent Knox # Copy the debian package of hip into the container from host COPY *.deb /tmp/ # Install the debian package RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends -y curl \ && apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends --allow-unauthenticated -y \ /tmp/hip-devel-*.deb \ /tmp/hip-runtime-amd-*.deb \ /tmp/hip-doc-*.deb \ /tmp/hip-samples-* \ && rm -f /tmp/*.deb \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* hip-rocm-6.4.3/docs/000077500000000000000000000000001503277241100141745ustar00rootroot00000000000000hip-rocm-6.4.3/docs/.gitignore000066400000000000000000000001341503277241100161620ustar00rootroot00000000000000/_build /_doxygen /_images /_static /_templates /doxygen/html /doxygen/xml /sphinx/_toc.yml hip-rocm-6.4.3/docs/conf.py000066400000000000000000000027241503277241100155000ustar00rootroot00000000000000# 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 import re from typing import Any, Dict, List from rocm_docs import ROCmDocs version_numbers = [] version_file = open("../VERSION", "r") lines = version_file.readlines() for line in lines: if line[0] == '#': continue version_numbers.append(line.strip()) version_number = ".".join(version_numbers) left_nav_title = f"HIP {version_number} Documentation" # for PDF output on Read the Docs project = "HIP Documentation" author = "Advanced Micro Devices, Inc." copyright = "Copyright (c) 2023 Advanced Micro Devices, Inc. All rights reserved." version = version_number release = version_number external_toc_path = "./sphinx/_toc.yml" docs_core = ROCmDocs(left_nav_title) docs_core.run_doxygen(doxygen_root="doxygen", doxygen_path="doxygen/xml") docs_core.enable_api_reference() docs_core.setup() external_projects_current_project = "hip" for sphinx_var in ROCmDocs.SPHINX_VARS: globals()[sphinx_var] = getattr(docs_core, sphinx_var) extensions += ["sphinxcontrib.doxylink"] cpp_id_attributes = ["__global__", "__device__", "__host__", "__forceinline__", "static"] cpp_paren_attributes = ["__declspec"] suppress_warnings = ["etoc.toctree"] numfig = False exclude_patterns = [ "doxygen/mainpage.md", "understand/glossary.md" ]hip-rocm-6.4.3/docs/data/000077500000000000000000000000001503277241100151055ustar00rootroot00000000000000hip-rocm-6.4.3/docs/data/how-to/000077500000000000000000000000001503277241100163225ustar00rootroot00000000000000hip-rocm-6.4.3/docs/data/how-to/cooperative_groups/000077500000000000000000000000001503277241100222415ustar00rootroot00000000000000hip-rocm-6.4.3/docs/data/how-to/cooperative_groups/thread_hierarchy_coop_bottom.drawio000066400000000000000000002140721503277241100313670ustar00rootroot00000000000000 hip-rocm-6.4.3/docs/data/how-to/cooperative_groups/thread_hierarchy_coop_bottom.svg000066400000000000000000002002421503277241100306730ustar00rootroot00000000000000Block
Thread-block tile
Thread-block tile
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Thread-block tile
Thread-block tile
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Block
Coalesced group
Coalesced group
Warp
Warp
Warp
Warp
Warp
Warp
Coalesced group
Coalesced group
Warp
Warp
Warp
Warp
Warp
Warp
Grid
Text is not SVG - cannot display
hip-rocm-6.4.3/docs/data/how-to/cooperative_groups/thread_hierarchy_coop_top.drawio000066400000000000000000014261631503277241100306740ustar00rootroot00000000000000 hip-rocm-6.4.3/docs/data/how-to/cooperative_groups/thread_hierarchy_coop_top.svg000066400000000000000000011472241503277241100302040ustar00rootroot00000000000000Grid
Block
Block
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Block
Block
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Block
Block
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Block
Block
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Block
Block
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Block
Block
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
GridMulti Grid
Block
Block
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Text is not SVG - cannot display
hip-rocm-6.4.3/docs/data/how-to/hipgraph/000077500000000000000000000000001503277241100201245ustar00rootroot00000000000000hip-rocm-6.4.3/docs/data/how-to/hipgraph/hip_graph.drawio000066400000000000000000000172041503277241100233000ustar00rootroot00000000000000 hip-rocm-6.4.3/docs/data/how-to/hipgraph/hip_graph.svg000066400000000000000000000614671503277241100226240ustar00rootroot00000000000000 Stream 1
Kernel B
Kernel B
Stream 2
Kernel A
Kernel A
hipDeviceSynchronize
hipDeviceSynchronize
Kernel C
Kernel C
hipDeviceSynchronize
hipDeviceSynchronize
Kernel D
Kernel D
Kernel A
Kernel A
Kernel B
Kernel B
Kernel C
Kernel C
Kernel D
Kernel D
Text is not SVG - cannot display
hip-rocm-6.4.3/docs/data/how-to/hipgraph/hip_graph_speedup.drawio000066400000000000000000000333661503277241100250340ustar00rootroot00000000000000 hip-rocm-6.4.3/docs/data/how-to/hipgraph/hip_graph_speedup.svg000066400000000000000000006261621503277241100243500ustar00rootroot00000000000000 Streams
kernel A
kernel launch A
kernel B
kernel C
kernel launch B
kernel launch C
host activity
device activity
time
kernel launch D
kernel D
device idling due to kernel launch congestion
kernel A
kernel B
kernel C
graph launch
host activity
device activity
kernel D
Graph
speedup
hip-rocm-6.4.3/docs/data/tutorial/000077500000000000000000000000001503277241100167505ustar00rootroot00000000000000hip-rocm-6.4.3/docs/data/tutorial/reduction/000077500000000000000000000000001503277241100207445ustar00rootroot00000000000000hip-rocm-6.4.3/docs/data/tutorial/reduction/conflict_free_reduction.drawio000066400000000000000000001234161503277241100270400ustar00rootroot00000000000000 hip-rocm-6.4.3/docs/data/tutorial/reduction/conflict_free_reduction.svg000066400000000000000000001724461503277241100263610ustar00rootroot00000000000000Bank conflict free reduction
Shared
Shared
5
5
13
13
0
0
8
8
2
2
1
1
7
7
42
42
2
2
23
23
10
10
3
3
Shared
Shared
7
7
42
42
23
23
10
10
7
7
42
42
23
23
10
10
0
0
1
1
Shared
Shared
23
23
42
42
23
23
10
10
7
7
42
42
23
23
10
10
0
0
Shared
Shared
42
42
42
42
23
23
10
10
7
7
42
42
23
23
10
10
Thread IDs
Thread...
Data snapshot
Data sn...
Thread IDs
Thread...
Data snapshot
Data sn...
Thread IDs
Thread...
Data snapshot
Data sn...
Data snapshot
Data sn...
Text is not SVG - cannot display
hip-rocm-6.4.3/docs/data/tutorial/reduction/foldl.drawio000066400000000000000000000326361503277241100232650ustar00rootroot00000000000000 hip-rocm-6.4.3/docs/data/tutorial/reduction/foldl.svg000066400000000000000000000477051503277241100226020ustar00rootroot00000000000000Fold-left
Input
Input
8
8
13
13
5
5
z
z
5
5
f(z,5)
f(z,5)
5
5
13
13
f(f(z,5),13)
f(f(z,5...
13
13
8
8
f(f(f(z,5),13),8)
f(f(f(z...
Result
Result
13
13
Text is not SVG - cannot display
hip-rocm-6.4.3/docs/data/tutorial/reduction/naive_reduction.drawio000066400000000000000000001230001503277241100253250ustar00rootroot00000000000000 hip-rocm-6.4.3/docs/data/tutorial/reduction/naive_reduction.svg000066400000000000000000001721411503277241100246510ustar00rootroot00000000000000Naive Shared Reduction
Shared
Shared
5
5
13
13
0
0
8
8
2
2
2
2
7
7
42
42
4
4
23
23
10
10
6
6
Shared
Shared
13
13
13
13
0
0
8
8
2
2
42
42
42
42
4
4
23
23
10
10
Shared
Shared
13
13
13
13
0
0
8
8
2
2
42
42
42
42
23
23
10
10
Shared
Shared
42
42
13
13
8
8
2
2
42
42
42
42
23
23
10
10
Thread IDs
Thread...
Data snapshot
Data sn...
Thread IDs
Thread...
Data snapshot
Data sn...
Thread IDs
Thread...
Data snapshot
Data sn...
Data snapshot
Data sn...
Text is not SVG - cannot display
hip-rocm-6.4.3/docs/data/tutorial/reduction/parallel_foldl.drawio000066400000000000000000000327171503277241100251410ustar00rootroot00000000000000 hip-rocm-6.4.3/docs/data/tutorial/reduction/parallel_foldl.svg000066400000000000000000000477221503277241100244550ustar00rootroot00000000000000Parallel Reduce
Input
Input
8
8
13
13
5
5
z
z
5
5
f(z,5)
f(z,5)
13
13
8
8
f(13,8)
f(13,8)
5
5
13
13
f(f(z,5),f(13,8))
f(f(z,5...
Result
Result
13
13
Text is not SVG - cannot display
hip-rocm-6.4.3/docs/data/tutorial/reduction/reduced_divergence_reduction.drawio000066400000000000000000001230161503277241100300400ustar00rootroot00000000000000 hip-rocm-6.4.3/docs/data/tutorial/reduction/reduced_divergence_reduction.svg000066400000000000000000001720271503277241100273600ustar00rootroot00000000000000Reduced Divergence Reduction
Shared
Shared
5
5
13
13
0
0
8
8
2
2
1
1
7
7
42
42
2
2
23
23
10
10
3
3
Shared
Shared
13
13
13
13
0
0
8
8
2
2
42
42
42
42
1
1
23
23
10
10
Shared
Shared
13
13
13
13
0
0
8
8
2
2
42
42
42
42
23
23
10
10
Shared
Shared
42
42
13
13
8
8
2
2
42
42
42
42
23
23
10
10
Thread IDs
Thread...
Data snapshot
Data sn...
Thread IDs
Thread...
Data snapshot
Data sn...
Thread IDs
Thread...
Data snapshot
Data sn...
Data snapshot
Data sn...
Text is not SVG - cannot display
hip-rocm-6.4.3/docs/data/tutorial/reduction/warp_reduction.drawio000066400000000000000000001201541503277241100252030ustar00rootroot00000000000000 hip-rocm-6.4.3/docs/data/tutorial/reduction/warp_reduction.svg000066400000000000000000001705431503277241100245240ustar00rootroot00000000000000Warp reduction
Local
Local
5
5
13
13
0
0
8
8
2
2
1
1
7
7
42
42
2
2
23
23
10
10
3
3
Local
Local
7
7
42
42
23
23
10
10
7
7
42
42
23
23
10
10
0
0
1
1
Local
Local
23
23
42
42
23
23
10
10
7
7
42
42
23
23
10
10
0
0
Local
Local
42
42
42
42
23
23
10
10
7
7
42
42
23
23
10
10
Thread IDs
Thread...
Data snapshot
Data sn...
Thread IDs
Thread...
Data snapshot
Data sn...
Thread IDs
Thread...
Data snapshot
Data sn...
Data snapshot
Data sn...
Text is not SVG - cannot display
hip-rocm-6.4.3/docs/data/tutorial/reduction/warp_reduction_with_shared.drawio000066400000000000000000002074121503277241100275670ustar00rootroot00000000000000 hip-rocm-6.4.3/docs/data/tutorial/reduction/warp_reduction_with_shared.svg000066400000000000000000003061041503277241100270770ustar00rootroot00000000000000Warp reduction
Local
Local
5
5
13
13
8
8
2
2
7
7
42
42
23
23
10
10
7
7
42
42
23
23
10
10
7
7
42
42
23
23
10
10
Local
Local
23
23
42
42
23
23
10
10
7
7
42
42
23
23
10
10
Local
Local
42
42
42
42
23
23
10
10
7
7
42
42
23
23
10
10
Warp reduction
Local
Local
3
3
2
2
4
4
1
1
7
7
11
11
8
8
14
14
10
10
13
13
12
12
15
15
7
7
11
11
8
8
14
14
Local
Local
22
22
28
28
12
12
15
15
7
7
11
11
8
8
14
14
Local
Local
50
50
28
28
12
12
15
15
7
7
11
11
8
8
14
14
Local
Local
92
92
50
50
Local
Local
42
42
50
50
Shared
Shared
42
42
50
50
Warp reduction with shared memory
Local
Local
Local
Local
Text is not SVG - cannot display
hip-rocm-6.4.3/docs/data/understand/000077500000000000000000000000001503277241100172545ustar00rootroot00000000000000hip-rocm-6.4.3/docs/data/understand/hardware_implementation/000077500000000000000000000000001503277241100241565ustar00rootroot00000000000000hip-rocm-6.4.3/docs/data/understand/hardware_implementation/cdna2_gcd.png000066400000000000000000002636421503277241100265050ustar00rootroot00000000000000PNG  IHDR61wsRGBgAMA a pHYsodciTXtSnipMetadata{"clipPoints":[{"x":0,"y":0},{"x":822,"y":0},{"x":822,"y":1073},{"x":0,"y":1073}]}p6IDATx^ \UE_!n(*R, .ibi IknKO>e>-*eK {* B!).;sE@M@=o=3szf93g """""2b֘vx lhMR"""""2z l1!"""""W7mZjZl -QSDDDDDDW qV4"""""2 l1!""""""""""2z l1!""""""""""2z l1!""""""""""2z l1!""""""""""2z l1!""""""""""2z l1!""""""""""2z l1!""""""""""2z l1!"""""#/[7yd/_GMUyyy233SN _DݏmX~Pe=_h;52sTZ_`u= j4iZݻg={ֹĤDܼySMݝ 83#/WSDV*7k.>!^;\WSD>歛SSJ*pnᤦ*6F lxR@K6-]1B"""""2z l1!""""""""""2z l1!""""""""""2zf՟o`x_\aƍشY%;}VāpDB)\WCJtx i2r ?Λ/6(}۾0ۢ JҎ,ܥyWN)gө@oi~[;_tį>~S3J{|>FxMT6%'S`_x䮟ϑqLޤ?ȶH)?=i#7V{x l|ͅoؠWsɺ}8&n3l6> KmWFhswc5Ўw sòmq$|2ϲ# ̞Uwz^PϢRQr5m,(!xp5~|rQMj̜O`g'50 MzT}TT¹7\XSEtֽq>_(s3~: OM&Lv٣8O 7k"HGES_7;­#иd,[<-H$W CF@êѸ8MPK~l:&^U1cP\C ȯd{Rȑ8!\ЧOO8٘+RFN,.ʫi!fc݇AkxcpﳮcospzsvW0)[Yrz^*s}UuOPeʅ(yEESh]*M&xȍÎM!Ƿn?MtcvvⳒ(Cõ~E 4^1yt=c3+y\V|]6ژ,/yhLs/lX6+o@\6Br3 B"eNb̻{p!C>m`{IKzk'vS؈X(/[ oUDUڡsa'_հj} ]F(/7z%Uɥl-ꬍh1WX 9Tk7îykpfc`)|g;všgjw y7X\;vMf~}Qhv/vzv}4l +"pPԆ-{"!#н ,t.n-{`%gYcmR[QX͚e8ztl֜=m\x#Z<U.; o;tQ_5C5ݿ7^[Z])U3Zw?Ox^|?\&-۰i4G?qN ̢v)%=ߊޜZw5ŻȠؾo &MݵcU=RA ;#^g;"#֜ع_~P_n F/{:^͝Ld@P/zS>Ĵ#ϗp-b ~<vz ,? _ЃˉKⷬ^xiNī:=V'K5+pXy)!s:Sp@Ɂ@NO-R2s:Q}>,o< / >O?`s;[.{}.P' m+~lr5c#v,wY>@;X*H]!U9 lϹ:.Bd{;W-?A1ݿw>;/\3˪GvzEd3v".߂b Bp^?? ;"6}gcCq) RS= e~ފm'#9Y9, T:PtϘqDegڷWﻗٳmbD{-x-VP`$Ytظ6X7@^+YXqV:8vX*_wf|+\lU,IZ{\{c[^_-3ܕtDT<_|BIoWW#ѓ[m3|QHP 5_~Ko,m'qX^ym̗{`E'a]/8pV׎Q=knME0DSτ)ߺ6EF5+lD{vlOEdD^+3梿lʗ [OյEɸ"ڔc{&<c2*լu(^g3h|/p""Lepk]l-Þ%uLlʰNߞdt9'#/5Ÿo7T78*h>;tl*=F>P5+sUUOɀ'& s,ivVvz*7͞8|Qxfp=D˒U5EmQa7잘E1s?GE~Gj O-un%G?MT5s d_t>)n-ȣ0+V5l!u?T<]?ܞ} [WҾ­S"vQJH݅+3MotĮn"5j\7VMO',wj[*sK;ݗR?x/KȿgTUx;zs N)=}n%+_g"~bhDW +_`okOQaJQV[H̯cb;_Zeu(;23qo  LWM.YkyEfV3NZwUa[AybNmpJd^~W@RٰDNfTg|e{ pg~ + ƤA43".+=9 WT Z"=6*Wg6UsuV}NjѸrP=F9 CqHq[ wcHI#e;6c 0{G_+-7&a_DRϱO=Ҙ4hD z/*cs2&@ ,UCCG䷟OГm+VN +c!PHOӕYZl:C6(7uzR9A'D!FSS^e<%jꨩtd(_Bff96v𺼬uc,!/uit!3bZyU0ڱXQA WDVȼThn~Qf+xc巄a7!xII^;Ϣh7rCC[4%^,|%N&%9ިXlǴZ2\ Uy6d^Y+\}wgB/4Spr",-E-]vV&ʷJ55ZJ9'Ce!vbVuHtbf9F Xz>HKNc6{?CO\v}0=rSqZC囊9xudl(m銒 [_8?qC-]^\р7 жƳf# "1? v#1rQCka\~xiIp@CGYQ]7G9_nh#G>;m\XɃaėE=:wmqn §W ~VamS?Wo  ׎v5T}ųEf1󱵘o`َiOvn7@Wof0o{kE#Ex+D~Y$ԅeY/aKgR>WѾ}NQEu;=?#usmyΫt_:e wQ n28Y;>DyvL NĈV>FLi}Yr;vY;I}xXUѼYs5uwe݆IfHxg)]<]5k>*zk?#UBws}  !Mo'ԼrqndƭtEQ Q۹qj7fh!K\a_fFƒT#o޺ظ;ASQJ8hvjdd稩B;f`S=x *Fp'u\zP;\bװ4Ct'E:|gj`S~ F-o1TTrű9}Np-nϕ+61P4n +ӹЃA p}_ j\>1r ;L'? 5q lFOus4'c)De~ˮ{ *g!X l1!""""""""""2z l1!"""""#/[7yd/_fD3ڵj{w'W&rnznݺ_2=.''7oRSD33j֨.z8wKM~HS?'߿vjdd稩B;6Cш1!""""""""""2z l1!""""""""""2z l=Ro}GBuTu= .]RSyŪ{DDDD QM歛HLLTSI~3L_5Uhb'$)ԦUkuNGQAȓxז.jt2SSI~p(=6DDDDDdc`CDDDDDF =6DDDDDdc`CDdR0h^4G՜onj70j^?YٟzDI PʏO=>== c|qGc`CDdR˸|9]M*}=;\[ۢ4HS"?'etDvF77usMUb\?D{#Mϴ븇Ȉ1!"2a+"`k0|4 / E&[H ,<㰮aVp[#L)7 =,qo~M"ظ||+3}Qߝ |8|CXxouN6Y8Fȉ7 xY6h$8k"O[vcpԬe[:[9?0!"2a+"ǰraM"PeDut#N#&?&`_Wlԫ~ݓq9j=VѻbSxZ|1\(?-Q2?*ωh 2njȶWpJq`6E!onÁ_a۹9UgN 1͉EVU+,j> c`CD~ƈ2pMkt-4muv͔ CbUy223\rt[fUZNk'ѩHip;2Үӓqa;+3ʦo˱3ywGE :^><1MH7sIJ²~B U3s*S<6?_wc`CDf0W6hձx gbon>R^^AɿǦQf\ܾdc;y)a`CDDS]a/Ol!'N.hk>pB&N,| /v]7D= l= eO刯C^晶h,'ع,v]֓wO1DDʔ l*٥w]ϽXe&""2 l5t9y~.V*}Aex/\J<Wbjl=1x$l=^w}yKt< 3#0> GM_o`^hY_Rɺ5eڴj3t l9cV0˼7¿E}KsJfU\d^ և(FUo_Q%owݓ!^ngQRMW>.A6 r>}?Oy*~};$zAwVcn!"$2Cшܘ?5? g}Qb`CDD妪cx107"""""""2z<"RAEjt>J:((iGhhTw2QMPV->,v' `_@N@tvH1)g l Ud`H+d #O(4i[% V=i d*~c(/Lp""""" @6.ۘ8Qn>tQr2H?]F!cqRMm> D~@Bx$i"UvhڵP[n6xyļotgUY5M"}ǻxg=z[GLKuQveX1gDo²e&z`{0գ lۢڶp- ow):R2)RAXJmzD\EŶ;~y͹5H)I3J-5V!?3/O=.*F6| F-{ ".g勉ȷQsBr[ɹ拰m y%@DZHή@\q\*8ithk6F X t}r$i؂#_ 9w1{ tɠҥd̚ fd`#'6!5Ki珁Mc`S&::FMVCl4i[Jؔm-.=~G`?KiE7;'{lٍ4$%%鶴zyK*qIl_RA^+K&.R21J̯_Ŷ;7&.4PdJ6F ҝNv%qLDHֶlsE`,ӿP ]Zb5M#u rv@zhH-R䗾gL-pn Wۢ?vg Hi V]ն϶-$,,*_Q# 3|ÈBܢ0ZNqt{1~Wp!*kG xu5~Vۢ5g7Xko떾eF1 ]זnz<Z֯*YO0ڴj3c5Qٿ7oDl\_vv~QNQSʣX4MzԴ@[>>='4.%)''@F:AAA>iτ ~1)g l UT`CDT lJq""""" +6PebָeW6t?CE^Sfff)9(Xlrr24ǡh匁>JZ9֝E þFa,އCZ )ȵL=-ɾ(6eM9c`c".Щ=2'~,Y|dd g4iǨQ^ l*!"""""` lT0k;\]]tP}Dz )14Tn"<׎3=r n_Ua@qX̤w>TB"oAE!gaG~[aRNq}0!ROz7`6uE?xuG*ng"%1Td2'Óu=j$"1%U!㲨UF?mx١f M!R (2 |##Tۢ,o[nvHcIG7 xh5wC'rҌSC:ú5n +|p<ݚmCsa Ԛ6mQs6`DT26DDDDDdc`CDDDDDF =6D-+bv&URAZA&Hj&έ#( 8+W0 *xwT&j?ZP}8`fֶy-5s0?ZPpx`V26DU?|0#LGuWgE9 8]؇30㾀Wԩ`Ǟeg>gom @e}?Q`5ow4r7l񶇈xȤX:F`r&msonm|F>˱<`U -c`C˄HI>ub1,AEY4;ה]ɱyI ۥ7M.61P R~=lhQ/cfw*;60:6M5PScֈ8O I^=.<5=C7ն(@D٘1Hp\g; 1X=U"b`CuzL^Y"25S끃)T/ +ة퍃ɪ^]I&ﱰSlM)IWPl:nyDDDDDT0)Meظ^/ cCDDDDTI=Ro}GBuTu= jJů{``Rjh|?ү5BUȲӦUkuNGQk֨&y&bְSrvv"-߿?|||@.hPff&ヨSkHLJT84@:w!(e~a 777WCCwۛ@d=(si}6999R [8?2U-]`ff*W##;GMة5{ǰ{b=0E(;++1PHOfYFFb.EMc`S*2Iƶ۱xoʜjri~^GgұH{26DD%8 lrVO7D3]1tht{-+6TRWذj"WR[1)gz&64te}],}&x+c٥>Ҟr;22xR5fSeEօ`89ݹ,2Ud`[):+j:_hu_Y5EZ!I?Ӥnndhl`oo٣G ?i@DNbb[`KOc1"#HS"""""Mnz#b֬۾ AdRn >lذ^?"BH"*]w"=☰ jLJv9`Cϥ# " a"/4RQ΅#$- ǹڝ y i8_b&MTŷ;Q0Q#4b衖f~o!h]=O _C3|Aܓ^mնX85Pk,ʴueA[x`hՔp]]PSnܷ/uk̊dj22pU<ԪiKfeԩjbeAWY.k-bQ氬jߊGh,=j$ޙ'vC}p6l"lԣIMQ6`)xm3HDDDDTM-EkeO ^H0)FnL|гcxޠEDDDD&Ξĉ琒ɳ0C.~ǁI9 DU.B1pOƞS0ŗO0ƹ;$b)Gг2.r 2]N^XK+X2Դ!rPViƼwB]Wlo:$=0uS`EW LMId PCa<Gc?`=-4-4y/JF۷QW $raXw=Kt/B(2ΘgujzԢfGeq.\'81LU98gekG!^ јu8%zEs1tO&z`V u0:,i0f)QGȲ{ZVA<[8[]{# 5(W,FQQ<"?\s[{ ݒFO?iŶn?x@chy6셖먩#zTy8GĢdqG`9V6Z{ww:XF 86qT[7׷_ciE@@<Mvu@hh(,-tw5$&%* ĉW;Ы_3wޞȴ$88Gc,?%K I;???8999K;)NJ*pnNJG׭ \%޵ *ȥW##;GMة5ܩ1/QK!Q9v3 |7nX-b1!""""Ta͸RFh%6|.ARE*P4///5EZ ! nnnJ#((b(IKQV-hr8&Ce{dC`fxas{'O>E(["P46Pe l=y211-i(uPE6&3SNpLZ#rwPe#Ҧ%i65~K^zdyb`S*29iw5z⅗!j<0Y9?^&ĺqsǪ91ŞxqD>[DDDDDe!~潂M)>Xym5ƈWlcl]Yv-shhXUwdYWl|}}=9=!%my.]JVS%NN^OpH9,VgA$5{l2v zqvslDPrVmR"qxVlؼYȵۿӑ"O"rV,#u6I;d #ǵ*iy&?!;kXulE2ukd$ܒ"%!'7i6%XW1b&a`S*2>8o*i-67w@&Uq+,Re4W tj@Ʉ~`&, t8./Y4M1j&L@`+Wq/5)dŘjp{lLHکGtヅa{?5Ҿ"""":qY1`U2zM샧ۢ`zHR nA loam <BvKŶ;UdP.Eo󘆽j)M2m>r%5L/H|q{m;h#'/#HL$&(E2!˓σu`:|5D? qYԏ?@e# նh Pv&y) _>Fϑ?mQ-dTlS\_EFw>} 7+_}FT!k#688? +C&"(/: nhZNq`(]cXz \!wwguptkEmN9!->ixjS5wkvKZaNc)۴)n tz jr6EDDDD`!57cS6Z^[e?bb 6wagۉL%:ǝ(ېb ) Rd }!$zQYe{k::pޒ0)Q&o،tvx{:Y'>1vB [[exKui}MZ;S85ġd2lfi ;ª3ar3*PٰqGl @eG# pmhjlmGR3[5G.`U00uzѺpz݁MҐvY<<훫#= :qM9LU?|0#LGuWgE9 8]؇30㾀Wԩ`Ǟeg>gom @e}?Q`5ow4r7l񶇈xȤX:F`r&msonm|F>˱<`U08V=ah]"JL:CE1):mď=6[Ci"a ;}zb^/Yf3h)w))84;Ǹ"^ذ];q|$]b3 #)v0fvgMc+щq퍬;N`$YE;5f(d~c“Yc ;D{_mBplnIY u}־㸐c\E-!p'C׉: i<Q<6%2GZ-!s{lfĭڋLQu*Edj,`e;X9Sn_f V*VS;+ÓU2LNa{sgcaeN!5gucʢt'60w[aF6n x ?c1[2νGz<Z֯*YOHPSV NJ;87DtyhӪww#(5kԀcGe~ܼuqq~}kk)E9;;a׮P5EZ *頠@`o%Mѿ?ҲSkHLJT84@:w!Wݴ,g}x{{ɉw5iIxx0_I ̚姤I;|}}>M)X9Mq ''UTs '5tP"71;6aSjF5wi?{\@F:IM6rVqEptWL3񿪣n}K,1!"*IE6DD%1&.+jRs_2ؔ!f0NcPCDDDDZwmĦE8p>C=R }&o_x=YM4xML\Ń޾`Qrrr iSITEڥvHGM%E=-Q߾AF(PCV*.=6NNsٓ*y5_/ﳨ*y_ac#cyxxc#'Q nL;2cP\lܶB|f`S*.=6d`vF2~`#I;:TYd`Z'G62/493&[u;'O(d4Dgd+Υ=6DDDDTd0shlLzIsVP>6[[)#ȴ@ڙ}ذani7D0ET(Ez$B1a4sQKG6*E~D^h(%*+ GH~[sDvD^AE&FWI=UNzT8&L2j>Ë&X0y 7"Z.lƎUؔƦ={֭qk-o}ܽE5 ;StG*RvaDi2QlQu`̝ӼUDM%JB6{yG/oTۢ_aKhw"DM3h$nj[SA閊iwRvN}bQ#Ȩw@_q)2Yߏ0R{GV81b`S >Sޔb1F=LDf,Z᧯_m&|C-' 'Bж%z fj9Q:'am+p,k$oYi/ʂhn9b˪ExLXM,Ɖ ԃ(6z썞.`ۇ#^dUP.Mg:Pji]d Ժ?ݒ/YAxO8",IAG(6%S**vmZkءSHtAN9kQQ lJ@ј>SaxTn#"""" S+[5ME1)Q Ԕ5KD%hi"""""ؔOyfLa^`,Z"S񨹲6QN^1s[Z א c\Wn/5]Q XMU[ w.[IOCyyjZOZUAI~ӳTA6F&Qs9D$vKk0얮+u<61)˳tx7hxB{$LH|.W ذkO0: G.yHuO'gkG|4p@]a~˟:[-u@p|*n3 >lo:$=0uS`EW >LEId PCa<Gc?`=-0y^T6y81)UU4|fy~ z.JD42ΘgujzԢfGeq.\'81LU98gekG!^Yјu8%zEs1tO&z`V u0:,i0f)QGȲ{ZVA<[8[]{# 5(W,FQQ<"?\s[{ ݒ /㏬+y2.]{z(yd/_GMUY׳ʃ+Yń0M#p4VeMݝ8<֬QMqMxom ;[;e(gg'DGǨ)Ҋ[y,&psPXZ9kHLJT8:wȡWF)g =iIpp0 ǬY~J:4t0_Iv~~~prrVs #vNS1A*UI-9T:cG./ǒ~=P磒kKʡQS&vj+6w4X5ۡCє[c["""""ܡ1-Cöp#=>h<&!icz4QVm޳{&9ְV|V[u-Æ)"TvLv:]MVĠ_C9 -<Xfu5DDDDui[!}X9vs!bsu =ySVI48Q^iǦʾ^u`eGcpH~?9$q|=>>>&W_jR1դ RNq}1t3Ʌ^Ay1T"){ >?# )'0i4#zᛘN]Ճ?lrP41 ;[|Sj[Z HÈ/mQ-iQ.2#u%?SQ l8Df;vBu5 V*HV$DG͞F{; 5neQyJ@tۣ Vk$E!ѱSaGd!"vK&.%Qə"Lq`zאqlAģ :LE1!"""" ~[C^ / 1wiFb]ر Qe E:Hϔȹ?n#;n)QIUU@i;l^9_:F{c\~$ l*V ۂ mĞAE1!4v7,d#]&> ǐ?a "Em#Ʉ4qnKs#=2@l8KgÆ5@ק@e ]E ;*xq~kWPkV܎ &\`0.DQ:v]}QgݸkV`-9>RQ l$^t7W ^@F0(寡w}\Ħ!|Wcp ? յ#Ũu(c> 5Fl諾#@egGlcϲv䕟w𔲶xS*L17^3+^9 e lT6gaW|Jz$`VYbǾs RC1#6E$ 7fJ# E|J~Y wE_G*;.cDR$l@tdPx+&u*&g7-'m%:&1!"""""#/[7yd/_GMUY׳LSVս;qFyY8*歛S[[N/ Aj"4t<"<<^^4iQBaiYK)t5$&%* n;k_Z{ֿ?&-NLL4+i6ao%M7KԜB爥'l rrrPJ80ϡLkKʡQS&vj2ͨQ^i{A 2A__$'')ҒD dd3~O';c`Sؔ36**!"*IE6DD%a`S-=6DDDDDdxŦWl 푗gc9 H==CyņmvEiabS811T{-H[bbbЯ_q ybGN kxxx{; !"y2;k퐟vH{l*rPE61jB2~`#I;:(Mel %88G62/493.e`Sx Qc`CF,? 'f} "dH[KC8&褚&K'փ>t$!s.K?$><2cSTz IC4,maPbڝ1Fi"E4]B=CnO\GUQt,[ #ظl~dxv,;ADeXV~1ՃKǎϢ`馶Ek -)v~y34x ,JiE=DV"tҝNF&W"jv1!vcl6~^ۈIZNiҜ>#t@l A#V?g:x:qWdvoLhĤA`DT26D\䊇*f4iVnN6`(GzHrTJv.U۹nޱ&""""""""""2z lZPW[uIsxS.qw=LGQɴyzql/F95؝g w납'0v(%* OcDZH(%q'ƌɩ]m.۳Sq5d 45cVLzI>3&cޡ^SŹ8i0-1!Rؠ7 CzqO2g#^}E~o25.I}յ#zS*ߔ[SlPl==yRIe.v 6,d{#K`ӢgeC.U7 Lmq"xQ@H|r m" `~AZmib`Sؔ36*2QSL'֡6&2 Ӕ lӤ l*!2f7Ґn]Bz.N%qL!dj~Izi"})]N$I)Q`~+ݹ4wɠ"S;j]Wi "E6?[V'^۳Q..LBa2 vi{4-x;z ϣ}ȉeLm `X V*+[ܠ:>E=ۡŶ;{0U 6h$dGb~O[ضꪶEx7dTlS\_E1 l_F|d"yrҌCЍX[-~$pUX^nEmQdvLb Ԛ3 _N(hnd l\ҤYICCVAmKI5%{"""""2z l1!*mDZV1WӤ U,0 " *`UrRr; 4i£;U!/WQ*1!;9k`pF]/ )6/2i~!믮1S7$(.7VQ6`J佶 V*F|)O7DY[u+fGep|3l;mu&y:v,,ESھ[fMt]5|:"ĖZB]ԛou摽в~5Uyd]B|i>զUkuNGQk֨&y&bְSrvvBtt" Drr2|||Mvu@hh(,-k9^$95-ֹ#//F)gBpp0&5 &x6爥'l rrrPJ8pRsKe\[LMUmFFkhbּbCDDDDDƏ =E*PYiѣᰴ4&#_Ivͪ4C=`ooD+`k&8bP46Pe l|}}=Қɤ. >iClKjɩ NPPOU}v lrPE6DD%$ l' """""`bS U+6rL+iǜ_EC@HJ"ذ-.W!﷑ِ6 ǡh匁<@i%mQ[Ir;iAև}j"&&F0"XG_$#cS1ؔ36*2#I?ӤeNqV4'K tjSi2){dž1!ReoapuumCtRXLb VdBRqZ\;$#Kt_n_7h(%*#>x:-z$솯d@iFYy --(5H)~'=GďC]n AHLۺ#3?ni2˓σu`:|5p)H,KKDe! նh Pv&y) _>Fϑ?mQ-tҝˢC"b`C$E4WG mPI3N E` \Wֺ+ruwguptkEm΅5PkC^EڀQc`CDDDDDF =6DDDDDdIh(_:KkEؙT5H=sqh&j { ".gvG˲x`LȵG.^ƝUtUhAY\[Ql ;n)gbjlHIV83\Q<3b.hw}cz;>&#aC:=# !JB xMe{&-"h'Qc=?ƪ1;97[|)g %26D L؉S ~ z2tyXEN~MIE ^ذ];q|$de,V +e_DbqI%^NClodq&)5.cֈ8O I^=&v %B躥yHz;EѢ:+1!Wݺ`jJh X٩V'zevVRC vj{sG=+3d[@lwvKe`DL"""""2zԛou摽в~5Uyd]B|B2MmZVtfplߏn"6.Nٯom ;[;e(gg'XZZ)/QV0~eff"<<\k9^ĤDeCԭs}G^^"RKk<<ܑ:A5O ݥK';I?G,휦8gc*U[:s(Sfffjrh;52sTZ3*c`̲.hWqAT:]l(_q11TQ QI*:!"*gl !"""""+6Pedž >>~PP tcI{*=6CLL"-qwwG@|e?Ҧ BbS811TMt4O&F2FmF?MALVF8LK2~c(/Lp(Qc`CTÆ uH!/t(uG)#* ɤdCxZ6 \:E0AU DŽUN6υ#$- ǹtQmw. L4Pd2nh=I=U Nq}0!Rb˛p|+wn~EGDQbxyMݑ]%jLFv?[QvKC,: y?+D !@e }X#zRҐ$tV߁. l瓩h]-w|¢t=H)1a/X;z/@E7̎8&ʚ\O@qkq4bXt&as왃naaȲG Qfu6"Ÿ ecc T632e{#`uX;YaSe9cM&ymƅ vh4kOŜ{^Z;V"z6셖%zԔijӪww#(5kԀcGe~ܼuqq~}kk)E9;;!::FMV"99>>ŦI;: 44wszīrUQ~iY''g5 4t04iǨQ^0[InjN!si}6999R [8?2U-]`ff*W##;GMة5c`CDDDDDFC*:M^%mP49CIv̟J1MA)}m?- m_Y8p($5$c<>O$I!߿? m_-Ҧ~+M%T"WlU0^*__uݽ`ȇ.%myBff"-`8&((H'Cc+6eخ0*f=ȱ޺{ͺc۵Gawxyy>9z4\y'I;D&w_ZV lr$;I?ӤeNa1F?T" l!"""""` lT0k;\]]tP}Dz )14Tn"<׎3=ɈÒA"]䗾W Z,JHa|7o!I%;+4Pdqy@ltKŴ;qKc|D .6D_Iϑ#lۂwЦ(/#HL$&⏛jLF7cx`]=ؾ3_G FFJ"o!R2E)QYH7bg-Z;/;,ݹ?D^AE&ᗏs"`j[m ]tgs;5HIG7 xh5wC'rҌSC:ú5n +|p<ݚmCsa Ԛ6mQs6`DT26DDDDDdc`CDDDDDF =6D-+bv&URAZA&HjF&hj8X6DerѤqgl]g%om n .v"%%ż^ge8S<_SRphfwQB&ǦE'!6lvN4I9YpբJپc\xRIeǦW&YwIJ ˘5"eqBW pń)Hе7r;p6n;feNpcfwJm lU.X/++ZDVvj=pI^PQ +'j=۝R~5-ԛou摽в~5U{Lݻgǚ5j?n޺ظ8e5lH+GooohͭBCCaiYK)t5$&%* n;dk_Z{ QH3qh8fSҡJ~ӝg!>!A/휦8gc*U{w<'xmFFv*4Sk lPE6v)Ҋ@DV?̀(%M!O&*K`#Onh dbbb 4iJPc`c**'M^^^ tia6Fy!99YMWO#dc`] lLXE6DD%$ l#WQWlbb=y/C#9HcCT"ذ-.[%!IԮ"^E3a9yеF8߿`\{=6JC޸-kxI H{233>(49y' əԜB l =k ddpI;*tϥMJΜY"&x30cCDDDDD& QH;6mO#Ⱦ&ҡJHD8&삚&~!j=sD:4U!*TV*;H?($E ,ݹ0j@ɸ3ۢ&MT%;UDH-o}ܽE5 ;StG*RvaDi2QlQu`̝EY/xMs@e#Q=Ѽ7m֯0gQmw"DM3h$nj[SAvKŶ;UDHJތE+6k-ބza_[ڶDWL-'*_G8$cb-z%e Ԛ- 2%o]Y-- VM+]4+tN-TD+ *u^mJKN$'=1MNbL. Mz3JDDDDE͔7cc͟&cE"""""z8"Qs<9oV5ddi)+CX679U,KM볬m\ˀaUXYUʆ9*XܕZPWC`(X;!He{u<"hH^`U>CCFaiH`Z`@L^?uZtŀT4 ،O&W_ -w[;Wg}A[auOE lΘgujzԢfGeq.\'81[t,g9A0u0dYۣ(:Gb\s1n1DV*V u0:,i0f)QGȲ{Z1t&<[6BmvBU;4bNu}V=g/N+j v=Ro}GBRg咓1j49pB*UTNGQk֨&S)agkhNAAHNNoi7 \^ĤDe8s}z%Jk???8999ŦI;F„ ޢMrSs e]B|B_9Mq乥<ǔ_<^C*ז.033SSC MԚWl1!"""""ǡhPeH+3y_(ZPP2=9 -<% 11TQ QI*2!"* *TB񊍜^_߿/W]>X' xx{O@ff"-yzyR}ҞYEMPrPENH+dcgg/N&z4 T" l!"""""` lT{|hڵk6&- !ҝ?h?:cܢtdGb'Fˋhw"-oldG-volڝ-xSu6h4bTw8ڪ@l>Pbڝh7D .6DR|8$i#~FʟSnO`j9iF71ig ^hh,|cv Rն(5X&{?_Vۢ ??["*")!@ǎP]͂  @B[Y0ET)`(ae5 qQFGtTYQc`CDDDDDF =6DDDDDdIM ;jӑ.mFWD`͆cH۰"ʑdB8%ֹl8]g+`Z%7.U'E)QYhgWQÎ @l| kV܎54i !pA$tjtW r 6m? k"Oi"ɢ>] `PQ;>"Gk]U_c8?79㿁gӶvD}EYɫqSxukJ<Nw+'w=9cxhMsYnt9R6yO{ ]>^3)j=[Jtݒ#/KA^ =6DDDDDíDڃ{l"qz ݳGM_o`^hY颬zcOiK5t_5Uhb lK ƴsW15K#AL@&88X vHlIMrr"-K̟/7- y>=+O/-LIGE6 lY lbsN¼f}ԫYKoWݯ1!"*IE6DD%1܊7xg|>EW4KF4V3+6@7jUJ^ +U"6)<Rv-V=""""2}+p =ܺѱa Wk~[i~ib[ޥ mX x`6La/o~_sh~^<]|bA|ozQ1nmo^qIMVYq!j'~Z}1}P_-ꮆh<逑_] !Xa~>lK{ DTZPo겫bui""""cЫ/bgpM=D\.hD-\Za\fvC}p6zh5кz釗5]k%l|{}𼳍2$zX у*AC`|{ؒUNokn?m̨f /mM9+&.؁s 1nh{o]~t؊lW%"zPvce lʮm'"W.lUSw*f T"2}K>pڏh"ؔ l{*V%+TRpzh)^QSūe4F?c" M<2{#/u\d^IxA#"ؔ lbyFx<6DdQe`-_N-*<7Q/`^i377%(hh2ت6/k=)~x*h l|2UM/L_*j_.ދK"^xm'f]\E m}"ioEdڂ^ <^koX}552gDžbĕy| aǐx-}c mҹGI_h׺E"?ǫ^ٌ%Ω阛mew? 6Yg񫉘+ȱf!`M"P.GgS>IJ7aV?N-86*dvk[ \-`ՕP.d+F^N#I9N#&?]QeחW!{ q)yнQ_ǂ;gWEOf}t WlJy dœ_aGll\!F̜ N~:3~&B 1W8H/K?{HL_7?ǢM~=VAFب--ʆsRS 4%ڢ7x8q]!BoVޔІ*jL`)v]nac{l1d@k+6~:~Yi%7Sf`=A"3w$^4pdDZh؟We̼<%~Z¹eK4(n\̒nO^ E E,Xw}otY͒."^T}_E^|c0۶4|ݛp8Y<6?s'v\>+MjG]]tkƻPYzT4?4`58vlдlu2iƳ1 ΢ؑjcrAC\d8[O<3 U'2Wcry Da"]IG~x]~dp~Q8oHJlSz5 _d7¶)3㎩&͍Z#V~n*ڢvt4}4=◒ޏz'يLJob__zd?]Ҙ^H= "2^9螥CzI1$K& j~V:=5m'VzpMqxv q=6]`/G]mhfNss\3 GPbT_AΕ'7/a_␒y[ kQUR0T1GInd q%5ſ\%8o# mޛCߐ( 22ٻ*2 E ASq%K4M%\qOJMJ+fhi^ HJ "Ι{{;w9 39~iXAy▏Wo,iJ:ꩂzcl nCX*nͫq#[ J05Aŏ?s`},=_+3!tu{rh-ֽ"TϦHき%fzٖV3eѣ52%1[8+. "ӣv!|EC9%ldj0l|nЪ_ '}ѻ8,U=?|1W4$"SW o=| ߂ ٟQGWT{I_/k˳OT4*g<1.\u NRcCXGmGEi(oJpҬ~5X?Up,&&)6 \"4JOlSM-T@3;ߔHضɊGœLKî,Oވq%j2G_wQ@#G ^WWbuֺ51Ud*~v/?~.8x 48J~Y}z?z/fb9G=Kj sFOQXZ3oi ;ߏ1 TGtE<' ˆ9GQFlw|큟x}_B|"O>tLj7gmT!_c1eoe}mn/@A|7i:>Sa7UL$pb>q=,M6FXP1_|AE_5K+@w`YvN>@R p+0{67HvTIU1ϓPJw!Nx decY Ք/k']WrU`J7r!;;}NeAտ.G|[R5k9E#v˖d2Y,n9EYj)cG- =xIlD**o>TRp-Gf݌6ȼ|ۦp9r{F3嫍^mo]9v@洛c6JxyNLL['훎!GPwRRN٨mhYzJ 9z#ܠw18~ /x @LŎO:cj6TMmg6m( {V9'䃁 =֕)Anūv?iAђ] g]b>b:Z0URPOLs X>t0^l6LGLJ>|PsazƄo%ճL= G[mڊ,_AܔOkYVeJxTc z˗h {%ζOWcb`}L?2=K@c.јw^P&,zADDDDDdd,\7G?=|3񑛱Zg>jn?\4+F[ΝD0%u<0jB{ WeV0z~<(&@Sy4N2ΞڃAd,nfŨK ;{.b}gk!s-W)E~@y^M*SDDDDbJTQ<y0%)ljsOo? 6EP=wB k18-='6r1%OV?qؔ?J"""GdkcxX7kL諅A_F2qSZ./3 W\AJy{T}5=*PUy"lhY[=qV4""""ʗۻXfM<[u2 l+d -k{hdpV4""""zXYbBs!h~ '㢘~܀͊16DDDdnLb -B۫cq 9!""""L"""""2y l1!"""""L"""""2y l1!"""""L"""""2y l1!"""""L"""""2y l1!"""""L"""""2y l1!"""""L"""""2y l1!"""""L"""""2yO<征Mme*9޽2e8t2' ñ0n߹3g鳵Au2U0qm)1{Pi7yP+9[2cl|bCDTNim`%#׮={Wَ Yz8}ާmÎro~`c AȈY?]OYXd?oPmѽR,ql~}yc`sތ{hHe15|EY4^T~R_#{to{['%]Q˞m|p}iD/ۯ:x^=L4R/򍟲+9U5Tyh,7. yo#NˋʾϢ*}+'G;-5]_ w^0Q``CD80o/00mV;HzW[2Q[!m`Ȃs2#B~KgNr`MUU{V8.C"1!"zL2bɛp-_|48U.#T{]r\櫊?kD7±fx袷 [B""*T lHݴԄ]N(e19~-X7$^:#ה/+QO\ލ[t*`/P$.?~C˟3Ո< w݁h#߰-i:tr) t{;QACyمj)ctVPN!"BD,Mn ~GҹC؟+,[$]ڌ/ti\ zڡLJcB3ukZ jX"ftX,.R,^;e VO)\!˅<_:Fez[LV5e&aGY?sZ|qUE""h:~.?WQhZɧa޳H9{]~,u8|)XߵX7_#\Yصe!*Nl83!Nl8356DDDDDdı+&~C0y:X_W46& lNI)ST)6tìdff1'6i7sL&|.P>!"""2'6Ol6DDDDDdc`CDDDDD& <6DDDDDdc`CDDDDD& <6DDDDDdc`CDDDDD& <6DDDDDdc`CDDDDD& <6DDDDDdc`CDDDDD& <6DDDDDdc`CDDDDD& <6DDDDDd=qtͽ9 y=06U8TCg """"ta%t¸I096 =Gy(=6U5 !ڹpz{V]-[NȈ^]@x}wAC2UrLC2%>/1PXM&&˽8V(_u)CR^NGݻ(]48?/)S6^.2Sl(,8,fEJV!%L۪1:L'Φi6 TC%xZB&)6#g|GF͞f V%!""""g_.`qn =L Em۹ur,p;g쌎mڠM; m6IcR!w~ ĬW۫e>=Fe!DDDDDF!fٵE&@\!nO|1eJuw,V"&<m6`”޸2n\oYX[A΅U~\-.,K+Kܺr щ """""c̊7R!yk۷VčS`~kelފ[c5DہEU8s~[oJCܑ X8A9hw甗 W],1L-%3E"""""I7+=Z鞉`|M? ) wbNl~/[At>BY;x}o6UcS 5 V#Y_x5턾 ^[d,+U3Xa1!"""*>%QAտ7 zM1(&xdb WbV;qY""z45jJ?w&S2EDhlmlP/J o(ح˯<b`:O%i9xm쮰8b5؂IWv-]BAKkOm8)!E\3J j t}fGہͭT*/U^mu()i7uy3<ѥko-72z%bCn|*Z/L̅+n 8>DہMh3_̚/狥+4q* V7]Cf^Q*P{NB -#n/G dr+0Eٟ<҈?qc}ae_;#C#kݏ&vm؀Rh0 x71rCwljމ-[0&ӕZo`잨6f Š5̰@yۧad$|<O/EuAxW Ϫu<߸+紺,e?jZ2͕q̛'><6v-?gu/c7^H˫-R.0 S6\Am1dXWJ{E{qY'FLϫ:im|؝}G)V);JMCғջWKõ R=+ՠ1x+Jގ3Z+o|)'-;aؠ&(%>ӱ|Ctjq&U]k!L-N;=RrS2{,pi\X<~S|R&lϖJ po呜cÊh^K9 |<2lVWd(mȶyz)>t^)Gקp>J+`hCya&#v]ׇwBG^ ^y~?Nrd={Wl:i5vl}a߉Zmv`S:8jߙemMAR #dZgs8+cҌضJ"GŪñ`"B8W]T@JMUU{f緖RY8xuQxN>|ॱ6D||4Tg՝ؐs]Q[] t2p)yD!&m%JGDD Ƀ'om\ ]E~miRSꀪ |4FwlF%5jWySpčAM%[(<q/C A}^W{C!),Rj~iXAy▏Wo,>鵎z!6P=)7E0[DjjcLM}@##z(vDt=jN3wqXY{[_1r4Zp=\"T o=|:,g\7@66Ϩ@y1^G"8{8TigX?N{/*bWF")H$&| F$dVDn_Q`|1u;2?eJ~Vϣ{c•X-٠|jXG| Q6xZëc_G5)u_1Ή?@,H>[q5nhh\! 8 U޵DLCj`XJXZ5X5gtl86'p 4($y="ydѻ7*ۈq%j2G_aa;?5Dž@#G ^AxJL5ZZw&"LůNV?&`9'E/b&cчҥuŹxG|ADV(KyDWZ#x seayw}Ii]%Tͷ-RysLv#I|Fe>Sf|_=5=f̵U~` }cq!׿>_E]ߟtl56 \(Bi7K5Po]._a ۞4-ٕ̬0Ѫ|֕)IN/#e+[^%$ױyy]Z84+@M1(F4J nolO>%oB᧐rkYƟ:6]3LwfKa|3dJw{Nx>'6DdĆJ_n06- -xaOl=+'ؼIoؼF'3""""Ƅ,ol1u86np߶m $09#xEunrdWѹ,UD͝;wp)sTQᰵ>&|L=+j5DIcS[y\Sk~p4ُB lRyӖ XrvIX|trmAclN}>#`kfrF9 I[ߧF{\Ol{/_A'"zPwvDܹ ㉍cZٺdȸr\xbsǮAy,}~zZ6~li9dut ºLV wV4߰ ?.ݍi>X['˚\,5p mq!F`_3"6kDSlwƸ5qO3z1ގ a/lvG<ѭ%>7i}ڥ- DbW4t]±{|8Qbba"X5 $""""w+U]YkXZ ar Gu+#f̗AM3g LԘ*6w"%`,~4}aKwOf{<4-](D!SW{68=xyغu@1olt*{p!ӛm6fKQn©p|;b=L!""""M״-n]֥SOeK5m,cz/92ș!7'7`ᤙ' m62^CŘfʶ>iؚ6`οd뜙+:.m`(}jt~%L۞&M~Ґ>j:((Pق Ҩhe3)HKRSSsP@<5Ki|M0>cܠ/qXЫulb?ܫ)eY?pWRh"n4i[sb2D6~~~yޱ%$`F?M1dƌ6;~nXVP~LXkVc,XmBZhA iPcex]Ly  ۾׋m;.$#]ɿC"6TrL(.4Qڢu2 lP%/QB l$c \ֲ>.& _%g˞Y,[\G}7 ߀ݻw+f|3k-.)e5yJ9^^)D,={V[S ;}>R2+1Qx|BE8q!~W;Y:|D拁 *KGvM1ضMLE Jm{CUؿn4q]m]9sO~^0d9QQW0[`rm[u-;RRR2'`Ek߲"-ZStDt?6D8;}]}88 XrҊԿ!BZI1qV[TnM)PU""""""2y l1!"""""HEiK i}V)Hi!-`m ._ED)3)ϥb%M휜[_CH3tE]P8gCO"Q $Bud na5-^;#^)kulbP,S8/'zDv3zJzY Uz8R2':sۢek &o m-/~e?XʹHcԗ^(S?uZ;:G)e8uNJju1ulXw |vrPأRfv"`TS.Ǩ51MB`h)mλ2K7s^ZX#=0=wAs<[*]D:6+Ԁc뿈eW{q|pRHx}wAC[dIe<5iXDIBp?wnYݲn66nW] QQ2eғqZғ`[Zb-S6\sxMv5GHHr Ū5 D3OϞ󃓓TkoPUl#5v)J1"iSϞT=}i5D] PI{OS&'6]ъC9y@``LV zu{b[M ˗`E%aw19|q"Yi1XτG=[ˊMb`S *F tq!+MQRbn-/8<< ڔ" l = l=pwCJu]V 6[_f(VY|GAϡFUY*٢FE8(Vҹ~G*yR‘~j15s@լz,>G# Dv(Ӓv'ʿrJ .6DBfLA -?bBKYN`$ltk85e9Qъ‚ag8(ۢ35?E$ lR瑏Q "2hѢ,XZ:;AZq>*W9@9kk䤈yDE*Uȩ`m5ϞB:ZED76DDDDDdc`CDDDDD& C*UIu-sL "N=ZpKf!="Ѵ%"Fr.ՈTr[6U$3Rǹpw,~:g4km l[Ut֥UX nRJTUGSo!Y4>AWWAWoҪ5knhns%Bz(~sTӖmXXM"0֯ڶOKŧB bz'lr]Wu"*jQ ;qYu?Uz-SIc3tSQc F"Ms ;hֳekY ;c^XZ3{K<WYexfZUǚ/7 UEUk8@D3w 1?b'cgLz*3`zH<.W>oƵ9W`at?5K ͓Xu8I2)g3b!=>y*+ͷ3Ѽg ???89̧LC~~4DݻwQti87pT5J9ߕc[5,UOǮNA(co bB5eaˎ!6k !V5j+/KePteG(QDP#Tm5Π,1yP]U~Zbd=PԈ"KGtF,11 l1!"""""16&8؈~-zu{16/ǣgOO5M=Č3۬ԶGMPPZH[|}}shW~clؘ l {5"2bvHlEM||L4o}E:&3! l+(/允6pV4"""""2k|bc뉍L$1g=򏎎b7 ]*'6 RjjLv(k\hD{Df[,hfdQ1!e Cy)]R&ʸz#=&P` A^=_ Dx&"""""L"""""2y lQEyIIK֥Uu=bqJү\B2̆U%kF dZ_U{ rB:\|V*Fjj*/^SHTȼT$MW"#%;ʿ *i"+F q0Vl#any_kE_@з|K u@^b}ǡ0y7PGt{eŸ`UCIY7jыhaë6h.Kq P!2+]Fc{m@v[4TӒp ~ _j;g/M<ÇU *|30@aTj)ʜ,ovW@RBe Cr.xBoN9Ǝ0ݕo`{L v͚@.vLhƉF>^Z7'_;@ 09 :bTo#fuiWa ?еu6,I%D([94n^@M`SN*kF!sei]n[mkrS*gmڡqN%!*$pCmhXVEd~ ڛ\Kkve)"b`CDDDDD& 'lr]VQLC2e4j, v"Z|y8qT;q ؠ]uu?7gg'899i|||@.hPtt4`eUQ~bb5Pß;233)u?ӳ'RSSa%sH+0O oooEqnM1kcNGݻ(]4]̈FeMlB1d1)b l g`-S!6BVͭy l[KK1a6Yv,9!2eےn]Fr.JOe嘬Cܤ#ٿ{~+Iɻ"ƨu0~mwn!Iɻl@9QYrNK;ɗcA] lT855BW=^w7+E{|K_. 1qLH܌wP (ǒ 뗾gwRJT87{ùF=xEETLT4Pd#1m^j d9rUjv1!ao(>S[Tv ?BЭXy.ZW-f8_cGA*mQy57f:E%1!pIyU.M832X%">^Tg*m bZ-Dc`CDDDDD& <6D( KC?2-2M,=)Vӑ)W e,VLI~AWYĢ%y%% j!*6Dsslli N΄Ḙ=:YFa;o>,;e7ݗhڦ#,#W}g׎8y4ɨ_m't>כRm:X"rrZOd^kgvRњ587olOFlgN@=- QCΨo~,;OKe lT1yRR 8q]).K5 +2Ēߣ|gc{ʵ#zcxTʚ~5EղBi[僦/&zd~8>퍨}>4)>زӚE@|6ojv,,յ7b{Н%o"s0R{ _Kpi쉧?7ip4,S%G4Ĝ7Ț4j, v"Z|y8qT;qYu9;;!**ZH+Wooo5wͭ9BBB`eUQ~bԴ@ R㔺_{A9~j:$d0OMvxz_I1kcNGݻ(]48_C+׆.(UL MBJkhl|bCDDDDD Aǔ>J7ߔ9}c|w4D~,}#n_%g 1>`UBxߏ톖YmQnl{\n*y} (20gE.p=d1v"6D_E|vlФRt/^A=ݑ{H_eFґ10bZ{Wn؄TT+J T8tdw?3mњP!v6R (2 //mv)ihc\E1 lpM^}c(;8AlYYNq`]vu@7s,'*Z'ppw:\D-rhf.ZIxo iwkL"""""2y l1!"""""HCM4+ dOh:2FU{  =ugGNUH3b3*P {{Q*X\-#eG Kc 47vv5R=#5GBK*1!{-pr|+8\fy z޷]PY>\4%-ENkG8vGR>~PP X4(55aaaᄁq Ū5jJ?wdff"S~~홧gODGGj!!zQ5b~4DݻwQti87pӿ2W ]PT)*[2cl lJؤ="Y2Ŷk>6E lR܁ 1 l "PQRRذj"ʒW[1)b l q %1bo/!))cl;"%Z#7}cl|||}Qt l "Pq6QQ2EZ!A?Ҥnn͕ɐ^ 0FeM&@!&0)pg"""""2y lB}X~nI싡J:uG#zQɬ'_@vYoG؅d#Bt_P%/$R)%*,JmYm0\HNϣݹP%/Ġ"q+ 'zlO&)g*NPFi"U"6t'X{7v-S,])\/ؙ;R 8RlG}7 ߠ7Ykq 9 ^~鑋ɻRSP7ȶhט˥<ڝH,V&4Pd7cd:dlv#pB%#NʹjR#  W$5yamħd9iFh8f..eyԓDEw~s 6KulᬁZyV$-+ۢE?OKDyc`C$R.Mw2P"*4QJ j]7%L"""""2y l1!r73]ge k@JL i)J5*Y4 Җ@=#9PT)VEUTVP`fLX*7or*>[v?nG<оW[XnA'K\ AIZǏ[|{c}|Ų-zw_O^~xrkoĶ RCLq<-1!R9c̖_fTuDv_,e;̊8Dž0%?)J__GZ#gu]?ĔM>>>}urL89[gA$rM`W"PqN5hC2_c@o>Fa!ױȈq5YֈIy"%Cdl6Mc`c8.Щ=".&4iGIY3|@FAiҎ!C0f7b16DDDDDDŌ _WW>Aǔ>J7ߔ9}c|w4D~,}bTn_%g 1>`UBxߏ톖YmQnl{\n*y} (20gE.p=d1v"6D_E|vlФRt/^A=ݑ{H_eFґ10bZ{Wn؄TT+J T8tdw?3mњP!v6R (2 //mv)ihc\E1 lpM^}c(;8AlYYNq`]vu@7s,'*Z'ppw:\D-rhf.ZIxo iwkL"""""2y l1!"""""HCM4+ dOh:2FU{  =ugGNUH3b3*P {{Q*X\-#eG Kc 47vv5R=#5GBK*1!{-pr|+8\fy z޷]PY>\4%-ENkG8vGRąא16XNRӤb\؈~#"ww16b5!mmg,a`S163]Yi7%bV4VcąlxxA`#fI#3#1)&cCDDDDDTe~:ݶn)CtN%R%G"D9&LYIOߎ HG2N(\J^HRJTXv! ۳ڢaGsJ^AEfVN@LRT۝S!1J .6DDl GObn[XR^^3Aw*a&{yaqLH?nAWvo7sr#+yw)D!;~ /omі1Ky;XM6h,$nFu FąPOKFڝs"Fi"!~Hk[-ڈO;rҌq]m]'ˉlb"YY&~Hz [VdE6~ HHIubk]4+drETi]d Ժo(*mOKDM>Niίż#!sa`at+!;e9g#$``7ņa?nT];g9=v l Te,a] WȲFE, W"SKS~ָ4RkTfǢ%yt+T(!gdQ*qD*)z*V M 12;OY<JnJKE] l :l@ { Ӷؼr!֕i}/>rR֢ !`P/=6е|uoY?p@^ma}&~˟[,ѶWp|*nQ'O7j?n;W[Kl퍉?']}3gIDAT˶A~=z9Mb25POK]&~.F25(FDZ&I"uz܊mo'ձoev`2qWUrˣ=j"+eq!L; l; JYS.Ǩ51xZ"-{+ l m+Tɑv3 1TѺRV")^M5{;qR}P<88sokcvܜ-S꫷;M!!!7pP.*?Ct㔺_{A32- FxxOS!!Լyjӳ',sr_#wMcLhܽ{Ks'?k(sJUHI+S9ƶj'6)X=wk7$cc`Dl!܀rm.<?vES*v|SvĔ=CbVRuQH+ѳAW4݀GtC +]DOZ #=X!2 @WKX?,,6}9x^sԱVv-t&ic;F5o=OtI7O78 |WA!1v@+.hF"VM2d,`s:oU-"}||tPP`-c w`#ְ ,4F2bLMֺ5bܧ@>f ?9Iٯu=\P\lfCLJ:. ӭ3Щ"pN;I;J-G+ӤhH=a#HPc;41o qL-:6IBnw l{b`J$%DQ,  [xh&}+0g-.ȣI vTnJ淕tk,1#74H89Ԩ*A%[J? Bk嘷@%b j怪YmQUX@fTZ4PdgbG8eEaqZ2;W r-u7߂E[<3xƦ}O/(2]u;EfLA -?bBKYN`$ltk85e9Qъ‚ag8(ۢ35?E$ lR瑏ӒV8ۗkzZlul!ۂjݓ\ܧ(QRV"aŰ|?tEV^z+6-eP9)tQJl;g=OVB;5j4IN U!t'lr]жLi7sL;8{jv,/' ZT@}1dS*4M5{;qR}P<88sV,=ؠ]uu?7gg'DEEiEPP k4M!!!(sr\qq~ R㔺_{~~~prmi- م`3&2 cx+mɡ51Qq].] dn _"ɤ>ۃ}GJN[2cl|bS ݌ATm+#.G;EDDDDTHn¾i -O l>+:wň Tn<Y 3؊˃ Em \"l!xB''P+Z>x}Zpo\V4RvE ) C/!j{L&ꟽ=G5ihw ]H[$kq/}0wexS&Oi8z>v\"؈>M;vd.&H{`룎"iM ut PI{|||3Fg'M|DoQ2϶ {Ue'6Yc-H{ ;iWǎrPq>a[]mhD{D$k^Ol8&/fbJbiKtt4z.X K1qظwT.pg*9D[$.fOSӢҭgĺ5c=9Ɔclrc`S;Zl82inEص6\S{D #6BV,)1C#kmq6\S[׼ب,mϔ"16f 6aV--wDP'QclZ= _Pc)C"ê+f풋#6@<ȭ3tn=B/* lZ3c4t\> _Yc$3t_ %ovpx]߬O%C7s{L9uf~.끲M!iH}rLR#\80;wE޽.ƪ^ K?>zС*$+-B*6,\˿*y_=dVn-jQIqiy;񫒷!*UlDkm`aB#uiНowR6*_A.ڄkea|1E>|w<ՆSS+^-ŔOfY8~YcDn>.›=zCd9iFƕHr~S}ꁲ9L9r+ mQ0AVݽ һb췲ۢA%1q}krg7Э.sI)%c䣙ߠb16N զ-Ə}Ȧz^zt)K]4+n:P)6d@%l.{-ӒVU oUe;sa/36QxOhBX=gW"""""wE/dc3|fXKegS&qX>WvC~ """"V _n`|܊aM^)[g}+sz]MyQ᳀UukEq0)PGLٓMݖ BmYJfbETQ^RҒui}U`X\.3+bVfǪ5p#i2v5?.C'.DMLA*@W﯁ZJ'XS)#RXViK9-ʥX@i\\}ЯmnsIsyx^ǰ~l"^j7@߮ &܀.xɱUضa/]&˽8V(_uqm9066nW] QQ2en!d8~pC\_hWoXVvz,kJO'pG®q 4m 19AYhܢ j[Enn+Oo@l\_áT~sGff&"8מwD``yt$_8ГVAzfXVƮ Z4 s~j:$d0OM[I8y rNKzʨݺ9NXfӳ',sr_#wMcLhܽ{Ks'?kpy{Q8} z=Q6t)q46 )we*V&oغlg]c `Ӹ]z=f5aY[ 5Zfi]n j+pDPCֵ!zfXfAA㶲(Ǡ&|=3tBya`S.!"""!_͂߾D\[vB0ǃAnj+8&_n˔XOmJ'sJ#55={z 4 dLtt4Jʊ8h.=y(|>aQO$Zh]{sV>ݳa`=8$-lגDGG=q!Ȥ'&cBq6zHڤ_y^.qN2v,;qtFڄ4Ep}_jQ "Vp' 8qqjzY]* Q^3!"ʋY6zk=; ːXFq@;v{w6Vdk'R!_#66uC!CR:v_u_k6Z\q`W"V|,: 1S/1y]!2EZ!!bBEeVC!+ t!#'Ȉ+Z3m"dN6M+&tRrƱ] ;p6gE)Ҋ@&w`Ë qsk^bV'lҤ1 l ؘ 8 e] j_-:խ$$w麤*=c!s˲o%)Ji1I\ lc:U猶;]6hȜ펬 Y{펱s0ɇc߲k׮jm_" S^]#{xwR..}DA%4x[n.}*U/X$nszhl:5C7mw`נ"y`רlQpU8%ۢ15PkMoh#>t>- OKZQuG־vUth5b`scgO;g>VyalN2a ޵ҥIxRfDIj>VAmKHj%V& 6)9: ץ' G{Aa`sRx)(W )2%g6eff!Gٗd}j߂5\ϥX318N#A"""""P_g,|XzA y01 _O݄[0ct8ćb(zPU*Dq]~!"ec`sDl}]ŒGpR3 qcqZ*}2'1yRR%kG5N\W{㻃K0"sR{ Ê7mj2/Ǟrޘ>727bz)e@%8]o*Ppo7` hoD)ǥ)eM->(Ȧy >hj2#?Îe[w9qZBe44Lw"L-(M\طE׳>>>FӤnn+2'7;p*ܑ?Ng=''%!!yFӤCxaoM95b~4DݻwQti87pӿ*G{`zۣpmRJTt*Nƶj'6s@/bZe[jՔx}A # {UDDDDD+?[$^lBRbQ<\*]ѦO)Ҋ0XYYtEݑzTӤ~~KLWaoo/sH n]5DMv8'WTĄF-bi fx5h lJ=ҚݔI] u}؈˗e);NPPOetQIKK};Q16+!"Kq6DDy1gET2xadiDDDDDwaHħ^GE]:I C =ʃ)7>)JѧIcz/. Myg('6lKCY*x1ΆIt6-,>ە XXd #BwXqaW"PqN @F Vb|P@u'mD}xcl;*uLVDGGFdMb#D{dcl QlYwAmW.ϣ}R{Գ. lCpNYiҎ@l8+ƈYqSE?ڔ" r6> 5Lϯc!""""GT_ s|VlX< ?;KYLa`C$Ǭ;E@1`7e.B2Mf$n-e=pmnmGJ [^g0()eQ8S;HHo+%dvvܨ8 %׎؉#ǩ .ñJ)xdZ%F0^TR%Qg*Qwqj ˰J%'8DVA3d1;kovttRة<aZ{H+g^M9)."sc 8TE^Yuk>ai경U7dzll"""""2 l=g6 eHe<5iXDIBp?wnٳ꾭 UWssvvLxy yX4(55aaaᄁq Ū5jJ?wdff"S~~홻{Gdzj;OSCBv6i1&t4޽ҥKù͟5rmRJTt*ߕc[5f`S&55E_̲.hF(F`.EX{1)b l W`CDla`SL-"""""2y|bS16M^^^UNSxzDttLt16MApss|bS11TMT/&F2b~`&psk\LFLppA`&2 cx3)&FDDDDDTe~:ݶn)CtN%R%G"D9&LYIOߎ HW/*HTS!1`U“ a؞mÅdmw."T 1hlJYm:?hw4 *Gؽ)E.dLJ؅^^X)d6OãoՃݛͬE.]0 ;'+cXp'o -5f@N$+y (2 1Qx|BE8q!ihc\E1 lMX" ossĶh#> I3B1wu( F,'*Z#c^d[4g g Ԛ "5oY-)xZ""!%וuiҬԿQAWtU5PRE<-=06DDDDDdc`CDDDDD& ,bR\aHIi!-EɱF%+&aQȼdZU%kF  T8,VLS"(/)iz&!Ey>[v?nGR֢X/q T8Э Oho:=~w@O-mѫz2:sۢek NK{՝~E-l u_OE lTWUrˣ=j"+eq!L; [Ul亊i֖jJ91T<J`c QQ2"""""*j:LGaVRj^{_c3ctCT!aڣܠS_,(Z 7 oY;w^kl !#'Lx(,ݰ`55 Q晴$?{A`3e58Rv ԸQD$~;>XEEw6`7E5C"MÌ@ucy^SGQ`Cmw#cX%ܿGc59l˜Zv bΜ+0g|M؍^o/[+sgW.q1)j*QEƗދ {sђi׭\PblNPT#l^hVc=aX*xNUUAT{1ûkpcDw__Jשz1Szd÷v;t288@]=rE?`CDDDDD`CDDDDD`CDDDDD`CDDDDD`C$7Gkp)p~cy ؁膮Tcxa{:-c;DrX<;rʝkvy4͛R?B?v@R<<&wS么j5"y?9?L/մ`8?LZu|fM#o|L&wx/.p{8<{mܙ1ڶo;s2/SS*B_s;|#%}"Դ($6ch^<<k @&1t[΁c)oiZ5~3j; n 6D5h{ߦ |'QM q6_MkɒΞhao g=8j8TWc:)D`CDDDDD5@&S^3m<^#5-'OC5SnݍЏnо/+Wpqմ)Z4ou֭7X {`ܸqzxΜ9HII?x~z}6DDDDDDU%6PUŁ"8uпxEDT7J±*Z%cU6c)U1"""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2:M̽f%x$CGjZ*"N4jݺ}% ?`nF֕t^zڹ1xWүPczb$gdCy`S7Q12[aU4"""""2="""""Ey1111194mT#=:˵1T}dfeŋP+Y\|GD$wmhrsg45)V,?ۆ} J\OYu:gn[!>3U ٶ-_w u;BQO؉KbgzIćcuбW+6DTu*^vv6.$&C5T':BZʇ%6DD5y-[G1h)XgVbPl>Բ˰92͘(vIO ^O/4c{6lǮP;tcB$옇fHlRMDD&j%6DT~Q2="co.ُfHܱ /].>/GB+Q8S[C!K;g5XR:V1 чPzb1iOD!QDFkJ kHW$o:hVϲďմg1z݁. /X!ܴ !{ONNh阻;RCcݶwm?/W!vn!) oGE8p*e?㠞<Ku v|z.1W?n8OE. A؉xeDj;qB ~ 0#j܀W7b/Kx70XڇeKi/5'xuL<E!,zl?~Tw)VN NDDdr 6DDG*7xh]օۡ 0{}_ o߫[bMT{g(hOAe=DmFww -9ΖG8ӏᩝ*E@[T$BC>AN=:I /BsR(5 l6f$""* UD;,gP&kjlPAeR8^^pTk+9?'pkGn$YHI)5""2""~S= 2; Vs >ݍhve#B.бsb^0n<3ێưW?e0MvވȬ42o&:ԴTDvd݉k&cݥ:6ۓ/=yxKk8rRmMwg8u ͱ9{uB`pW. 4g467[kqrpp@ʖ_ǍI^ yM,FrF1g 6 Y_^ ?‚g Zce`êhDDTi.+ob!"`CDD4#*    {N>m L];w1JvCݺԱ1TLDD[tU4džj4"""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2:M̽f%x$CGNN_1J+1*.` /33YLTҞx|QE(H(x~?MjZ*"N4J'?_8yQyuh߾b|B1DT29ɹ4/^ę3QٕS 6FDDDDD`CDDDDD`CDDDDD`CDDDDD`CDDDDD`CDDDDD`CDDDDD`CDDDDD`CDDDDD`CDDDDD`:cF˜١ƈd!b՛x^ ??EL)J=njJQW>b'uN3+f[aӊK7#? Sly]Hѯ2n(v˘^#?O\a ES}!6+1v#c5Mx]1 >`rKLxl9lg_W;/TH5M%"R1+0{jJk.{HKP& -ǘ(vۉXC0^v퇾..!rV*>*9i z?J3qI'I/_N&.^~ٿBQS`ao|߶ESc,o$_ò產 $zb/EWtjyl؍8c6)9b<:bx=Yi[ϢIezY\ӤLSll$V.oƘQ[b,<;2[Y łSYpuYW—0wR̟:O4Sz:c2jɘ7aO ecTW&ݓKm/OMY"c< $q ॏCTgSyBJ~d⽐x=Dh*Ϸ+{][ȶނOF*&5_o!E@L+'1ar5CCg5lX8RĤoqH8Ʀb8 4+ 2F Nc\6X<k4<_umQ PSڃsƸ& ;ƪE m~Tg`ٞ_H]mY]Il~A)u5fHO`K>.7˯R1or.Db쏰1n{a$:p>^^2˚q;ozy6>ޠ^s؃)W_7_Rm¯jj@WQȈ9 g},jա_[_a <_u̽?l~c̮Ħ2U:2G& ;ƪ_?usuAޢ/ڃ~6o"-{R`Svx_SRpٽAA-[~e£jӊ{ѲG>j=k z*pD"L{V|_U~0:]'G!xCd8)ZxeNY=^|ރhn" L= YSaZ!oZ[>n{g|;kn#CHMk@Xy /X {)fo#HNMӏVc`N;CНjCmz;1.{7{X8g/XSV-EWL@_cXcUH ¯NN1>%~@[M<wUyXmU첽 ;gW1F+S]Cھx&XiUV "m՗T1N8rpv*wwS'v"Et 7â |FcEC}y#J~};[bnӾyTWw^ج9p{B0ݘl_cu?i-?eB`𪂿kqo>dgqGccdXe1V;U9LU~Aހf-~րvK 2_ȆuX(&,T}=k2?jR=Yt_M =u[Ɯf!Cn a}J` [ԗ/AУo6DbѸCcP>dM:{Bm8d[՜*c<ƨT9ۤ'k@rxmx,m>17ڀqptԏq[}CC՗G <\.ex3\GS5X$fΓIq2cg_MW%NV˞>c\/2R8;//+۞³u67U1VHxuI~zZ~M+P9{882L˹w]B1L?q<zUyr8'_ *BvYsD hy#4ѯv]yۃMѴ<^U6TcAZ.꽟#k -(҇ފ;g)-Db18䅠?%}F?N)jG/uѽL] x>xX1]B1^(ju? /=2D8xl˪O#՗b\1l6ƗM]4z;eab|srXcs1FS3ONsYcwO@y]rK7˥՘"ەAOEm?xT707lMhyi2e5/#UoU.5-'_v/!N.qnOOuѠܝq). Ҭ'\Rp>2m^e3Ky$^ I:NGYێQضGeƷup5 _gc= [pIT6!/[p}Y)AeS;o/9ڐGL/Vjy]@bVs,@8X. )QcvMsj#zlO1F /{%g,ck7vHQۖM<,sl~}69LcyqUqT{S}q0X~ڷ1Ts1p>!N Yw>>u 8՛<@eSsNUb$gdCy`S`{]yxTf74T3GOO3}yH7,T+>U8'{cЪD1QY0111111i2e5/#^23 m83JܥYQY\]~ =?X䌂3QS\aU4"""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2:M̽fxwzCDDDDDD7֬i ?{ $ذ*             KGQN!˰Oc]án]=N8""O""*’"|ӿu31S{nE^:\S^^LDDtl\Œ_5V$ȿ~[0Ms}|}_nni2wI 75  Kԣ5ȰSLf5Tc4eTA `,IDDT~ 6DDt]zmKhҍaaqjpS8"$%%*B9;ZR_)yALJ. =S'PU΄Mtw+݇t6e 4jꯃFѮqC4iP_mA˙Y8K):: ԶaVY|C4Ơ}k1^2sW܍"==q'ꢭXwx^F8q Soc19Eu{;rw>V233띁x,ںFھ爈+ 6FD&=bb ގu FFbt wP\ĺL87`cbx뮛uHNߨx~Px6\3aDB:ez&*%5 j=>8 »E6Cm?_? nzO /55a1u&VHO]H6Y9WqWXpsM]]Ш LuhFFvXzH5T FhhqF6^F8znP8zQmP.\6DD`CD&ႁ}{TݹK,BT:^01P^YYH˿?9YYhD:_FOWPqtձߋ*<4ʅ8}1Y_s%Ru4#0~poxH !a8Ctܜa 3_zKo<;^GLLebԂ11rR嘲&Î!6% j^g 7vt05~YN,X\cѰMU$y"|mW X.e£==<0-^ta~9c""`!"l TvԢVl;z!aSWb5hgwװdh㈸p I陸L=ڦµ{ *|HU4h,fܠxwW݊Z=vDŨl5۱x.JFrFn~:$HT{N#6W%U:B|)VJrx`P TeWR;.˗J5FEBC6>ܩX0̂Lq\ + [w /UZ.}IB&a4p@xV˒30pe)uҳ:;#Ugecc&`T@shnk#:S0p֥8r ΄_6asd42tIQS'YH֯p҄4+Mڠy8{* ynPc%ӌ^""c!"sq˜;nՇo|C~,:aX,fCJ? hK>2,߂q:kbfLxqp/4iLJpF}3c2*99kuTCW?Ss{o};`BNc Wx%mIPyn`w<ګn]cIi)ڼ4*ФuU,>//!>p'p\rGDD`CD&SPР+gV˰x$]v6$=/ F ]ulx,;dHJj$TH?줯k5J!CH5qJ߆57oY_#듒Ner!樂 7'7):Ñy&F! Q>M>TV4_IXZ*\ 6jFQ65O?5='߼j26XT~ 쒴 "L yMS O)cW_|8a=ǘl.#y CU*86*2;p/^Mu1 ߇ץ#j$8H{L>PW3\4,GM4߉W`ƆPff+XD$iÉ3z>)%-ɲ}Yjxͽ85s'*t;ౡ߷Lwjv^ 67jߗPr[zw37䶯pa\0Ivv%]*b!"HŊ߷r2F/74[ꕯYztB-ayU:gH>)fu#˷viqxE] #CUxn`}\]4e­}У P"!Ch^‘4,; ~DH_}4n~flGrwc`^U}qpO5IJ dXm'@%7s/.TPeݍ9˰UsNN j[ h\UͧU؃Qm`CDpa1WFny ip- \A>s9 9W=jOJ$*0H@[" ul/ΗcFu G_/#$ >r5ҔT1t2^l&ȂN^xyHonh!0$lKn*7%* H=*9cxj`Suօ DC~kfI%cb!"sڋϢ#ڱ6G5W`cLIΐ HUGN݇ :s!慄d%/PJV>ÝGOMFn rrBV& Y[ٶI)zz28;%4IR$KZM<7FEKw٦Źnԙpr?tτ]YֵEGLMFIg9kK`j2"2o7GTyByhj}Øvpy,eeb]"&YdJPPD7\d)f2&㣝0k^lp8(@$tjtJ)Yv\)1;cӼbbz=9C:@I쑦۪# UpqR:N*vӊWZ1  F.跿1# SU7m)F9Yɺq~Xz ǍoK??^ol Iwar 6Dd"٘+Ʀyv:_ՠƈh]KB?st%4d0eM.z!dX#ȯ写jRj&K)"<Գ:>=^j9Y|\K}Gx!%YOVt?ޘ${M6ךÍ}{_ǵ]h1$ZHKuCpTaZ3{q93[_/DI2W /}+d܏t6i8@bgݿ!CQ>6 B.OJfnޣ[WRAG'pR"_w *!hoH\ysmfeF ]rm-:5\ZY:ζҥE'L-]G."pF~ͦq@Gh۬Vڈ!"2ew\ [ce [e'/;t]UCJ\>5tSnU3 %iݹmwFޢ 2d5˽ƺz,+ H銬_wspZSFx ]#J FJ G47=k{̺6׫ǝLL‚=-U s*aoި3O?uF{cENGE}96]K[!ƆO7l|iy ѯ?UF:"J`CD_+:>;\<>q@FJj|anwc}Ni}jn$#`@:H@1'dn6Z@# Fi @iEMBT_f>bfDvYƞݽ޺fkP")xG8cuW s"11Aƾenԙ{ΖM#8)Fs {VAyu(yn5@vz i0 m!sEώHHƏ"t#RK5swŽ*Լ}`}OcʧFbXhפ599To)P#F|2^N摆ک0h.xg|=X=z75{tȵ8rkjRZcݘ{y"(Ǎ:3ݚ(]}G$.uk1dZ A>>e'э`CDcqW NVb2E Ln&e-껠trSN/:fv4>nn,%#SWI@Cg5D`j%x>ERMzeT`So58 T9Q!bMs"= a]@ͱXu J*݋f.J_XeiD>Y:Sq)3o\?'ɾ7G""42>$$hH&aAƈmhTFE=KrMrz&RdlrLJ`E#}!| ޞ#d]Ro/~vG!GϪidݕUPCDD2~`w""*^$!C7T ))Kuڙ<ʲ"wW]m[:Y>c 8p#UܜЪ;Z7r׭>ffkG_ԥC̴I FDD`CDD$Hu4N? "UdXˆ5ȣH`7wcݤк9Žb۩s:H9pq9++w=:ɣlHm[X[T2DDT1&˝fƘu,!% :oVAޮUHH9g 0yAL&W׃~=:""""""^ODDDDDDs`DDDDDD'"""""8(NDDDDDD!0p"""""" Q B`DDDDDD'"""""tnA=8Y[|6k*w9ưy[hѴ%~bp;^\P~\Nc8RePyEk<=4Z'׺0Ϟ8*{1pZdK}" UlSb"L$(ܒ" qة9qbpXhE:S \ _S֊RTǿCRzcR%QeOiBH7{?UV&Qu2a8aU'#EF&[0=Mƛ7{IrQh5O7BW?{_6c"i{&qe`dZk)FMVGqʺq~"vcFIf؝˰¯NQ3\zYapZ1eô3MD0íŏ~{dФrr4ϯhpS/HG)LJ*+*J%y:4'lpWQknjm4Y;=. b݂;chftm~zyvVyVZQ.Ɏ-(9s:.Z-5 j'Tkۯ?|sy ;y(ҧї_>|w[M+0mFddaޯA{ЩBYfd?7Dy.8To@w|y{@ q0 15 ‘,g ףyx vwtF?7AWNK)+nœ#]CƧ7 a+T+qV\V<Â6Sγ!E8;ހܕHC߄Yld+7K.e{܀(ŷWz׵w\T`JAŞ'ph-8j>TJD?=N{789mPӊ5ߍ!E% ^-?F>xWbN#) kq,:y3Ex=B.{ճ\#ڂESOCUJ]SmԌe}~F;.@˨<y38b 8aT_ڮ1L#^(B kۮͿ^CBq \nyOͼ~ 0;>1ѱv1S9u=a n^Q395_zC^])}J}^jE3.4LL6-սa`I+ OU Q Q.*֌N\iCmqwO>+C΍U=uV (*4't{1;=d&Xe|r S^9HC&{PҋA4ɴبw[Ь=+9#kFM*M榋KT)OE\oF\XnjA4:^_k}"huD V^&jTC?F:u NL5U2wB6;ͯv<.'^?:w =mrJUmnσ#0"-UX k~[04ua0|tY, \!ܾs>)z u^vYYtʊtC=|5s}ɣ'm-O,=%6n ]xsU1Ǐ|EC)]P,Ə.~~vj- qW7*0*q`]9$GMV{~6ʷ(\P"qA*DS7ٸ'1;,ۏӮbt mCDZ^ݗRԫ8^=E[܉r-)M^Ρa Cvu!{{zY}OW*Ɛה6xݣ⸬Ŏge~j߃kxL_EAXhhs꽿SoQ/ryX_GڣQw[]f/[ '5cW*Z_y]5Ђ=r%`eQٽ%mL9s8ޭTϒЧx+xŅ +ǁOp7x{Ka&sKO&bX)lcj_esr/TD#,tr27[obQ~glZ]CNt mohk"-CZx{ GElh3Q./y-jkfFonv:P>U(՜yۍՎo3d+l)A\߶8cuuhߺV׊~-b=uk}mV[>x U}OyK5eSvnix oæF[gBOl7q]9>6hKv(1Ќ;ch[#5h.}RQLULc^,-\qe:%ˊ<9'suh5Y!l~Ma݆HvHW0bTX~n-B*L@ycK؋\5y!Ǟͫi8YaBJF~ ;]˴Ig̅̂YNPb bby$r^&Ut38aE]vใ*$6.#R`Coflrz{<31iqA Tʛʝ~` δ|LwOMX-lM23#_(vUľ8Y:7F\ǹ~=FT>7#;)zQDC~Ρd?yhD3ɿ{J3LeLBvֆ Ʃ j.{޿Ԋ<49(5X2rY _*"""""z0-r9Y;ojj;_[CZYsWqKӅkpY4=?;gS}~ԟԷE*؅[JΚiC#떦+gpffxߗϟć״?, ;WNB&=OȁS-@x4w|'?=v2s]pAMGP8R={ΈR\902 #j, Anj7&7bV5Tp*Ȣ І~ߙ+x6 65Uq`Om(ORyDDDDDl-۞[O=*+UQoÕ3t\c ?+W|+Q)fśO >f`[QSM[_."5T03Q8 gjF0jjjP3Ibń瑇kJrȁS/FGѥm=.˥"&2db&9~m5v"IXwg&\ {^"$Q~Jgo|6C_wx~=6J́L ~Crso@(7NBJ繹oلP>6_}DDDDD܂zHEg(?99Gwqk؊䬵XڄFLUCZg{on=GSEn+FT +3 d;jG`3zw~nTQyKoڨrh/<}\R8QNhjllŠ=^JyV=ݝ*\Kțo~/(,y0MgϠKΊJlUܗ`͉T΃x$*%pa8r}}rj@x?no"e*C$ɹ_|ģ;#w^dmYYn h8-ڃthCsJq""""""Z NDDDDDD!0p"""""" 8qXD񫶶JrhhllŠ\Co Tœ? 6mDI x#9nhė^WS8^,~))) eeU/WxQ9OWZZ*V^r(|IlظתS8`4N-_p8989Q S S⊓jՖh$s!e]./0L*h:.`=/lV^II*'| NNyRթBEݙ#,hCHlgX]gmkЮ6-\HXH}^:TB@4?՛ltwdûUȸΟQ T*Bu׀T"BuWE*Z*T\}=#lJ>׬.=Sw`:t ">W`x4}[u}S/JEh!f5yJD}-Q5}+Ss:#&*]گq}SȸΉqH"`}S( ܣЗU;Z~U4Dԗ9IwaعՑ]9Rq_:#TdW.{@"tG"sc@g[tzWUFbb" 8͏8? |ѧ_V8~ϿRqtǞSȸO ݑgT*2';|\"xF#?puwB'Nu69D)Ϝf ð.?gkO~/TdsTdT/| cOTd%OZyCIE-p2ʍBB~umǞU9K E )w{ \ #o+@1J7->/^> ODW_l1"vm6GU/t(oc4N=NDDDDDD1(NDDDDDD!0p"""""" "2ݪERMbRϿB`e-ճs7/vYF}Q5t-+O(-Z-jr ǃTڷb{D]vz![( 3_҅<Dmpv6F;Z6Ⱦ9r웉b"*pLvV,Lau±XvyD=;7y±+PhG17YesB5KW;l7R(ͥeS[CM ('_+!рϭNB Z/v^ Rvbqz6:)Ha X8PvE=1^t?:qr^Ukl{6(ׁ +6(ПY?t{eюLKJ)E5rr'cb)CYy[o j 3h 雉b"?$F#eMKT֘ mqˆTe_NVX_6aeTyMI^He#_~RAX_N. ,K- .-D_v!6mpfXaDaqNOݟb֎6mdX=K-a<1Lj`tV=CD:9SkV upH=CD (,N4o~(3; _S|a$wgA'ݭ9'ܨVQyc\N.^'?!Pp'?QbHNMŋ'זTK_6l,c"Z. hiy-aɓT*PNq1y--({=gN3h>;;YQ)*<˫h?Ŋo\43'W)I#GǑǕ+W*:) X*m0iRv zNI<\i֙Lt:a0T==N)AN\fϟ4i0BlTL bזr򋘘Gr~f ֦` >~uEXza^g_= ʲ.y) YV.u|v_6X? N!;9??FѦrq}Cn'}nR,uڂһ^܏:7fo3Rmv.]͈ב~5'^/P{ ':򟐒{wƌ4÷"cU r#4( `zjv(KtkV?_/e0 &ucKD= )<<&&&2pzH"pZbjߔKMMQo )` XO{'B|--хzT.ɲii}_J ?WzR [[/юe۝fvF\o/:nYE:VBbpHi1E שRFFzDZA_{K쟩a{cxף*屦m*U)&䭅.5M刃Se"?h6 7E7{ʜaMnkܣЗnxrJE}6( U8m ;fבٰ֢~%ꤾTٺP$1vށ/ }~W_GT#ܾ}WfLWWS/qQq#vP\я:rcwR2Ͻ=&|enc;!h_Qdg.VˊB\Nz0}ZP60`=P65';`=^[䀲ɹ>i}ٹ (kJYO[7fٿ1#g=6'9 tY YkR}ӧY>yĤ eWh{=}RoZ,AXNoᕖry V/D_6z!:'O|D &~VD瓗V@8!Sbf"o6@ΗK6d{S6l{%eAcm/6(?οI"{=YV⛗X"ɼ4`H.xy ZVDNkyazf|b V/r _,a~uJp_]o6;-fYvɛoz+ԋ0fSDK)'"""""Q B!T"b59/GRMtMJ5I ~_U)3HH{;Jy~eHeO ݑgTJ)M ZIW)O*})v%3i8؇ƀiYNf<݆ٛe٬*5k8-ٛUr\ }mLԬB8nTw*w3ӭZdhp~K!7)6߲_A*1Wٴ]_daxV6z!4zqS{J<"㲨^KJHT_$=>ƚu%oLoi~aש>]&0XH w{ڠMq 1n빿س*'%'XՆ^ߎ-pY,0lms6Xs(.`7g)}@l}^SfgO^kggc&ѶR۠m]g;7Dq>"ܾYX6N1N1?ΪL0p ,p Ws ?p`SN 8+X`SNZPr`'8k)\ i i֭`SN 8+Xh땴z8E?p`SNb4?NzDDDDDD1(NDDDDDD!0p"""""" QU/8^bV=m* Str0L*ł)#aL#1ifck\.8]N^YVvu?Xg4D]YHXujAiT ՊQ#Qp80*݆SJEfk p.NiGጪN˲gz}HlcC)Nk :}km;Z@zE S ieVGΪg՛#_&8^,'"""Z 1p#'"""""^q^qX\qJJJBaa?JDK iiR9D80V)O}P:Sl#-^~"+WC N)++;vlW)"Z.Ν;}QV^r`XpbJѼ^z]%HbL0p=ihh(onF'"""N8- b/ NC̏CIN=Ѕ^{W&&'t?8}qrgfkKpȇkm!eAՋC^q +NPeSbrW^>W)"Z.>|8R9D0}S NP="""""`DDDDDD'"""""xS ؋=N;7MD>yK̴_8͏C, b/V@ !bWbWb/Vӑ;s:ct m:rXhЙ0^OS ^q- bDDs8-O1p'"""""88=T*:)HLLT)"""ZJQd\N'&U*~^GS(1hDDDDDD (NDDDDDD!0p"""""" QϪ'gԻ^]RDDDDDD;;9ÆCB`DDDDDD'"""""8h^X[вſIENDB`hip-rocm-6.4.3/docs/data/understand/hardware_implementation/compute_unit.drawio000066400000000000000000000433541503277241100301110ustar00rootroot00000000000000 hip-rocm-6.4.3/docs/data/understand/hardware_implementation/compute_unit.svg000066400000000000000000001427621503277241100274260ustar00rootroot00000000000000 Compute Unit
Vector Caches
Vector Caches
SIMD 0
SIMD 0
Vector ALU
Vector ALU
Vector
Register
File
Vector...
SIMD 2
SIMD 2
Vector ALU
Vector ALU
Vector
Register
File
Vector...
SIMD 3
SIMD 3
Vector ALU
Vector ALU
Vector
Register
File
Vector...
SIMD 1
SIMD 1
Vector ALU
Vector ALU
Vector
Register
File
Vector...
Scalar ALU
Scalar ALU
Scalar Unit
Scalar Unit
Scalar
Register
File
Scalar...
Local Data Share
Local Data Share
Text is not SVG - cannot display
hip-rocm-6.4.3/docs/data/understand/hardware_implementation/rdna3_cu.png000066400000000000000000016032341503277241100263730ustar00rootroot00000000000000PNG  IHDRjTsRGBgAMA a pHYsodciTXtSnipMetadata{"clipPoints":[{"x":0,"y":0},{"x":1130,"y":0},{"x":1130,"y":285},{"x":0,"y":285}]}!V6IDATx^U)oҪKVqXt0l ?BK I Pӌ;cbMB3`7ٸȲ^h>o1ݕʝ}~=[m`ppp32 Flnb+vpt:{}}emv^~Fmsss`:6cwHXYY;}« wO*]I;v,W_r^t'OЦ->eYsR]soɫ:x&&&Z+\;%p)oOEsg:E\ϔDNceXǒS3s?TKγIy~Ѧ?KQަKm+3j]?~:*+ wnq.-- vJb@Qd/?IY| ;t/Jn;2?W/SJe3ů_ CxOk+KՎn˾a(W#kU}?`~#lOF~gJmJ:;/Jk \ujjd X}%/mdzÓ2/,Ux.~;`gK%χ\8 %=Mlǜ:vFF*{PS" !ASզJ6Hk+UNx pHU^^[ow7AQ'oO`;_ ?~xu92T_vTtV=<8`NNNƾ}b޽M ~ϔ ߙr%i:|&gK;Ϗm*{鷛ugғ\6Rm0O}4U[4;sQJ%pT*汞ȣJr뷹QճGMu*>$6h4W*<>:<~r\ku.j_?)MW:pii;O<~鑝jF̩SڜpQb×*TfGr驟J1N=Z[cH}5?ǎkhvv9W|$e6f/n  /0&n`B*袋;wЌE3>?䣬v|yաd/LWoՁ\J*צ١\QXG9.:?OxuڢM>.;ك2Xצd2tK/mrK7=觟>K.;]J.4i/d/rnh_EhSCx@~dN }4_h_m>p:,^p-}|CЕm(d2ק>tKC6dM mhQ>}!2fGp[pɘ^ʦ2 ڕ.p\Cwn\ve~.*ڊO<Е$>@z/hF6~EWڔ;|n}С6*NwxѾT?ص672!7yI/<_pF^}lKp zC3y]20G." c}ڀ vp+WLo+ x+Z'?mb v]_mC(d.\|#=#\IOQ}H9:PNWwɏ`Cڰ~_i'*>'8\,S_ڗA_ zɌ#;O4h.p+_pB;e'xsYlnI6%Ge[ޢmY+;֯Od[C J/Mы'yt sxlEYP_Op6'C +;UD62z?~Z6@:-9Y|\mx_ՁQy`ӿ)>xTNf~ .z\m=دD@z@;K+I`C\^t+tsg䉦_ـTq@YѢ\Ќe49O8ЋO|SWci9XxKp~K~0||} I!?} \tL}`Ors% p>I{||zؖ:]W|8eh. ٠w;}-pA=d ~}œ6~ >,P6 6^?A_+9_6Jӗ/\|Xg!+G 0#a렱2Rk3!u]wzH`dx I"8bѣMA ` @u]mh '<Ťߘ*UGxh$<8n)Wh8} a^s5M{o=\}M. ~un. .|5 O[R9KkYi7E9Kx3N]b|]%c0c$Hl*I~36F6'1O|_)=IOj`x.GpŃ\2E2x(dx'(9HF3;#CvK<)Oio  Σb>3}…ORC Tх^˖N}exy1ghF>_b[d/&[ъ>uxȅY^B6oOO}SOO"$\q1x%/0C ɦ_dAxt,j<{䧎49] ًc`^ȜGVYN|A?X~7{Z?I;pT{r%/Ћ>OOrW=sO~CQ45_ԡ~6 [mW{>L7eVx;S2!7|.2)|3=5돫yKFydZO 2V\dAhGb޲믿PC7K|S6hfᛌN{S^?ءq\>EY\,/x-CTGy:e`YܵO/ȏM9yNkf/ڐ~s5N+Ρ>llᓝ8 dN- sUvNQWc4{cObyor+up9Fݐ6h#cy|MH`GÇ_ >/6!%ă6ld''8OE>L/2?4\xDpp)9ql0`ϒ o2^om`Ie2>FLܵaԕ-ɏ~is} }9fmL%/*P \KW`'S@Ɖvp*G6-<ژt^2Kr[M7x7zLmQOOl ~࠭/%s>vGdM=kn+Ӂ89 }/q4 bnpՕE?}_6ɇ ,C6-ʲfcx! 7=E/ڰk<$ ͟!XDKct>em6+{% l [+Nъ(Yf}uڰD84`cdN莜*8䇆A]{C% $/_OՇIJL";uܢG&s2`d/}dQ6Ȃ̲?0Vv$z!c9AtzЦ>pȇlJ~9;qMwdO2 x'ov iÏɓ~VWړ6\;4[vс \膻l]ɏεD~\0F]{3p)d>p!Y6`zE;F>>v oodnF̟jRGzA}ŷ~8/:(Z,.FWC̎*!x6N?l_,ykJ~%/#?|ClVz'mfxG;~ыьO_vBg|q>VGp|+mN;hFR-oCK슭nl>zȀOMlmb# coGhц蘼ْXS2ghB?mYzk7z\t& 5?[(Ó:4O>Z4*Co)ϻݓ9Ѝ[<+?[\`lnjK^_6ǮԑSd\zeUF yrExOlMl=~Acp?_k9H%?N]q mda|n8>x:%WpOlW?cl2~ɋ.GHd?}>l \؀>|ooF6fphLL4l2чM; rBYC@6l~х/`ڱ?z1 4Mxnk8QKuR e/\x%'2e֎<&G ,>\k7=^'C=^< %q/\&h@ pQH8!&1XPI0681b>ę0H(RGQ -5>tCd 8-1h#HV ʼn$Ao~ăЃ^āN9:mkCy3Mړ)Zȓ0bUGIPR.C^4 y5(#G7!=S;]zPfpf0vF)v@' +U& >zB3YO lkC$cgǚCk>;`3Wz+UɏQ>dH5ࠑ\ؗv|}参D8ݠ-2,=(.r'/ j2^ }_؟&#=6IW) .:Ã:IMtUp7Щd%o;=p} _t?ЍGCp>|…&C`hcڒ' -z#%.*D>pgo2.!wPwҐ'Q?p^vBh& Yѹ&46nْ2){9e w2-.n(F?'hVƧ>dA6xүt>bnZ"c?i.;Dy诎,'? m{Q/\l-|  _'M'0mҟm;K~ŃD~7|ȜѢбs!|~8p3pчopfW;⁌{l };uڔ?x }d䮔Yq|U6pJWhG/;ѧKڠ =у A_-kt%|_My2/؏ϊ%/< zQGh};C_;4mWE^4F񂿒+ ݊0hc!ace'doqD rN<ǮٛĮ؆)ٳ?|O>m<[l#j,O2F_@}ڐ G_e)п j;qb6>1&Ař2yFA7;QGNeǷƊAhe_px"g}F, 9<%cf}ڠl%=h#fC~d>}OM|Q"E1n?Up6kPdXȁ ɂO p+.eN}d\qlтWkk.y[|kG+=αd/?q;tN0\/IϊwhE8J6Gf퀁%( ,0dh7Z @N䅞 lOAO6d9hC6@?z˰CEQO9 F .ic` #',1e|te|L$r 3"v]ClBLS-xF?K]M|ݐ!O}Ȇ1H?$/+#Oϐ~+C%?A‡^pѡ}h Oɏ̴}pk~l?}xPf胛 !dg2%?V# Ї=\t=gڀKtyu`ӯ)^Р=v&{^v<+NnoE>_ $>j/Z[Os%9/n|dI/dAF^N6†ȋ^ԑ{?u;:!|Y*=Oƣ:\M||=}n9{3E7γ :?4>ݲMF' pG<4\5oՆ%搻DON|_;ܥe5YM<pG|O&ѢY.R~Idvd6ـ!^WUhSY_ oBS҇-|I)㛮+n[Oyp/@>Xlч :$|BNmvѳ/?x+n~}M|p&a3?=O`I<>Cfl-U}Np&BxT/U2vSWAALl:GhGզ$h9npjlɁ+7|}v"n[ It ݒEْTB yO̮xG.R~F~W|O|GWp+9nCϻևݐ8 lto<zY͚W/^! /xd?x+ĸ ed_oγ[0q9vBn{oG,ݰ%c(˖7|Ç+蒍clec6_ɋLK~ړ[AI96/s7$#/rDC3h cRj8Umūmlz}G/~Bh&76C޵As~ɗ/l 2n.21&p+\d] B)d „刌Q'."O*3Xb|6 pa dY$p4 pX,dЌ61>(#A/a0pe 80ԡ#hoƤ y,89gXڠ*S>Ƈf># 2ڕ󢃡 oː .peɧVS-}8pN2 OhD?8ps^ CU4#7FK`v\Wx"c<9+å<@8%^l[R'5 T`Í>8>\F&0 'Y-4}~HI|Z?>ِ>ep+ \} }.vlF}hȢC?Yh#}| Yq4ltEZ<&xSl|MVYHl>bpjSĎ <ҋ]b ѯ>dؗ>x`h;M'8F'9fFO| ZΑqpy:ur;|…>1][ɘ|W<=]1^%}9SzGxOG^d/Q*n:/v}Pn٨8E&k˧!CzdA`]1ٸ $ {z>QF8d{[Eg0Ȉ%mOvCGeJɘ7B'7up >[|fJ63ZOt)үNxg٭xP78 α?z[#om'ԑ %?v.>ddd%6 öحl@.kGh?6KFa話=/zɏ9h%wlؤ^cp2~K~5vg"/<^| .]9tK~M~&xb#/ߒOF\*}#>\7|Ntp4|p/:/8d#|s)? ?2;pЦM+) rb&%ձm<ɋ?Y쀋ܴaoA|O*1V|x&Y\0A'_%{<ЕN)0C9"&u@0u*G`L?'LʂyڨP9>(a@ B*܄Hg8V'(pa,hkW h((`0,.0VKu9)E@6x(`$/e1Ft.dC& sI\ʜ_778|̙J~d>BZWH^'v9HlF^W?`xڀyA:2C* 47 A` U.=j` gr]UM=!u|E8\-GA |Vf/!0bU].4ѭLb65P.'p4)_Y[\ --doI}M?|YĜ_ _SF:f#UMnL%?rЖ*I>n=]S|+F:Ot;"ХMYNK8vԇ\k@5lB*b3tN~8.|OcC^vI%?[to6:=x8ɾ 8ڀ_6>Q'm;6|/.YNzO}}|+>A+P*VЕ>Wt|v>ͲM*qʎ͎чv/b8!?!{T.1yY} e IxXӆ\iobhU Z}dvYmTRq /hgod\^26a࠷?GuD?l|9K kӗ lЃ^A+_:*?2G_uUx7Ds" 7B+ɛ .-r=j+B~p- t|.T|~ɜ uO6 WNf_w}SAp&KlTB\h!cv/yM 2 :LnvЈ(;4Sq>> W'Ȑp  l)~тop%s$ ?yFФf|SqR!Wڵ!?$ pl Wԡ҆yQl4zy/oe N/7H&$|/r@;?e7ꇎnӎ7y_\\nti?6͠HLOE*ƆP>?vLPw7X}'}b!e+l.Iojt/]~](766«?nݥz׃ ׉g_f}1ݠ5xھ!x533snɫj|~e|~w>Qpt=z8ƷlqTbs{_D`8;]yb4''{;8˚ځ&-`lQfl dhP˄-ٴv~!d|}\rl>u|/ 8tWAG)l4_% ր>R LIe0/ZeS|iC,+I_-$?mj↦Id06ы'o bPŸڀ+v bP}rJٿ ] Z=(.?vx?)~^ƃ'N}ea4/>bmm .?L 2A1ujdGzn~˔f2L>3>*v32J6!nGS?;QO.5~'ȍ_~En_~eڈ6.чR'iqD/]ۚ3^O Gq|雝|1?*=_No'?8식g'ɏߚeLbkE~8[iGn{3N7recϾeo(}~>>+ |͏azxWy_Gr'85߷oOo&덙BڧNy\.4_albv~Ul[$~hl5'M 1Ng?aol --pO$8ѯ3գ3ͻA/ ?>,N\kb3<ݕ<'{t}wp'FR>meem':r 1Q?˂]?2郖ҋN<ҋ>܍L\Żmߓdޙ;з98s&8ud.nuQxBKΡőɭFmY)?лwD~`;`FvOq!bbEi5YY10}ztbk4vS{串`xw" β%RO^G>uU<ћzeNJ>6b⯒9/mdnG{w+ ~0hNח|ɗbL,T~ ~$UQ,f}!'3/LD~8tJ hM| PpՂ\ (ۀ28 vЙKgYIJ錦tu#rNK˩,wFr5βpҐ  L40(UZ Rh. G79 ރ7aYj| vNɏ<nɏg">ѿ3O5` h`OSipkALÃ?9<nGmzm-Z`3m9! nn5C^Yݭ\ lC`ulL)gRG6a46N9g]JGlfG)j ||ad;6bsZ.863L~%iC\doh=(} E?CaINLlĎ~L?M؝ 38(OvQQ]~h ;}-\9q[OPf&j|_|pCW9#lLtM]b BlOh^f9]ɴʹn.HoS{3[vlo8Ξ,S50l ނ5(lmҮS2 n0) }p)~E q6:}q(~Ձ#6HQz%E668pVlb jmӞS^!1*&%q3'I?zjBՃ'T*׸];|]QW=_~'zse~Wlus^Kߵ\N3Nٌ_X]iC7r>icMZjxiRnrmNIފ zdgfOoHFb)EQvO/+K9GHsF$猶16ލH=g\ޗz/?~_l9!}S }kGoOk\D}^v\ȎMq_OtCo|i?ԗr[ʳMX>K'%Oܬ5fgl_Z cwsŕ66(ɜΞ2]gNMl5>8㶏_m޸5V9QE(e6+E{m5xkO >ek{)~X͹IS\暽͓lzjzn+I|+5Tq]YetXɌ݄;>\o:nEcfyG_S.Hf ʸ?.T86$6JYm>-9FuU[p9JH`|`4r%c'C9aH< puF_ϹS6`kS< W.x}-UWWxfef} ,eY[u`GDSm(ZM;2L15|9\M+y:9m ,+Cy6cZF['gGK.[ٱluD6U'+`;s2Նɇ؄Tu[)0UYRntNpG~ڔ˖ 蕥~SG`Iݮ6E r?}]}` Bol2 为pr,ԥe^ʾ㡌=F)0.y:.ep17xFpO6.paO%6N>8 1WYC*ORKm#{8zC~>.O{ep玵5.r2/2lDy~(v>ct9^.f#9NOfqxڵQ6Wkrue:SsGv-ztlg'682U&<BOyW/d` e }6Nl`8Bze#S x@k钾+We A&+m.i#+ %md8a;[y6RY0-[ur[+6)?`'1E-vRiJ}_ݴ-|m.xZ B YhC.psd,\sxtI~xO>%/ n gَNV&9EœsQ9];64-wZhw:#I[SMjۍ8#)8Kfꫝ: Rק7)v8z,Cf69폼K~A_З\#. 4dEicˉk6Ǵ;;CP-f⮴ަz!Zֆu2QAl:ZǨoޓ+[mGk~[zGk"݁= 6Ll |:1?SbYڲMbLO䘐v]NJNıXȵu29o=} `t,&+vҭr*ۖ NZE~f݀CC]9,-+-.|+ Z&]de2\}~-ZIib25F.wՕ5{-'i$CP7w2z]Ör[N._[R40}Ӑb4' m.HVDs#h30䀒F"Zfθv|fpY^iliXC9aKCO!w 5!d\v9P%}Σ<0ѻad0'{qv񨌏č'+ gqn> Ǟ~elY{`V~ڡ쯇}'em>8萵7z'=&8SG"۳㴋-EYp |:{ڢ3285mf͗MC9أ%}rxbOVt7һc  ߱&wS >SNIs&0Ic󃄡2zkRXXTu~2z0VG'UWp -+կ}j.%I%}?̉ք \=påmUѼ~No Eo_Μ$ޘ=q#]9vkb`9]7IBNƣ lc¥ X'fX6FRĶvo'.p: &s $kWIf2 .|U v=mOL:gzk%8:_!3g/xDO"Q&ߒ1.=-쏯%e0m"=`ҟs963x,>gVVdx`$ڃYpd#>ku^lp1a69% \> [Id>G}pv5%Sc$"yxj'2|n)cGdfc2qI WJ~8䢫vぱ\KSxszmSc`Ѧ}w5Vj9!Ñ7ۅ֌.1}Ҏ@u5'b;+̍R156is79fR Wjaޙ:1Rn댌9[\ԥ6m~mKW_G360>m>rJfH$1<0wvҴݹonp]/5`^\"9N&r4;c 4O=eex`v3k_V"u@8팬d>=67Y]C9M]qf#)sm험le6V ee5R.?c`|;s~%d0 6EXJ=ڪl~kE/d(s~ sScDH"^mɞo/ɺ<'ge6E4φmљ6܎nhv\`huvrZ[s&S9Q.G4 IiMRw@~i1 IOBbKXzWdSjg74һ2AUP;館ޣ~9oya+|~ >9UT(v(_w?\RgerlOYܫ妋4t妷Qz>-KYTLG0-vXF]nN=#]k/mr=2ѿdu謲=  ?щ 9.2RTمfG_ܦģ=}Gv: $'|v戾h/SNٻz~%j_R>M~_|__?exڭ)~Vx 8?;^_MSh]64ڻbi=Bv[ŭ%e̖z $غvpi^ HS*;WW{ K]|pޱx%xGR/h2(:d4lm+^*8d\pi'S@kml&-lr,lwzo`NҒvdFN+i[3M#Iu{1=f.lmǟDeMyځJ+8԰i`\G"Bѣ?zq?|_mC! ܝS+O;j#t)|[1n?K/׻Ҕ+cEzOp1~ė~na_]d!ػM)ʹaȸ=eɫmpeHboߣ%j[wɔ/'|S>K`S#ړ}= - mII/hRw1%.+.-%S)%r/|>:nW{vR=ykQ%[|iWr8t^~}VGOB<zaBr{e=΃-먬xϴG9˧Ư1~-iiwrg,6zWFoLisvwGQd"ٞ\ї[;?? h뵓Ճ=[?loE{8p.8/^3k8:_tur|ͱSpria 6cAPrpltDG%j+w~;G^UFg?s~KUSe R>!/J_;gc;jw6\d_/E6͆/L^@F \lebD fn^ zrJ+Y^ %ĥ.*]:ͻ-zzMS1u}R)`ϕ*o``W݂lz3RRl6_NIE5dƧL.Me Ic*< 7UW4:}ךP$Cd̢8^,%\Ռ_l"#skiưޝ])l2 5d/;69тF>zmZ #IWxͣ )maw.ЬL60H66(mM'O&Ruշά׿݋}63rXk"_]I=CO'ermt4~;}Љo[_!?9\i vr1iV)86'wzeTƻTn "j#oJIWr3mf,]I i[ +4ߌlQݴ5$ω/LnBr-c; S)2l\n] OsOjg0g_YL-%;Y!;ݽᎠԁ~tR^vdz}&v!jK~[θ[v6G?{Oىq }3_]eW~= |+7xZ̲S|G ם}-&}7~SY;[Jvlˎ_ nҮ?zK6 wi:)yoSwX;{?C.mu2̾k Wlsnv->Kh*|SJMWW6uK!m,؂+9V]%YnoQlAC?y \}չ3lPzc io;xƐ]l2mւ9 nmԌfy4l-ffmfwIM|5AWwhŚ,̭.3Km)(25Ӑæ*m6mA^_hnk~{\jH35kG9j/)ΡGvp'VvڨF 7ϱOzrk3^FEqo6,Wew("S!5I<϶Ɠf:F6(7|fHa8jT:+gd,=[d=h\pY\[OAruf I@r2;o8Z9x1mG@{/ 3{ZEh,6|vL4!|WO<& G|eS>yKxħ.7)wdY?#[W{jp3Zy X{Kң v&_Mvd/mҔ{{K܄-z6OYM2&<rGF_/+ow$i㬿a/uj|o:e҃EYrVOx+z]Y\A2O a9јutr ^|69FH?9o/[M>rSvuIGrxh6Izs|$'R76k +ik-Ý(pY6H w/HyvXZ,HX/EtL m"uma}V')C+ʲ`IhS-6q (O`O%mEY.-WMɫiՑhRf꼉/;4\0K1mԸ0o3-M\vntg/6n-Zhw76P]vlm?cی`4hoOc#<$ίCzRiH+ 2o2ݢo<Ek[~(;txʎS[|%Wq_~i \u: Nޢys~" ^^ᔧ#y۱䀟v=}u .|gp3-qM;ކ(,!@jfbG&ءOԆMj0^AUnQM. `l򐎙f#`yrE!{,mѱ+I{C n/۴s4fe_~ m쏼ɐ~R~3qٗ~<!U.'>q́O`u~0Kv?8}@΁`wNaGO?e6iI'/ࠏ_oJ~ostE~iՏJo$i9hy~4#w"qilC1+ϯ-[Hk;=0#P)0$eI^DITG_uFePed`j ڤQNZ ,腫x NZm N'󠬝QF:<+K\QW]+Y\mԁ]GCn0Η("# ٷcaۮj7) l h^8>˘"9c~#cCMN,3Dɧ6주儧8i\emi j2~;/}FV 6~,t5\#3\ n|+\.Ї4};>0-YWy,prB;Nڞ8fhcp*c`N7rq4coo,C w-cҪMtKǖNl3Paq-D~wI]IO8xH@%|o ZݖgE.M)_P-h&?'&-2zemK~x1@7ݖ{ ʄue~7o 2daQF2^&Tf[ps m6TM)8p7~w# N>ʧO_>iN59$fن+u>n<~9:\]?\eO'}U-dm-/Jm鮬%=Z7$۬qy36}M61c1ܱ.1Ƃb,U8#>T 8 FTXWx8cN֧p|ŝI.ޜ!d%c¢9agɼ+uD #Jm-'JCu3wͧRzcR,oֲNԝ:Rj͚XWy=փ6+i[]ѥ Afqm!-5Z^x>uKַ{.Z!W!Nj@ɴ]9vOFc:9f\^OuO[ X# flx84XeNsNL[̘8ƭ26hX03΄u8 c eUR|!}/VwبIڒ3p֍ ֖O%95NކXєhΟ]tє\yrkY46I$v+ w}ˏ$'˅AR'kM,<}+xw\| f]d#j 5&wmb N;dSƭQ>Iw"M:sO,= wKtgR9z)[*ʋ0#{(k3 gk%svSojР~5+';-Fv6v10>^B4 :kWFܢ +E/O0ՍXpB515u*˓ӓq9lv0MҐ_ϲvu#% yOg8e]EYZzsS{xIHTC:OGv4]-?兹ƷzC/:]ųJWЇw0@% 9Pdܺ*yWq%c)Miz{=3'iw5`tl  p[J6ӂX םXsΌ w^t9"zvk @4)1Ompt'#cb-y7z=9sًtMB.?}k{YYy^ydp*^ yvޯo z^Q_UYb`_}̵E~Ox%v ?e~%?G|o| ` .yݷmbgq*D>xQ3IB@lmQp>`ki&aλ:vMԁ_GR,5 Nm2˯غb6pϏЀ^e~|+F`:%4SYRޱO|Yk[KER/Nǩ+G\uMIPoP''&{b`aִiCi9nƙGQⱁD!2"{W]g): qeȻu\Sl9 G݁xɤy Ro|U&Bʮ̘ԣ=R|;^/ϋESpוuewLMԨ+ʹH¤lt I 8z |v\ep×v;8^e0W~ 9i#9{&mo.e̞K+oٞz_6gAFTԉ'!07Mvw\FL? {,q&}|nv>ȴW_>vc6v [qc?IWf[xG.>-#UYF\U޵Ez"ײ/r_b_/'ze}Sz_zֿ=^kNQ;Aݩ<ڢ:{.Av{M"+C#YK'O^Adk0m?e:F7Ghih=N1ܛK7vt_}O]|˚k9J-`I~/T9u8£ Z=fjȑ?v9x @*msܾtw]wվm1Fx񰁹;dB5##hYn$:8]-EB7zvF*g9]{>Gχ~ ɐ %&x-fO=c`H2Flcm&]\Lo7h3v;.//(9`Wxi6xn FNʽ$'ޤwcb5pp^YG ^ػ27К=˾ƅOeƖ_jr\lx}?v2.`lՀtϖǺS&' ,Y&\?S^Tn$6|{GXƧo%7kC7cj?zc1"%&TzcB?#* Ck1N\C9Φ}.r4{1d{!m,ea_n+dfIm/9D\wV|mnHbbLDzzrI3[ો~kmsᜋ)Ʈ"~wb]ln\zE vWgo 36yfvu)dYuGϔÛLǜyE¾; 3mŊ*ob3x+1pq|vcf9H m†J+պLc<]{{1"u<ڠ6jO$t#СCm3Jش6w'@t5?/j/䴰LDiS~brݖ=?|û⦷e.d9'be;;W2p Jb`E/t.Mr72֚zTswO+6fZ#Q5?ι6og<m^3ݾ^{e{[@'6SIT빨΅9`q qӛsK?><s:D\>[XMVΎ fcP/os~oҴu]t*/ۑ7yp ef !ϝi+q=wdOqUj@&}}6)xLxսznL*|N0A̼wudWzJ 1<{,^뇆rhTum"E3(>\u\=ska-yTiK 3il.1Q|0VqQSJu6j)-j o*ӳB[/=usLddu&`yId?vwiڝIf@ޛg9)tlqy$~;=*.<6./LبUWlڕENwq>٨!nno&}5QO<\?x^s80'o?xsmx=s\5έq͋>+.ϊ:|(Үb|8?+Xr{C՘z'===ל'WN DKO&=_MЖb'/Ίw}8N ӟ~ŻNg}F[Δu\\#빚nn.{)am8gEr_SlҸ[onE=]mA;3Q^$O6m,BԧƮ}D:{3H_7s8u]1s`Ie#2T@-;y G+?4yޮtycx{c Ûݩbo){pd('QN^hf@94։=xJw|gbɻNr@`eo|4ꦭìϧ//bק"}cY^:<;7s͜r`=f,Dmt Cc9a˅/ )9)s2[G>>OZRO&~gV<.幱 :fbg('I[M@P] ~?Z3^+S_ƭS ;Hhtz&6ݝ cII`ƹw|9!<ciO^HJK/hǏ;;rH1vmo/ m#qSbJNvۻ&vMLpǚ;/mlv%đX'>#y1JKcq6708袉q{Ѯf9a]n_Z13 |G*a4ͅ %E9/lb6'7y{$qbb= b<׭)sjy>y>[f?}:ӻ=ԧ?ԧ?`yn.'VWr@\p%q< zn}%^|q/{+_؆{/[X\nf dmDN2snivt&&WsIi8nw /(>^.751݌o$x6ނkIM$/1} =k ɓj5;cuȓN3Ny OMͼSSRnZ|OnR^s`_}Uqbp#Vp/m/rњ׵ᷤh_a7|`~^UNmԴ/;\N?wxfNo{{;s2@ga:ߣԣ#Ǐ8*ޤZ1x-Zk4}1cޫp3?1b?u"YK4p2nm K/=޴Sݱ|wܽ:<;zl\SwT ;fro/]\j/+ߝs9=pхbwwZK˽͞đbhfMǢS9&3s^;/G횆ުC}*cFڊGF^{],NL|u٦FM9p=jSt/- 3[pB\#yw :p|Tb<ؙg;yy'x9sSt͕1req1n)틓7(e.6ii^02NwtӮ?l9y9Yȹ8'Nȼ'i]6kɜ21>Ǣ8K6?̜n諒Q#ÏeЁl)6mҘs>Vnнw 2G;ipQc4Sݲ;P|ʗ~I7˾7lďuVNb{-+=Ʊ'\ Ih~r{גJ6 Hmp5PI;WxJ6_i.6;?>bS1\l{s3ǿcX}~W`sp`l5{O>'>/.,]o<֖l#AXoencշv)X ԷRr\KgF=ZSvdsƹ[u੅vޝҟڳ;=1xH[^[s;7\Svw ~"{pmeck|:1­ጫ#i$hks#wH3df1_Ox$fky*,eI<73nub1=9.y?o+l( 3eiV#S\#:V(5;c(ǰ'=I-Ҿƒ7}=4ʞÄ|%^E{ pwy++1n;X>V{GIjLy(5vSSv=/;~y'N}N}N}L fީdIon<fycy3q|o֜-W)iiO g~a%ffciy=' gt2v F5='{_8SٜPvM㑪 t_O.y'ԞTo5vvn)M'@g4.9`cfcSk rq!6R09Ij۬㸒ݹ3;w飙wٟwӟwʃ7=ӷJ˰2b4GV3 Z'&7GcjݕrOCk?>N}N}N}N}N}ڑXOd`6V6/ -Jܾ\vSOq7s MWrv̩q>kCqߡo{r66^x~7qn#hm6fH\ic{<<:7s939|1&20'5=1.䒶Js.d<86ǵϼ>r33sOζ>c1購>bhna)so"8KdH;dީϣ%} giҎ](sͦ^.l\3+o`<^,]TjLz'K;i8wrZ3:9#14KXZ_NÕvqcγ<̭ bn E.cXk#16ԁʮ1?OΔ5'ۺ(idO7Ѐ/m&^Y#0i=esB_sP$Q;_Iԯf |<ަɉ&mfqi1Fڻk;j_ӰEԫ=c5ܞ|F 73󳱴 lX7[oZfs@.2(2mA ;s2a{0tl3m=cF8p,ϔmf=CNyUmgZL Μp=/ÿ́}5Fx|RÇbae9~ oztKH<3>=xs#G'\Ol6ٟ쪫rrsR^~E|K8iN['fWexW|y?blr26'?Y- |?Gx]=5]qE\I_U_{/(3IH7OzQPl9w 8d\SǙ\9\uovvIw.<wN,<2B ˟Xޚ%;wM`/N %-))+ԧ?+ԧ?+ԧ?Y6ȹ=T]O ܛ(9stK}qq)#ic9 :tM1|d4qv b>t?90{ݒގ[ޒ1ۢ~:z\zilg;qjv69`_yM8u*Oӿ}wvOǓf<C8zT f}??7e\1Թ[sujg|2zS9^>'b{ cbzw|³qw;o'>FWbtz:vSJm_=Z6SgQcpg=fN{ob20wfb[j܆<|.=ؼ6磌c2ҷѴ2db>K/Ǐk?2 {ze]y{^잞l_q7M۩릐7מWs wwƞ\풵mm 0mb%AَX Ƕڝ8WvٲAe~,B''fY<|Sglv:qbXLCLtݪxi|_馳Yk~q]wJx7|M||YO zgNs/'@z K}V)G+b3E|?ԗ|n)W}Wo[HÏ?j_WR/Nt#>>)wх,>S>9~-OysKC?3qͧ|z{|W,8 s N--a W''gԋ#?9~qll^ֹӺ;s dcly>y>Lft[?Kn:\~)ܑ 5W}9ZXG{2jf||9z#ċr;3{=byOXy{fϖwHero5{;~(͂7_=kw<{9qߩ ?K8vEx'|~;g<#.xg|z|صwwg13s2}y~4zKw;frl\{B.r"YT_e{ <3(Gޱ% n#r=bg|M昒Msݘ1wr4^wu ?G\͗]nZ4>{3 ]rs~ ʍ"e3wD1yj.Ւ(؛=Žxn?Ö2yuql wFFOxbC7T5:#3[>6AO.3{'Ng}GL{9jV쾿6r'W}%[8{?uZ&M&^HgkӮbTx{;ϦWc9i[33I8^kCBښhO<16\#[6z]kMmxOBE{viwҘ7hɯtW7w_klW{ڂ1Ss+ڕLM{d`停h>crN'`=\~0G"WcuPl\Bqۭ_Ҹ~'~[;b.o{E굯o+˯=Gŷ}w+_uU1_O:&{~~'btt|^|g~zZ~LLoe=}Kx.pvXIs+q4 kW:~_K wqex]|??ܞW$i{kjmL?DIٹr)N=ſTz!̤Miw|ŭ9d`=V`fzY`Ǝ,oܤ d|1W:W1FbCsӎ侹=7\cyd#mVNӿm9z(.`|ov|W~U+)~!;3gHşK#?[+#G^uEox}|~_|7}C,<>_O2~~*͏?1v`_苾(~5o!n5. GguqOsoa>v]zq1wߕ7W&ޗ~7ƟǗᅫK.΅=O??s?ugg{H9eۑmKkTޏ?~r{q7?M]w쭁G}؅OK.ucB Ů`~oyH݅7daUVڴG1sP3k͜PC)e4v!0sѻc{lHw{u=Y=4S ?6ivMGƊ/)niNv6m&S\i˝\O~$獭=+H}7XK7^;F66ȅl`||Y8|^1Λ1x\wOƫ_wLO ۞.+s[zt~]&kXبy ڐ|jƤLU~,'d͘( )9-I298߾zs?1Z[kq*xCgDŽ`eyy+Tȹh߫}!w4m]9r9Úq%<\˝)eW-N 6cjmM1+˱kzW;l>|Ǵf4/Iޭw{O>v_dj.&IXDx_k#|M {J\kvd"hN6r☡6g̃?ZlNu~q{f R/2<2$zr:`r.y8͉`whЗҮg|j@ߺUXH9n/s+>.Jbomu^VǏز0?g*~:Ţˣcc|}Wx'<5:9m\\ueq }x[z̞8cȳ_;7sxy׾&91~#u;sqqŞ=ڕVrtW@lb]ӱrDtmo{[{Ϋ_x/1cc罹&;6'gNJ_(ЧMr}%JHHާ_֝6nrM;.:xQ{'~g5 8xȑ# ;Z@HxR~vΔJvCnzfFz~j<9y'Ν{n{(.̌lLPg\g3Ii_cac5<Oƭw~8e9Oŧ3i~[bfu1qdD۽YYX\_7ž뮎~Z㧾3c3xs/ :v$2>Ø_x )Ͻ>.F d]otlv[o|CE<ϊ;O6+řaa5'+]lo$^>vX6?2*KhLf^l_3XOƚT㩗Lz{-yЈl?>D>bw@KI0q둻cdr"G=+^y/]9Q߈ɸ+#Ρo?qEx3~#VNS1=<kK114W\rY'?F .-^[My^kw|O謮P'^qmĩG.~<)N߻/kYy~c`e=pqM7.$FVrK3s[qctt\OoOgjuUk+I1.#!#r-3c<9 9utKvgN # D&;.Fw$ֳ8vd4\1'T/9͞E)[% zZYb5ugfUމw{?W{ ]'dEfdH~xOq'{)SGw8z畛 ؃n7%}{GM Ύ믿o&H9_*Kտ04[\tߔU\o0l>+c/[󎚷ٟћ_WggOƯ D??G;^9>9/W+~m\yS쟘[']~U -򩹈tՍx㯿>n/+Z~8?cS/$A{bɸ9y/x^贰?}ǻ_}u?1cX{|(Z'}_{>X?6;zwy_zelz ?-_׾&꛾9~%n?X߈׽W~gwb^tIc~r&䩸<ՅG/o+!gf?ߍ/}~WU?暘pJo̱Ok?'̑`]:z"6NܽGկx >-^˯_y¿W cli#NxCOFS'&8Ϗ]4-=v+oӧ79d?,< %ZG)i]-l vSˋqla.-Egz*6&c1`QfP'Fr%~Ğ}m\4/mG&1Ņ/>H#|i+ozssylz~HWNM6]'7I+n7O{bll]㩑D<7f5p_|UW]6nַťϲml Ei{}i{b;cs7o'g=%;>ܜ#7$o$4gs} FLsxi'Fbu~!fgo=NNVw~1w罱;7~(K'wǝ1^򟏛[771{r"6Ɖ;N?cbly=n˷ů=H|otV]_ƛc2i SwWb8u=|X#w7qb}u?C?=qdoJ{KPNn;) >uC -GhڟLw֝1޲Wßa>V\?7m0k:1hfm浴={뮍>KTWjp\!hs* S0-y_o]E96vD6䶣 I3PVw'fb2c-#rg=mMpU9]o,>iI~FPfU3'gb~a}m|g]n|{MX4{xÝ:97ccy9ssCN{؜_#wlmoHo{G-p[^=7]q-ƛoqbxu=r_:~*/,&VCG5Kqv5+GOƮw /B}=6W38|7OmU|Bk7`ý36clc8\\^tuE8}!hKmgޑB;[K|ty@suOd?v"@{p6hNK|sY340^'6Vr,=H;F=۱ng<*X0AsNpR^KS=& `l$Z]O@5ٺ#-`li cYόhG~s69=q4ѻ~%' ɍ0mp q8E:t:~~jtW%8&#fZ;lt*rdd8Nl.jMu➿z{?{ҍ&vĈAZ1>:sh8u$&ۍG[xt'|̭,Hzbt,2u)8xkv'NnvFqGn b$߻r$sE=ӻwDZGk=q}KcD?>woN=΅dL"Swt 412;DV|wbr|"'1?w*.1>9,54q5A5s^+؟IjW*-X v_*}籝z u 6i-؛3{g~Dw0NMN.>xQ۔(kPxnu!w5Ycm8V#1}"ݴGVKF62aΣ;h{vk1ˬLg쮌boDñIʏQZuغݶ -ŝg}0kg< ˱o,|͟'[n]H Kox}wt[Ŝ)\zEyLKx#9mſ]m Ig]ԋ6V] nGTxɗ<Ū1\z¢X˜9A1Gs՜k9_tVRfdkߛsؑjfg0nx{R 1j ŞG^EX?xaٽbtBA762~҅c o#JrOk{RO3k嵴Έˮ6|S".uJpܝ1nxv%xEmkf0XOuF(ئy88/{ [Zؘya3eY rLiņwOio(vVV\Ұ28OZyN6{V3OaoZ͘a^LhK⃹wϨ/:esV\9_vz_~{XZ^{6Lu `@t種\pvyV6bjl<&SkϮAvĩ8t*hl;\Y𯲃їw+ K OezϵԷo ՝L1 ?cNyц:9\1TK^}Άjpݍ_J]_Mv I^F2JA5G}a5DNL<d3污Dۛ':iÉ2::q۵-K:'Q`bg}s3PHs5XBx}NN݉dY3]6DBr-tt c-9[҅6?l&M'kՖݔ;_ҿ9)zȮ6ˉtw>Sɻ=O~ -;卤Q>'ufZ?[^NދWR/+&c u rs%룭r92ehN wÑmmߓͦ69i/j3f|[&39HOKpڦ^m yRmH'/;j ֏;jzNZɕ/=;2\e3+gfvTۗNI[6R?G~}XⲘHuBG}SyL)\b"e+qqWO;b|I$x='OCm6rޟgs5q* o[W>ᚸϋS?5?ڧkcC7ԍWH=>;|}t-B›M#w}s/o`r<^:>ũٹD~1oHܞw4\+@=ޜ8 ,s|85) 9/:^8dCG,2bC[I&ᡭ=FLLH엃qwy)4n++6!, d;ŕXZYш>*qk~7ALUzs9qh㊣ѓ9obb=#!ͺ"dnoݞ@Ά1ժm:&mr*Д$Ql)ꤪ\v?DZ#铪L'_'Hd︕(٨ӶJmU>V[vR? 'b`s˭wM[jg7nQ;ұRH_u-X祌  oqerIc%'&Cg%~; ~J {{R#UZ~sdQ7Uc˜dO\g}iD12^_ k{Jk)S4ՀhOdZ)_߻\pV*]\w8o;w;s'}Ʈ H :S6ķldC.2;:[:a(L\7(L͍*Pf~3aܞJ/vTu4kuZ5erqU{1*V<؋JK[ǖ<*;6G>NCOhކOpw픴]cLOf=yb2@w"wcgѸW*wJL\KVZX_oj{TOگ{w\.6'ù[L`<{<>|G[ӋK14:ܮ2/gֿFSeeia#bXoGPu} (aߙq}$7I7,RrYo窕M;'}"`O7EW񱖋ijoMr=;ч3K$Po_=%i-25PnzhI=߈6Q/rJz lM kRrTk;9oMkd*y=(w+;*zz{G{=,N;xlҐOo~-f[s W^fvG0)EDߙRΕIKpW#9/13)v=nl7~1\+i)W_O Dlexqj..Fdڨ1a~,lXPبq7VGj ,z@νCw$D{J'O~{y];y?㇬ ^ɺr9[҆}`;>hٞl 6r,,zcM[ q9ʫ9RlNk(OS"n`Hw^x^u5Jfm|dF[Ssu,8TwW\|QV)|8Ӗ@zL ZjnLx=S:~ :>)9V?'Fѧ\u;#>~w%:Lݙoo% %iLK9sx{r8;k 1txK^^+9ݻF )Z5펹nG_j5kc~fnl23b/n51ŘڨY=FM'giq<3<8 9#baX|wbό}WŃm//CF음o\}Y/l7ߋ~U᷿'^0"{wzkݿq|?x؁x/boπ=܉+?tL=ԍӏ'Nw S>Vb s>I6j(7Cp;7ĻK/m7tP9Is'6i}n|~a. VCx6h}[;1>5'cau!:鬗d~q cF ~9T@o h v+;X5$md}gK3'?@kH` f~<I!W]~׸VTJ;ѷ T{\qs{+?Yൕ L_7|r6w+SNY}|ܖ iMmo]ۚm%g1;<۬i83(Yu5$M&ԽP@i,.xq_JIL75LmIΜw=ώ94|Tg|ԃW? ?!, A<{{Q̦.?sF0 61f8X?] ix(Lȳ }Wnw哇 ;vvgxUHмhg`T;<0 =|0 .L3:x,u&BBQfXcVzH9h&*T}(l'Dx ez0hm7dz!|C3L\y׏g`~֏ox!>Ի_vU?\ V=sXLaI>,L,᷹ YCs4@fε3nQL`pˮ 5tt+j6|_QQ5ncww.4Դxj# 5rp[.ϨP# YazS .(oth^l[b;l!M?po>wj|җُ>+  >a[q_-IۜSo|-?h;ϷUKثUeYooS1{ngm0;lC}v7bӦͰp߱|gvio{㟴a1OgE t18 #4;?B: 5L(5?48A/1`kꪫ|e 0Cx$3 aFcZEbGSOu P0 X 47ؐ-7y!6](UKg+--c, 1 a{@Ȉ#4<uf^XY =֧mQ;jv'?xZY~68Pp|gBx]}P~taW5_Rc.]ԶnxG%88~˒t3X qN3<ȗ<<*MIUoaXB~aU A6Ѕ0?7c}p\O]q<׻~l d JS'7~M:oq't!oJ$& 5+X%3+)>cWkW.vgnw4|WKh48p;wEsاrkySGYU|~<7Dž^dGhRL}BWY_rȸf[S<):`dR;ϳ?f >w0ЎǹjZZ騖[/ >>1== C̀K'Xgڍ}nrU~]j}[iD=#]m}wڊN6so6 ؄ge[+׾i9ĞA_dIsf~]ye_T{~wۚZ17wCvɧ>hYv'~Y`sgc.W~ͺ OP#r4:-a [0t0:@:B1ݕ-OAڶf_l,WÙF7F 5|@!!^p4n(+@NONQ=&>Y) |ɺ:ZCMf+ap{o)3԰*ۘتuY!".E`\{uۨB=./eG7#Mo7ʑyW)~|S_~wƁl}b(vP/}AC)XL$_czv̹g[sRȡ#qv'~أ4$%;|X%`q?ncDmP3jZ.zj5jXQSowa1kSځZ6 Y{YI۰RkJk:ݾY/6l䮇(dmIhg[3'k>^:bgO 1{.M_nfk>~~zO|>wZM~ Oukj56$gjkʆ` MPíj#]H:ڵk=C XBZ3<_nWuYScf*"dB!Gyėfr PCdx$ХnPSٰQ0jĥY*^OC^NE$\yz.̿ޅoK=%A: q^BޑvǸq ۀջ)V)AM$W?xDZ<8mBt>$ޅy׉4a_Cp,]}RYFQBCSV]=y zTwOΩXS.L V%2 /AO~bd gW{}Kv(&8`w{|LB8혞xGȳ+Hg߅$.nGwn({L3aa滭\ƯUHh&^xM/3R26(\9ڴj`[G? 5fe˖j빅QgFj0^%ȆV)mJKMkl[klf2fIwXq̏vx~IyOmWߦ]xvF+~_";-=V1y ,aK wąw<|4X-ij-At^9弒v&~#xwFUf':xkg‘(V%娞uB49.5Vjpws;:g! vnowt:~ngܮO?X>#Ų5ǚ~Tֹhy٥AUΪ?L8l]j2)RS񊯨zؽ+,n'ܮh&v^|o}0aQ3Pɂll.2_.me6u9v>dSb=gs7ۿBkH7][{6{ُ۪VپI+hk̇-W2%{ߏa7=v5Y%o|>nW?-j;m;zKS/~u]:OPq̙3]mp_hCd2.]CBGկ{+iޏAj8;,LFs/qpIU,~t_62E}Skr9)?91[(OUzty=&!/39xmyLكJzUNB#}% "w\-XRV4갂_WiwdUz)WXP;(sA|lToBҎ/+TLT^`1?D Es*'', B k|^L!:9܍s Fޏ(ߔW:z8gVm(\V?ՇYFA^zY\&K>cF}P¼ɩ#*?\/Q|aX9WyxxDBWD*ST? oWȧOxܘl>Ҽ,f8i-UQջ :h,PuҸ/=sf цĸ!YwEVfIkʫ5~8WWU|3cgQN]Qx>-!R0K +G>жF{YZ2u]̄JZ0">ߝ'P09xL8kG2 87a`:5%ss ;5]sEGr*5,y޼|Y *4fX9'ˑF-+#0N4D WT>}/}7^ȍgor KAC$A;v!S<M:r5ZfpLc}aXbW?f}7[F4Uxy}UG{Ӳ+vB{.=y2>)sʟO%̩@8;̗՞% SEIEn K Am ƺ Ozƞp]+p.{ApW/Q v IGy'I_9SIԋ%p'o஼U² P$= N焿e i [ɌMIBфт0Uͭ TTLJq?,)xCd}~*VWKs غu#*[qfϬB!Ãk 2Av^_V"-.5s%oloz!/> Ma SvDJz]0TVP&ƍvo~m3XVZO>/F(xq0,NpK-b724h`c,ŭxzkS?ӷc^YBio_Ц6/}u.[l#y7` Y[GQiuݓcf})zطa„p~f9awКpߗ)0t%U,^ ><ܽApd:5l_RtWMZ̚f̰D()rNRYBDJ5j<&I*zf2En< |HQ3BzccƄLQÞ JK!pc##3^tJIhzQ ϸT*mCC^t:%?EIOKKO>O94֝ijRL$[4v9ӆ3/qѷ^6F硇mCZZ͉tv\h_mbF_ͳ$>~bi/[CwB}zcvOs9! գ|}-XQj*Yr &A(9~sV|~Ή~GRlv cß?5ǣ ƮZ̶OMv:ԓT.n{}E|"g.$e&)9zz,qƊsuo9sdLo%?9x婂$WuUx!wo ]qN˱C24BQOjN[bhv[2a lhlZϳge'% BDNGl\d$Pz5mmϨ >&VL t^ϨaM}z[ėvs=wBߐ@*0_(:oq9d-.}'٬oŊ}6<*ڱ{mn$[1k>|w|'A#;mu+v+$*-yX48uX4! x\$ #iCYgW`)T[DZ %2j<Ļ>#ah0j#VV,?NJ*4R7oD02ٜ[߲H[&wٳϿȺ\a/6Qjꙓ6ivbl΄уWMtaMD@~i5,Mn74|€+?C|C^f^n wtO~[t5;?|9TXArSSsƆEZFk-ݛE65P5fXi|ģkB'+y/G~oz$]ߣC0 ~^QE+IX0u=x5vO~f3R4GYOǎ"+tؐp^ww+P(Y#x˞wgaLN;M>Y}S-" PC;Z-ßP#yVU41D,1gᣱ%e#ҹzeKǤC&pb\m\atF$ v 5Ŭk9atҚEÆgEsL+ _ÃqR)JĻFXY٩aVU|-冚{jJ 8 Lϙ3ȿhk p74 C+3%|˜}kd{ΎdmI> eat ꐀ3jX׾:ڃsk*peRF&,sSFPݰ& j~$o-1~u-zC5 Ӊ8DqJfhq.efT=B#lΫYs2edf™J`ϤU^_GG׋)̬vuMPLs&Ϊ,'ܹsh>]{jk|[CV48>?c[,"\!V_n߶"%7wbM0љ2a^00Ea3; 2gȌ 3#yD >ȇxғCK@ud poaͮP@sN{ڌi=֓|1´|>HlY+N8îo#6"º[ײ'*hC{~1#Qo!6 BqL{CMhRi"n=ɣ5{W۪nM;,ubo'fx(L Q)M-pn`u=t"* ßxnGXQx67?*m{x=+mGV$%L ޳jv K3xI Q<ߧxG>MM-6mt~hJ7'_,#'Ld=}.ErK=:'0ӧy*s¤^Gn,`!(8QzVQ][B +!_OK J\B="^ (Kf@3hvBt=8}^?*bT= kSUͳ^tf3K1K 2gkѸ,l[RiGΫJ6{s׌6U]U ^QSzG6uyDtJ5xxIf @B8ƣNsjYBRSZ#~N?ÿ+r%gqPQ0],܈Dy,0 vsx~HuXxBK%=S^F^;> wW!3J㌼hSwRdjoxvlLj,c ;2p*{C_盭mҬV?Q[ ں/a; 9%'iWߓÜǖ6iX[;VrO&JakmHO\>"Y:zzz_{pc`ګ]# S/aq&ȓ8<ƓQd(G9m YѼ,'-/bie2g͑lGlXtq7>6`,dŵwr k $r}Fm$ Va{c  b)tŕ@VWم3!w̬q`(j 7ږ"Ec&`K0HĬR#dkZIٍ+Q~7|E7opH>%3R=LSn|ޅ+zo ٞ/Z=C?3 3  D ]C盺,~O0R=vTƨp'f К5֓atU% Cu$>d2n2ōYw"4'FBDa N|<;> &g3%BU܉YøG#uoB_:ҹ:,#`۝|[< FG-+ OQ< d$V͖ltDSq5RMUEt5);lXIqG{u.a@v"%1h@rEP٪@\:)3.ߓ/a*iΝ lFgs!BC~So#l'gP[t yX~!KmXI-P,-:u/@) ie&QJXY,Ilz,@UJ6ZDgho,yĊŊ䔕?FDZ/83q*=q,|( BT厭CU(4kl>3#pqkLo4HFU#yL*Jt{g ӏRlпs#O\Jبhvtu8@JnŕWAe%Ϭ'lҔDZqfZY9awڼ, _\5VW((\M C}hi X<N s'LnbT >lP6smp:.GlA9g[Zvʳe'˟vivCƛnrk.$ثWZBY njÎ8qU-[{h .j)r=sjH_䨣g}qv%kOݰWR[.y ?lI^uk}u זwvz֩:N/^sKn8X)3mYW8LYN|q{D;$C70:me&"߄wt!LkK5J`D8_q0"'~+j#uZƎI̴ }km6抂a<;mhan|e#FQʃ{ ysPt#cQˊc!J(ޑ߅W ^0X{rmK𣏴c;A*XY#=ڎ:X[=w-:`2mZqi34͵EKYy mm->|6їx4b3&MVK#` F[ۼ6=Vj_)c͒&,]f< >eœ9$A[}8BGg&w΃` gvD:o&{ 3gqϤr9~bKɋ>3 40nۡvUn%~,9f̞]7o6oOcSE1KijkL73>Y&V(mʌ>yjкvo鳖6_ o$y>t=9D x ȱ\Im,b}[>̌SCGMP|:3g8#^wjn}oy\L f-Pq_M@ '$Ч, ҒXQc^hdɂ'1xn gBED|WrcU*( G~CȗxC&tڙ/E6km3y;#nV?Guk'->`zr[m&)&M3f>Kt'o\W0ӾJ`M)m[-U,Bd /[m59Y㴩6CM%GīKM~lX 6$?"Fɛ)g>LΉʇoM'ÁsꩧЈ{&dE~a=!x|C3rτ[6; /˼㇥BYxvvsm'x-; 9}uMh+P2]pE׼ڎ8H7,>)jÃYۼ~k_cr-; ;3 EϜvZ>퍾:׷wx<~ClǔX,IDATH*ni""wZ#՚{ŋ,l\S/LJ[xy;qW)t!RQlUڒiX 3y埲P$qb$j&^7-#vjWQFpKq4rjF>gۡ/Ė{-Xt6SldJmvY[wyz 7 [̙6}6MV5./CˢsdiΩԼocBH:9Ųxꇴ 19agh>仡F,2eum>t90 _Ҧ^G{P&gK`itz#`>Y p7`Ծhe7((E7oKއg҄ϾBWFq0IE 817V:Q`F wXsnj8s3V'PR> U;ӌdҚP4[%,tm.i!P;eL?#; # =TxvѮ\]~v ^hH>Y|K73Tjv/Ϗ}>/y==?ߣ~tG>_?9.~^e`~OpwǪ#>3pX\cl8q3~Chm Q#=Ǝ7M/>UqtY~f mko |E U*O1VX0"L#$+f̚iS8R5k48!|!n~c{l? lay}?O|쳟o-uEs߽y?{[J5gy>b$ː.3~B7;1a;`?w (/lƳb޿]wu_.{lz;J`brH;RV[}It [Z5ں&XF Q >PX (ẘ+S5^2-('z)E]dOۛD;;[q ;sl޾_W~ؕW\i?яlɒ \d_=77e\voWbqۊGrc r1(hqs\@EVN@06jRP?qB5(%\妯SO=9~ΑYo;#n,Wr>2fo/I" q_ 'wrY9N:$o<{;uK/#<ʥ`U?Oy};߱nwؾx&NU]O|ϵ#8*>s 6z=UDaO [&F̈́_1J+ف38PtspoBSO Vކ:>t ,x=Q20|f kXѪ9-S'Mfힻnշbδ}ǏΕ8smeOp[oU#⁛&='lP&YRp"n%rɲjSh۠ՐNZ+4vpyέqyk .G@|ԝ^(glI_ڃ=+P0d_y<.{hJgB(Wf /E#PU~u.ymmŞnٳ튗s\=g+3fδc=֞{y+3fmiRgsW}r쏍Rof[v]}_믳>6)ՅB_zzm% t' }~S'\WeU 5vn,*ޮAtBFC`am%?m[nV{^o+| !f/쥞巾v]hcO8vvoos{]q+쓟rr_s|F1^}_sǘЇ7p3ߜuC=9XηAYpgu;`#ᠡ!c۝3+BxLx7;Јzᷝyx<}G}~Z/B{_~9+x|^+e_nw408Ny;'?|=c/yﲯ|v-|Fy׫bxӧdCZ3M/}ž+XS2R1,OPo=a emTCN0+fK)V&pf3}R|sy/ ,#,u Yn֍}s*UkL}UaGk};m] ^;%.[rqGX츣\r]Kx~--λN8x٥/z-w5JX>#Iǟ`macs˖.RajIƃf?3gTVm'x}đ۽ڟ~2yH>;bwqFr_ھCNy Mz=fyz5vg?gF:y gdʊj["wڕ{D} BSa[md~E84b!|xd7c;?D$ =;=x`4Fjp >% gQhf#SS3 32\]ە`G٧®ɯKVݒ+|?gf,f9`-oe_f[rB;m9xq=)[_&asl'o~M9xe8%vɆ60"MUs!8 V(q7m :N6 ZvɬGF#=tt\duG / 2 Z800 2.1}8~>_v?[I]B0XM0{l[\o"{ ^}gt]|žaڴi.dgt?߷з7n>_pd28V*駟ngHpa y o?ܕr@>fY9ǡoC !p [( 7_+^  #QݝCGyPf1|<'3do{O}c+-[懜s 󲗽>Ou]g/l{8]pCu\G?j]֋5g?-o~c?;'_prBe)"xH0^c?INϝ;il1 \~ϓ<|~ً^|]zn\JuC9f|3C@dքi-އqtv pJܷmiv՗h/tSe7x=삋/^z/Q=}{ZG4}z70mph[?{7$B9 p-|{K-Znf޴ٕ`ζvgLEPcߩSzQ|+ϽoygbB(F(gp6JP ջzc?}R4V~[ Ҽ֯]g'pcgSϰn:eկq@_~iWCS)?ȣܘ2y괱գqϟ0pe#'e){g+.Ž:H:iuutZ1w# }γM7-G ;ӦL>G~ZD5,%f=\0o_5V>͘6Z,.xPݖ, O֩Vm#mn^U>t%h1_wOTړtyl p9`R6yWkU4a'_'RXZ2l7Xo6g-f64oHZp8/t3|kюc.LQ.a}vkI% ] qwWXj8%<.Tq1 Px&ÐT B0sH6'_׮ #$_GuM7}tk5[6Ʒe?ɏcfig>O{ן{9 .>9#|.ϬEl )o{pꆢW.;==WaQ+??]Fio`~ ۡb~77aWr~l\+֔i6 n|iw<>)zW]ulPY*xbJ: b0`t!z~cӟ- ]GX}ݎ8FX c <~']yNP ݗw,Xƣr0jchVowN̼R;Ew4sOwgW.pЕFhnntf|uWUMx;޶/xvLVj'>ngmx6s>ng5 36G^7mwv F2}NGo~v=w찿|0 |ʗbo[;?oްэG_i\ JMk[.s'ڙ_W \hEG[#R/f\RB N30!={<1`8Y28V֌ m7b-XƋ ]ClGmݚNwޥhK_jN9dW^ctƮ߬of74~;)>۟G_]5}ӟq{,yY.vc!ƘӦ* =/|%>o|k>zy9~(ɨn|3iD:,`ý׏A ۼCcsw} Zw p@>mK7z#Ch{8!]*t[Ic_>S1KJraUMՆF 6[!-|\=  ;Lkc|")UBտÇxuh.L3zz-]wq :6(>FfVU2p"BA(I 64N 9 qQ qanO,x*q<{`BGY _}ߴN;V^msU*(FfxbApNu]+K.u = .8gժUr1ʀ#P~YK]׃:Ȗ.9N9{9{f@GV= |;VQ{.)ۮ%j6ypu.41ʬ XO{{c+wc}Ǹg+%S0h|_wc Fz McǍwaAآ\V@Q A?+o/gE 77g?hk{{٢: ?C.^z{7lw7:`+yM$q8K$bvg:/| 90^I'(ܬ?/p ,?x_ՆQ'>0,gu GVjq A0!=|&cskk{~G>!ȇ?l>VQd5n5AGVM|\cG?]u6e$*5/WR {o=׺7o1fbш5VJpkIBS>iCW9eݓ70Vưʅ%pȗփw/mƌ b&4CNCHwFI% |&Xvf&-UҥDWJ /a 4hpe"|CZɞ/?;@XWq!m u\nov(Bߦh s~1Cϻs@ X{@kSxٷ>IJ:6gC傥'Y-?hmy%&BbN9ͬwSvǙ umjk7lkfW5Agu6uڗW۟@XB.:~Ǻջ];tp$5+iAysc3Xu`;1Ɍg| 4@8!U$0DC Ny7@Ojj7~)q}g{]sc:ҟog98m}]ȪlhϺ:TD6_kS&M#;Ty5J-?<4 aIFU38JXUlTpᶽŦMlVȏxd*njk!9<21Mo|ק&Fսek<-eG9p|]ڬ3}KlÏCwا? {˛`=wݡa/NSN|=~}N>#:J͍iJLo[M:1x7` -9fw?7XGW%_G,ݘ|1gzV>=önZW%h6e6A|qZ+֭o|@^ZˉlܰfNf}nhnH%CA&k2BޕAq( (Z2kkD:a6;uN谢AonFk7ݭ4K<ΔimS'YN{DԢԣ &_ށ^K.;\-`vPJɈuv;v'}fؐpg_ioyۛ'u雾>g,7/~ 7Ӝq=6oپڻ.[~1eWcKחV! 2qx i0^ x +lVٸ{<4aowx+p Աօ0=xBygΩ %sJ/*KR!kpϦ$/nچkn=X-vʉɴE0pUj-uŒOnZo&r@U_}C假UXg:׵}ok~Sknm=.j&M ]c"8l=0хc۱pw` }u,%0 p.K|0u/|L(g0~V/J"q ,3P<,oV0N0+V ,?>y^2˜9h{g3hRJQYJW}e=IkB,}o~K,{ۛlU7Bџv v֯Cﺗ;q$8{F΍mClw|!Vy]؂,M]GVN8Q~gՀw(7Ű" "BE8OBf 7ʗㆼ(,|X@&21ַ C1JAG!}+j䡇b;.I=lIVģ\wb!F 쭛l׽5҅ɸa+%wcn.)LOo}[=dAC: sgXIٜ߄A٤a N2{`2ޙ b\z&\xa(~pIRX϶|իldG%pKGpǪ!P.TWJn(t=wc;3Y'3,Qf( >^.fW=;R̡5=s 7h:4_ !#—kU?np~4mfSfLsK2-R8:m5~E?||ԀC -nר:Z%KV~99wi}[V[Q;#.}Z۬mξ*ZϺ56w${ۇ>l'y߷f&YhjU̥"r_5i }د;z\;LLÕ3fr]~͒A]ǎ*{ÏPbPQ4H4wH;眳%i?f PΛ+Ez=2KgZ_w}ߴ5~&n.|R@?@X?ZSSd 9]vg=iD[$9?xljQCxYv_!7 u]kƴq6UkB}?h׋wYGgyQ{Hy{R3M>&NiiL1Y9[w=[Me/9$Ԯ cѩQ_)m]n6V&YDndXU"e'j@{P#a(U*5I[zX7 W)nx%-^d^|!kn[Jŗ#/684hw=-b7YgeY~I[r*(%x\U&O<:(>S &N<YejZmy.G=#d[ÏkSp<*8w0{j2a*ۈ`>G8Ѭ;jqAtgD-1F%T45N&ZBqCjs)PmΗ+~xMDo7[tkh裾>~ &9q""܋%CMM%-'oDc \|[hƜ wW>_8&<7HL|=is%wmZfl m {mnc5Z3I6X`Mm_;;3q_+L%|^n3ln0m#B2m-v7ⳟ<{ύz0C9eGl@iz0 )5"T6 Kgj&-)dpGVW !ң+"y=Y)V.܅įO.o}w,4[Vq%ˏ;: 8"ycx h+g HCLlm͵_~Y}kKlpۮlK$.;uϖp.ԩ}=LƒQ!L=cЁN7} 1 6$V` Wa>Ϸ`rYAFB<(6P9eb&ccʮR_Fbع23Z)ҳFfSۚÏkˮXm51.&|m,)c ѧ8 dG?^Bc> a0k5!&aXIc 3јe ֒DMίŕuu}}OT KE֒j_sfڈW7semMBeR(Yم`섂s=XK<|΂cqq(?C#48' c Z;c|8u #Hњ[mC(X 'Ib*%C0n;8[~ }[mٶ\'ʚ%4Xv۪nz%+W;lϷ\@KcVn(Ԃ{Nkυt?pza=me(mn; L-\{|xQCOs ,|Я| U1`0;h x/6rNи—mt!RNϱ/{'ؐ<Ρ#!{cUd5TlZ0z=y=,JK6HɬVO.zIyφ.cq. +&0 ܞGcUSOI/UmŬ"^?Ϳu rq&aBנ*%Ԁ`c(hdžҰeWSmڇmRCDJ9}[ъE;Kf~Țgϲxrg>j={"%ubKv]^oϚ"1KL[{+S &uZ)fmmwD5'9Bjm~ v Sʤ*,@H4ZX<^,cv6- eȀ蝬G` '>AHg8xxtt&@hkms~{ (SUC6!>L:H/uV 5rR]6R ¤|lftJ%aS7\iZ[v%o}r!x,rs=O K{WJ:ޅx l4xՕ#4Lx}lN;y'>fm" jO!it~o3Ikg/VnZgLe#u+t"]aݕ̕i+ƅUѦ\vv)>ekۘQWЦrꉪҮ[ZZ $v׮=ΊL ^q E@؇a†?a ^LL 5 P`MoXy2 5+~KJځd͇-jllЈVV4TP v>p_!HE %S3[mR­V?h-^ltL?}ﻖVڒe;/VYҾ}_n_tXPpnd쫓#9 w>/wRDk S.+ݶ4S*v\9To#ỊDYJdBC\g{:E*!o o;D:Y A&ď}rJ0E ?F%ծڙ4b)JyB>^Cg[QG3`@8#EӃ܂+c*R.RB6ez4&A;2)p F.=/1u(;ƞ] {/.ǀjo(ORꇼ!Tqя8+e ԋ/Aʤ}'A8HHڿwc}J0y?ЖiZIB¤7V)ٱlŗl3*Rb?*>lY_h"Mk~wBCIU<,z9:g'vY<|S [OZrCc7|#M&@:K4fgmIxWoWmV2q])KVLp^PbGn4Ib)INzȝ{AGV\<P3meV.垌+߱MuU1ԔPzTu<6ຏqꝏsq' 1;OZCJxNc?<M@HO]\J$҆\]Jm!'#1%d}J44\d'koK1`@ڝʂON~ ezYon?b}# ayI,?U$pp<1nj+&VXF `uc C*Rhg,a= b=11ZhѼ:U%?**fQ+HlTuTZYYs9gW  y$KTa۟UzogIdk*aI`Uٖ<7##\x 9#mRDm:'U`n c0@WO6#R#8V_4.$hGp}׀MF}-ޘW$ .X;h}LD2*8bDf >Gm?mg9 ~'咮t~~ ;auOc,d V0`aX<Ѕ&QD@K;nsL[խ~$3t &&4 )#hA6kMJzn|aX>S?ڥ'˳ޏMώ ҏgsa+I)gmtD/Ȱ&݄b"AC:X] VOmw!{U{{ggwmr%-e8tPP ޔƄXڷuU9Ѻmh4F9B>̓űʏ7xyc0"/Z]Иk ?,S#}׿F^!FDFq1PeCwPkH,"Yi{l(Ẍ>o=4x{߽nci1m}@%'|J%?UqE[XӒp$$yR~uL{8裒s *+29Hr]N&%0/ q}U7WXS3Y9lB:.[R rlbUEMBga`%,0 * i 8LI!PFoBƏ* gQ\-E;$mg7$0˖-:G.Pz3{H@TM f]FkXٷ> &W3Vnm _r;lM¥_$4L\C(N TV0#au}8 ϊZ]1-[j8r6xr@%f!:p8YrFxt_D}L8:/zENx`cRfTEL׊֛QҨ-=M>AO<[ &.peDk'_ǀ.l7yxcq@n$O~ϛ8?i kF|KmMv7j- YzmϬT^ lSs;' rHFd_2𰵴XKW}SWY!ˋilʡˬ[}>n)v:~J_Qj.Vpm >$U`E F[ +o#hђ m-!n_l@Bׁdǽvˊ{#%|"ḬAﶭS39w@Ca6jXXKلv}H wd/v/7XKETfĎ>LeY7sJKx^87RG1[T \vX?Z:,pzFrn`b9<]r7> )#SQ.H mUMEhh0 A4͘A;9"RC1+/y nx!J0!mmTIV Kn4+5!gH58Ʈ\QKڈ4!(=7ΌH2ZBCXf*Y$L^!B,cIOۨ @_pK g~GYeH}"~ f<+l4@h*Atٓ S*?*E?f#d\M J!oHɤ|ݦ&,/e_-o h,G]̊3XH=Ս'VL>3j5 Dp~}eD$Ǯ+}d\C<%WJ J&b6ÊalJK]cX,z3Q64jbʗ[[SBk E72E"n=;Vx].n]'o^rP&'n)hܶQ+JrA*j%Lj([a2b+ K16Ȫ6aC kKؾoVjWA`M zwuODi}M7CF Χ%ȳl>`}va|me6C ` 6!25W^*kn nv56zX;Fm Z8O\e}Sj :5|mXJ*PqS)0@` 44 LA'eo`f%(#/PA31^:GA^;wu]Pǻ)zPą9; Y?Ѫb/f% )/0 (d>Xza)X QsVlK1?&:>]L_#4Q`+hS>!>u!IshLaIWvLA~SymPX\(|;pacƁj̦֗N+^'n-[k,%A/˧~}2!)C 7xX@D3mYBCX<نyԾ_uCMCp.`g~u\/˯| Ft-,TsžP|S @  3 N겫oξX& leWbazt>W6Lio3h 5pjd 5])EC]__vu'D(0v}5!g L'vv5(*&nƇc䉊CB;\FӇ/2|rL =L q&xhoꎸa{oB 961\VUEwH̔EcXÛ[lP%F-+%kD!rrrİpr@Bdߍ iCsImRI)o˝]ؓccrE`(s%\ꫠ|/>1d@`lX0 ۾ǜ |Nc+9Rub̙?$ڒ7mb-n[yv_fF+6.y@N8S g\.#3jp֧YC bMVпo֔Hn&ld!+:dXaK_7Mc7j֬HZ]`9g=U%lK&rMv~DujjEr"ic?XhbaK$cVΜ ~A‘LZ\h Mk07Ԉ/Y` r=Ɨ$&\T\Xto}b Q`߹{rr儆n Fp&&;Fl1䬵mr۝(CQ yjbpQU>)!ǚ2V55d|K~p,%R[s,ct^WۃVn\Ͳg0#2 =40M9P= s$O]•=7n)z*c!|.񨕔09+1QL aOy|}:X)] hC)1S_e ) uP}#a$`AC2h?m/|8p!-Vp!%0P.+v$h+ލ?A.<}h,TeȤ6[v#}̞X 5ԉ2T3z5l+ێ9r;Qf!hb4P 3f5+Wc֠&_Q_6)lõsq~i/Co-'uvGhwG(wvG'缏j$a%fP$XYY9{Z;_ڐu:a6.hZ3CӭuG;isϨ=>3d8[M|{eC}=QbyzͣfjD&m#E-jCGwXği_S㠋k /!di\aobڗh~I^rvύm\'S6ڤUo~  YR?XKE]ZWJ(9±P~཯JI%3ٺ f=!m,9;i_~Kk&ѯWx;.G}vt3`h2pPHF*!@=#ƋE_ŮdY0b[[JRΨ hf*q/0!8\/I.S]IE~_e*y|ƗB 5c>Ov$Ohh~o04؄ϔpR hDo |}?Q8Ls8} יn[FA?S[!c5u&Fm-y_TyV],h,o?r 79rixx ڞ welqg-̍CY F3 +pR}*/}P1|.Kڦduz|v7U; d]3jÖJ0g;Mf9]wgh&j PI[AktmatVpiۈvܝHtP#̓Q?M\ѝ'|oyaܦ̦ #cz*N{K%(ք/knv0PMɈu/[oV},KťDQ~3 tj4i:L&Ϩ`AL `lcoE\PA]jB}2!4)o | Oz״t 4sa0q|>gp0r0B^YH)Q?CJ[|)FL`S' 13eSg\=|<#KPPPH&0 ++#sFqv܋.;o6K6JzQ/4Ԅ ]u!@Q!9l{f9/[87CDc!?%8FPD]f7s댥mSN9͘iկ[TD:c7۳ 58_!.!"MR*j̳)Kwk0)Hl>Y1C )`op"]o0a0 oBQj _RhI D%DU(r+|zV@< r0(!4 *#^SjE5.fܥ_K|-LaGPFwGGݐ}삌Q0CQ>L'ICy:l\ SCM=$Utc`}O[U S\_D҆ċ[~M7˾o[{7:CW\nx K~& PpaOvIv4L4aۊk0LxF$o,Z&CT$2luUU,>V(dUQkNeN^f+'l<)vCDD`ޡdpΰUm~3+ݹ]'v'??2yDŽ1`veN:94<3rϛ; DL>nǞ#,#bF mvϗ0"cEMAŒ >qkPĮ5pC͟o}rCM15JyK/뮾چzZ%4*\qLjaAi_QwP!3:Ιoҳ|8@,[oP1pv!u#j H6 ,al@TǶ:rExOpKt ũq/ [L_RAy!c J!p7#=?Ѹ'a+Y|Z{{[D+P:NDa C4 jl?I|IO8ℰxց4Ejh0y z'LG Ϩ+jpeu7N%Vo։jD;.>.  B3 ˦M8ڈ>||\pIiKJ`9>񥯸&ZLuHlYsٓ PA+Gx(!xV&s h>2xK >smw,c .sy:K&h1[hXҾPHY3oEk(\8py׻ĕh4eX o$F 6JuPz@܌Y-Lzkl22ߠNoXH$0C>]+dl|qvqF{SLba㉱3uա}.{+2,6ap"M` dd/joM50Ty&+WD@N ߡ|BOY>TʲEG&!վo[K4XZ+[5W\v5YNf&'n[Qe-5+z@BN/,ÆvO6/+ FJ"\s5s*hL= 16P!q6$x oL"4ù΢^cy1;:&_o)x'$MBaޱ, Z'۔Dvl J,e1BUgXaLBGRJ|AF}'v㿛sQK "U+.H 4~+=퐏0\L?uHKPi3nTO ڠB5!mA$5wK}5rI 8_i;.v$C).VL j#Hmkj:4o"ZV1(=KP6Kno޵ٴJi%o-q\}&7od\2. WNalW0\!猍r4oĠ&cK<Ȯx<?^~ox:#7ntύ@ZP/h eJǕ7>iP *;!IHnJ;%NDxATKn0[gۨ+! ooKLlcw(f|7Uy~j eowm=|G+SfFǼvO8> 4V ~3Efȏ `OAS*>GUy@o80UԾZCOS#xGe2ik;Ov }-z%GF}>yVN`q̍EP^Êc&[B嬉S~?'48DJ+d~S㙔ل.(Ǫo{!g6u ؾ#첷^7Yo|->8k6p/zU>Xܹ%~6'+>OќVSZN,XEWsX=lDc5ڤ'jJi |{Dž=@"7ߑ)>| kLVpc6XQ$}.\n2 ,XYk?!Vd 7ǒVʊq "Bņ!{E| [^[,X&hEmBkUDhG%>յ_Ԉr&nV땠PNIHCՅaf5z9+Np52&!9AH0:2F7HhC Y18 /ը)eOf&V9EKR+ 1+iI V'ք$}9+IH1^Y.<aGg}JUWա%hU՚T e%FV>&[׫J'mP }DЗ 7 w%)=dK65[o~ؗ+IV$0UeTƈހdCF|;^ռ?H_snz|%ӠxĆEEJӛ꫒Ǐydr$Y\CURwM!'bmk>+%<~*ɩѨ ),ڒEljSEEjjoYcuG>̐ߡ1LXCg14%ڦAm-=F8cqI1΢fsb^$JbOó}S;zn{b7GGz $OSlZth( VqᎿT; O ̇<6?kLrv[-a~%* @Vo 5p6o6e5Oܸ[$_EGA}, #8_FS nk>,@$B|`-: 5o3'+ʷWXUyըAr,V+3%Tv9o6@osIK-FW»DH,MfgnL@|T)Zks e-%EvPmo%XLsM0P臊da Cƙ#ДXZHNi9orxUUesLPNcBrD5S 9/fDe'Ί1<.v" %Hά+ɨ_ ѬrJ nOH  ;-1Q!O;=͇6tǼ'|k52bEd#mVtpaKmQڴ#N3_"ڰ￿57/vYK-ykQ_sw6eYJU6ehHOT:H1==/M.XZ8"}6qLH\Ac#m3&_[n+i~<)lb;3r?^K}8<z` oDl@o$Zbl@Gx)tzêxlXEb|5z13jmn̂ !>خ0`I7 XU8LbR 4Sgͱy`]ӧY)6y 2s9'2 ڴmxp&O1by&uLP}>mu ڈE;mʔinlNfZZWhWgOƘKydj~!QJ:!ąڴe[Ǣg5v\H%L_l)T3)?8i[긡FJ9ameלVKՏ-DT 4YSD S[E|pu$Km&[ճ&NiTO^&jD:OY3l!YNLzD~MnȆ3Q[xȑVjkG1M%h&L -TԶahg Hhm[m9imcw6لs-ߚ;6=fsfylP'0WsdLpnPxsg1xpA=LBLŅxQ)J8> 6[NxK0&,aQ݆Y .,#@bhPE6.BD%|!o"Vzx A QCMYoaXmxѳN /)Г BfOu0S]Ї/axq{3E=/&v L6?=>n9v]Cc<VՒn;l#uBiF!3ekB} 8[U*+odgm) ۚn$je#8uh@i% #㥐Nɏ*>ū ybg/۷dbPn{!_-7wai)glhѦFjHHlK12Ąy~ׂ)1 ͮ8Hu ֮)-9n䖵 H(96DmhBڊ]R*uX1v3/!LU[0ƦtŚJ6>,ך^G,hCټ|," klx.ɞ+L1#_N #K7!ɚ-eŢu$ED\7 ދ<\[D~V}Sk{4;(XhɅȲ#mJm !U*֤#6VU^Vp&a奄l䔬4~D缹YYƢbDOv },k\jɁ~XH1dc4 y;ehl{P[]=o P1t+Rv&Y|%/s/.mO}'Է~kw6g힇WE-%?%gβČ):E(bZm% 4֠U?FUwE/~qй&0b085CcZ|]FE}՟;.Lȳ@y\(voQj}̗&YUx!b⸡Pp!XkHom}ݘpރR^dN-p1~pWVpL^|`&O[0 7q#C8.HwxccC[(߼ G<*xDl>ln8}}/3w>**^#Gy9- (XT% x[ R.jC[<Pޒi/W[{FY%B(s31D)FwҪ1o.C XB>1,Vy˖y^}{6{ۺv~BXV /jiǶR&N X4j45!wd-j-I1΋=њUkkp6Xa`sXĮmS˪Ji[xvp2jG{:p'`-,GnxҊR{4Ȏ;DKn("+mG۽7.&.jl~ ֠E+%l-)[EԊ>)q:b- &|; ٧}ؽ+{?f9S+_fz>Ti\G+Lk^R[|A63l^k n [IBOs,e嬄bZէ(g"Aa f1 &xV<5(nT8;0[}V}Zq/Ũd=D…/q8u\B,/Kp*&x6T53~Yy!."jӶS-:i~=[%d"7ok֔bk6wLak|Ȓj1Vg E5FWSpL(4u&tmg1{r9] $+ln"VMnil[uvgUb2Wb57JC Um|n8دT~,Zd ?R2lfͲXw9uogG0b88spy$uhb2qU*RԴd9|N,/@9X҈-?d;K퐣ecb1#g\tUmuK`Ί!3̴TQr%[!G8_QebXR^YA)7%mV;swDmbsy϶% l@ ʼn/yu~9[ kW46[rS:gz;h SW^fS/Ji<ߒ,#%AgYJVہb==VliFk ;m;Iw -nR6I)k%yA:̖3P#fxvt>Y1%sBo^B҉? 'lFIO۟Ծ/>y7ĴKZ>3T&C*pʬ\qw +M0z5xzJy`q[uesPkJ7Yr"?jxxIJM .)3NcsmF!\1{ƷmVG[߱k-I7iLˊaF6,l6{ 'L ֿjfp'L[-aj5!ߠtU=Yؒgh mH5JXFVkzmT VSL؊5kOj'r_}O>儧Ѧfk1ݺysϱ 3^"" 9%6$ _rd߻*o>SUe̦w}K_olIs]xr}v{^+ TDD"*v^]Q7TT@@^vC?W[Ks ӳWTW}hP7j87 !z.:LTU5X0)FRP_֭=^u*.(qWϿu*3zz|9աF^j}ԭ\Erd)PM/d56ML{7K]V[7a"XO.m"n^ۚ0%F+Dg\Fև _u~*x;Ѿh!f-?4^v80FWȑG 2 i̍?)~U,Zqh|No@~}G!&wVȷZroyԖG<پxWmC$~6@eu!5<:I- Ta/FXν˼: K(2oNcZnӾի_ ע%x+]-?t|.~m'/Fr'f-^bÏN\(S`ၓnˮ3yFByeZqD =yrRK$&} i:{(>L[cΰ}uv<s+\&^^Z&8<)Sڿ4 nNz^':jhb8M=7KVE5:KQ7cppg*hBo~6?Mu:?4R[Y8ˠ\,aYfmvvr[|iRh-?x8Q֥|F} -Xx87o| s!瞁SC`\+p>z)i˖E+p黮$q3>E \Gʔ HX?#<~m42B' $#4k!ZQTSp 04lށ li <#[wa#Oa~,zۺ=WcjZ܁u} ذ[L Csw'NTJڙMż30Iֲ -jTҺgYsIJkf$MRl'E`PIbr$ƩJZR8sv   uMꡞl;{:NuԶΌ4t6xuj*fcdLMV=( cGQ5b%DKHQx>Is /z;[o$MU'/%>:umP6h\-}tHʙgee4k䙊_[K^rUXC$r{H#ibB!ֹcC4-R)D#:׀fx}=e~_ %YHA:`ĺzT۝6ҹ).YF6M7ߡuD8g8lQut"~I!oaKF^S;m Z#AȏOR~Q+_Sc+߈ Uٍc/ mFIKrz 'q&25l.Df1!|;E` 3^l(߻ؖBu1mG[[8L5#C۴iH!_(0J_);Cp!2į>s0؏t g\5]7}$Qc'#p_yw{h6o.yϕ8gb(ég3_~ݟ\'? kyD{PǬnӞĻҽw}hYh]5\fKZz ދ?H_Eo xd>/Aު/fP9u"l.>9spBڻvs6at-0^~> R:;6ړWzH^9eZ۱m63=XcfƂȩTzFEQ)>hPx4"f O9V$x2PP+e#͍1q2\wM\w=8bTDp/ 7wa7\YE'{X?\#X˥-hEU`Q'p̥3a,?r&_w=L'lsV&S :4z% Qî!'Sfz;6mޏز6gZgfhC:[lܼwկ<9HP/]8p'{ _xNE\730CqOKTQ ^RGFCQ,7-ۑ%RCPbt< ?Ӡ*w 0:6GVO?ZVl0Øk5&H'.dq%4~ ́'pQG"%|n\M-^eKqO_{'j| ȇs+9<ٿ"WH<{:r v'0ZW7][+ =A6#5ǖ'qo]o{|?0"6(G^YwQ?I5?'0+w5@ /~K CfyVx?bC9û.Xnf]&&۟:28-[2z嫑S8[XitF_Ԩ{>2oNklF:o7mEeb|ôS7ؾoůEzkHf!-Ҫ>n`3ۺ2\,;_ȉtͷ᯿Q 6'?a~m;n2Y|~Śq_·^< w !َM;d-dcbڲ|/fߵ2%0BSRHQ$"U#a?^O8 6\-iT%rD*qzm(@Ο/0Dn^i/Wex"Hr.[]$ xa-BJuBE%l._c6R{:N?}{f=^d<1_ 5!9YsLhϦ,{).ΐѣ%$1K:'I68{.bFŧߍ0qlg_ةR΄fd0qͫ_IJZml:]C#8K -= |R+>fNa9i'ڷ۷_ o2A-ksAR"p{fgz}c}Tf)6,k^l|ֻp98SN&!sn+z:fjCMgP;;1{<̝95]އtw{Ɵxn1S8W`?w1bACMF['sd3*hasa-Bԕ~N~-(~wѼb9>sbpz!UǒŚ"hA yDmXc425MӣĂ]ؼvqY=Xvsji6<}t.ko@9O3~?Mя~L<8~_}/ǟ+#pIK~4.Ojl\3%F,fedpDə^w,qժׅ6!p5V5tbޒqHނ8x5usσ3o~*l{|)x!{t!d_M;{t 9ȼ"{Irlm/vz>'좺-(`&'yLvV 45!O̾/vzpcQ_X >O~O, v!B9yRup҈$mӁ󞧍G0V_St \ciZ pH5}87’\ ӯ+fp%p'DzO|K>!,#8>znZ 5-{׺:,O{_>8U鰏 N8wa{.Q^}612{HٳRl,'޴$EjZnBZt_2m4s?: z(^טͻlw*MӦ)O6D'mf;w4YL*HZ6ol"*P4HE0k̔2j:] P%H̍@5RPN|Q쑩t/̦uP"h}a*5;JV^ww-{u[zV*9|z#ZL>mp'Z:62\HQDF[$7dP!(NbY, 2@eox#yҕYUɗa~J9kD9A3l4E`DA &T^s5_r27Oa維ȏ%Ƈ=mx+^=tT7lzx{S;adGڕ )lԨT0E2A[{'LΌd+o0,B:45{x'nu8CXn 6:?f)4NӪ^T`}8  zF}kÆ;q/~i6l흎 "6U? #\6HAR2>h8h`{|h,Z|NQV߮1`SGJQ niX#/ӌ].t- `lpđjK#cX ~QdY_=QQr=J[PǁCG R9pWnjHHf)*f궎>*|l&).*7ɽDI|g֍XubMۨVdZ:<5ɶQMkbu%N7Lޕk#$ح|6? o:9|e9gŗ\~!ig0zHm*ps[3#MV ݞUk1y%k9K[2c6ogV@]ۤ>a5Gf%h?oB8ԕ4P4$d ~M:xԦLާ7NW˙&&W2 V.~h QO|_O7DokWBx :#TD .y9b͗n7mÌhgg:X'%MP}O^AT@1Cw;gzDZ &&i\(z))=_'#2/:`4hk""f\w0?(XA15u's.DZ!vk1-ȘA&#x}h#4XTLD׌)$/%:5λ??Bgf ǰࠥ8#1<4jfxoN'R1ʥ_b 叶cS_?V[?)M5¬a88th] V]YpҘ5|2osd%,ܣvbHćFghWOɾlWH5#~-h=-= +ջM$@#{Ci$cf&&D[m|*l>)M=bÆS|dM{yQ~IyІ[uja<;ifgVKuj&'vav-o'*+;dV_AfG(cF"t> 4ft#IJDfz'$]n$z:ރ´f΀wB_- h:;>I|+]mޫ8k֬Ga:s4e>uڵk>W'V,iQ>ԗKk_K,1V'h_+_fHx%ыԁ5w^vGrœPSzMԽN|*.^NfOxX8'CBRTƍFeH*dE.[A> boDI}c"L=3 LJGXE3V?O8-}[ t3y:AXKA 3k}S~5[BjBʷE[މT +o՘#)%BQ\GLqܱ'9VD?NP6hݦO=Ŏ0hbϝu=mȏ!+N7?o6Z2U#0}\D@ߗE%d48Գѹp113CPt^L&t8RXN֥cch"zphg虉`l,{ŹfVӎ-[v3VyOC߻ގēk06yo|^+0\e,^;~KN<G|'?mމ|E`N"@"hHeR%گE'kHNR4蠇"9|]E][: #%VyI/]Qȋ2g:(9x~𣻹B0.g4hޚK Q->rf&DojF'ib&R /7}rn+^1CfYeB`i @z`u~_ZD3CT^{xm"JذӧcW`ëP;34>:2fxW:O>ݯ9 +߁=qą7b>a]^t"ԑVsT|gnY6⭢ 﫠'ܒqCܦo̸"0#*Y+F^Nr6"[xmbC1l"o+^R&m 1;n|urRfz VG:b弱"1eEdlVZGq[O ̰.ڬhIS/ GPٱG1ytR8ݤ`$Ίg Ǟ ,11!,^We(.evHQY(m]T-LsoX䧑d,@Çv)Iif ӲIO/H{c oMP^[싲$IPgFX,㹜P&NV}YVH.Ր(2rR~!+wtcm|/] NY~5-ɩ-EUSFi)\4,;aA#oZ^NKƞʛ)Yz:_oEQIxM[$SILf:畦S"_3ou( R:/ظvb]w^nnG">wS2O+>@My9FAw[+TQ9a#%D:ˮYh24nnقjjx &Sh7<ZXo( Pf]pj9Eۼ8&um,rP;x ĝCCw +N=Ŭn[7c}7>/\? 2*Qdy]>>(i*y#z |*|+O<_x#ãضv "| oJl}1 ]CZƖG@qg>u%;(_7 NJ"B6 FW<+CRB93rpNGl#RzZ vSw ө8X""aU/پTl;A*&L*NǂɷYTݥ:SFa[["B(P(!OQtjS M *ôF*̆"ȴ/.Qh95M[+2u4Yw$i93-`n9}JR&9t艥4mA=:~w:hG$\j[w#T?S޽Ttte- Kck6e+tN3+Ґi/PʢgM7:bd,RqTڷDfN)-Cd/{Vڴ4N}%h:D^F A%bJ ]8GLKfi_^.#J+a:44 Ji(;q75#E|z4e*b411?URU5td"2i7}"=X9%wSOH]vx)<:"2k4DTrۨCݟu=@?1v{| FI&k;ߒm ӦSksXoԳm\̣OfO`pz<ͱcj0G_ T2q4yɃ Chf[QAش;1;EGx1箽f(߱>13N>W6xqn[3:G^=rV?W fНُ⠳?,¶A0'LSuFG 1Aff̏5Mbn{s> | Y? t8/+ߎpN5,L\4dUb24Zj0nɣ.N%"bnҨcQ>/9;tfPr^tmk*F>*ef]aȜY.;1C?1:<9B;dfuW̶@C|9@4X`Hײ=@2AFڵOa6g6Fƻv"Jb e5۴oc(6Y2Vi%YIP{,gG.ʕ Hj@kU?u:h.%JBuVntBUF{RGh9bM1-MA;P;~ V sN:3ns+T~ui𡅤ߝ,c7;iܩ}x#hKRXQQQS6xK ďgUZ}z^[؇'Q:W ] Ky|5d fRZvl?Q6md1{lcnܸvU@~#:\kT%p '" N(w(OM#E̷Ñ`=ttFP8gv5*j7nʂ8 ۶"}4kQ$* bAؖMT5l}AN [g M!k%L2ԏMV82 y;6=0c`Jc}M%%8zG#V$/2$Mo\15<6Tçnb Ӻ-.hn⣏2H3&}B#@@PᷬmPj(ˤj6O`(B"6'Ï#}"TmF1̠`f hc?e&]lڗB67 b1sS8膻O^m:TYpܨ^>(?z+H@S ϛ3 ֬EuSzzI:kUUZ֤QaGi~׬@Dqfu(BӺ|4F~`̒(>#Ylb%9AP#!RڀMJ[J5>ט (LhH-Ë*jF]4F(G (7R_hK, Hf̢!M(uQ#ӑȴ6ktt~`! 8T) P*FUгl n.Ϝ:l[f; Y+<yا`f^?_(E^gsdYPyDMw(vK+UԃoE=xO 50$s8y-m% + u@9qN;)VMڄ﯑ADJ%,^^Z*(?G I#?DbJ*lz Nb 6搚ЖR.5ͬkwtfԣVDTp,[Bԯq6mDS|Į>8{ׯCsW0L4H,3@l_W Y@bU ^q|&t<O=pjXl&o#'ò;Al9a 1wUض xuc7F,!ٴCO-?}-|צ'09wfiw7<"ov;5~c~߀7ۃ6fjO;WV~ >a9>P GlFbf-_l$\\j#üu ϕʔgyDޫf@2Gޗ^rCHsw dLu7MfFikE j\򑩻93ebgi E1J(O9HL!r8ys"բ35VsS >MPdǙl5|*I3D^g(̛f1YK3Eڿm H%&\Qǃߍ *ztddoO"v=a=gh3s7xÙu~ShX4)!9]+҉ &|9<( S||Ѯufp"iYf7^$i8&4H1B[nom n݊|oxjf =k?iƿկm(m0U4;FH{#Hi(LDž!͠ Qh_t(SHAt˯ ذz4#w(fUtnֱiޡ1㟃{lJ K\3M;>DJ44sL=dH_Z{~MpT$9j`F %])4Bel|sijD'CY͑qlP2~162jF|/Jmm-fsfLLP$SC|!֫H' b 2" p ļt(TE%j9-]qn5 riN'$5b C\{xq:od4@(`Ne#Fx 1߼= RiF-X" 4Z%zb0U#(2I((M|L:(ìцH,5"؈Z"BwHk dz/A$BWW'؁|i;YA Qu黚+Tցk@(;74S'mh +/U?RY Uxv^{; ֠B%㭲zͬ/MtENIОQ"fP'i6 L]tke8&<ͥ^qҸFj yڭ4>vQJ݅ uG !2Q ^F'Q++{")g4U(۽8z |_@~4;9&Ֆo#F癫=n7OI C}˙ PjlC^<tآK&tPIn@,Jv2K `,>W:N3 gt%kC{.ab,WD90bn?Fq&~ΞMPbc&&RFAG|ĿXڈuՉ'ҷGj@B E1?V&oBB Yn\ߤZ6"61NfvvyU1J#_U@ͺ"`4X#E{#Hh qluzp Gn2Iz{6_yuk顯WH2nF"+& 4֯]R749D-IQ&}͠ӏjpdMFG5眊{~TóĻaD9-ٗ\LeS&ju&,v-ܑ#! v1 qX>fxmH~HKB~ym130 ϴ%ʩDyz\ɢ"7'>w0s`_N?nUWcwvPGu.|;-~q饗K.1~Icv,PߌeSˠc}']46믿`Yuir$4B메6V_ #%h= o=+'[T^0H@hj>wPQfpk? tjvp/ˆ[&O0E†/&(.1N&FB_ |PXh4*a hin2bK}b| TkM 3z1<0,H*@EH#@Ȍ4M$ (RlldP^0$vɗq"Y :s`Rc)OwhC f6B^S6b-/]!~'UOEXut65Pfh 0) |gp,*l1Ss8~SnX&;jH dD(@{eD:X/ &H%8)dZ)7~lkA+ߓ ש ^O,[rlB鷴"JnXgh 1* o 7S N,2EHJzYJ==C͚qc6#/?LH.|ERNhjcWfNձ!+琮[pFJ`0VV&k)ҚԦb>SЗ*asv ~# joNZ?cm,0E;N#cPhT TYSFVu=qMGך5MȔڵv{ ݿ$#UHu+d׹]{ӋMU}~1;[|#&RI>)Լ ^aN/Q罀yGZK+G3"9-2͞\,@"NAcM8:4N[҈31H2wdzu'ROUcHa-/ k>YI(:Q'ZwQ!kVXMK2u3|Su4Xt#[nm!菘fWƒ4 ;DO"0bej n.b޶P<%6#`k&ߍu;t+\n!̧aĞVpo6Ew&Nf즵&RVnw [C>ByP#o9LLIe.Ӑa̙f𕛘I8LKĹ!2*fϩCWGTy:tE"4]C,L%6:CAtG'0Ax߳aڀoV#C+9i*&eB>)Rp}_u ɨNxMdU$aR<Ten$6o h`]畐}1}bXzF9>JA6̖*r6A#h:Zu2n4jH['N==#G6]v%# M3|a@iA<qsJٜwQ8oA>SB ʖx5Y>"+efhP޶i[KS.h@%:ub-Qtv½k'"CE:id4vT"j}Ϧn =zIUj:YW<s=: $3JgГ`mxIF%>MײMEr FQ?/c?\;t|31U;<󼜞>Gyٺ^&h_Ax@'R4cO3it_F_yTof5Pkc=;zP{ݖ^tOmcMbgΠ4 Z>R;lD`6C2!&7䴈 W7O2իM7U֩O4҈FW Zوk*VA,\ ?k:>닙 3چrՍBى@N %dH{77\l6|:4ņ (k> *)O `3\F^k<jY@\gPT]HkW#گGcy|$2=f4Ӝ(r,Dɔ6 N L[騃nDJ]3M~'xT\/ˮFF7>iuJqK\gZ{ ) OZ<)gk%&@ѩeh0U/!HF*[]% Ll#PY + ) 82T6zڰD1E9Hmo͎cX?u b~]( &*X;J%%=0L!lX'Hh9CbzS۶ڳH Zd`lcLrSd_ d]ۗyeu,4k(uAF;ue`)zߍ*/!N1ɚuÙ_`sn 'k:8 wK94:Ƣ~l($hD$de 7h:YY[4c kQ3yJTjTE͖ottћs"+Rbe6i6 \ĈO:ljبP!l 1Kb`@)Mɏ!m34rS<4Τgc[f#LbLzUxԌ:lJ,4**esx&\H$ F#e]՘\r8'K\$8/" F N*Z YPD6WFFvȚ#ݾ(m1XEg%-uԥsx 㬻8x83 qQBΪňs|N/X"QhKuIG0_Ngb^d*_Ps;1a@y0J!*bz En8xSpU2W_ieT_߮Bҁe4[DҞJLKUDƠ֟UwܞH /o5o/

7 ce~rXQ¦bs衘{IV>0}-ys<=KcC~*9,Ji+.?DXz6߳;;be -'?m;v'bӅf`Q^ h^c\ڧuڰ?Y!4\s  -IbYn8]A˥gmjgwӆ5>E&~q[4&EB34""M2n(c|)…4ihjbtKɩB3MdS펛}moskG?7l:iI=)O|x{k:kolkw{l>-W촔#ͮٷHZ%K5,Z0FenF˟N=445QfڣG˟>JӋ"%LN BQ(Z"a׶&4ɨ54S-CbfEV {)͢jZsQ(d WZ?ZGE#Hr&Ky*O*|CEJ N%(Ԑ"VSGB 2J 1dk"Ru*_uޚ;hHTeEa*S" CwBHTX*gݸAe D HP6\YɲCquXx/BGv݌a9FԉSb'L` 'r *#(pG|/v`,IP1nǩ"Vqi[Low&FRVLJ:Aq<ڱG{g}IX~BX3e9⻲@ڐ쇱|U(oB-g)=)N=Ӻcæm̛r+> f`xs ͛>F0JAikbL_9X$mXqs؁Xq±LFUÚ];0cXlp ,AotJvj!O?pW?zjiO>{gQ{I%Sz{oG+zz-%݉y0_L3IY[AHVrЌOm&妍t^d:] Q,SXmQڣ14|^4S||56m[/QG_C۴l?8X8SeSHm83QaF̲'b+ĉ5ƛ ^.jN8D~'&75ӤrBJ32VxH׮ PV =p itNcWաpUI=1A \H504i澞 ğ5aN?_m6a|e)PNFPp!Ec-f0o80[u G~1 f}H>Ӓ|8>ֹ, [R1:g΀+O8P37o XrkVKs:q-lii㢌+|qgUK^T&b8_ }8cG F"k|)f^zXVYOKG`bޓDߟ~s? J|fv(NǪǟ6G^/;<77#u5@ygi }(4^'Xq֩h&["椡 >)Ιe錫ށ ao9ݰlg\vv-׾H'q[/I\#ȆmQ]8m Wv^` YhoNj9$O;E{vJĖ MQҰiDE1=)'N{ķ/` q {Q / 3'0crd: ϩbtt3g4 O 6$xwWPv%u%J 6mzUѵ0]#RQ:5Ea# =u:i&hW95RQAvi qGꫯAG{څ. RՐᵿHCF^F6{`d5U,Q=x;A}p%@a\Ҳ/b~Ok1zSt*jd>:B؊hޢqS'*iFeAc&/Z.+tά[ւ}j9H0LjG4JZcc~Rrr:mA5B]ABL\dҔFL-fmu%E/UK4 }1ms9g3~xowմ_}xفAP=&&K%257$)kJ~BÒJN]&=14V=^: W^uO%wOTMYZ&U.Lūz&TӒ3h1| jĮfO'nH2*F' x~wTF9m,lʓLzC8MO_r>D%a9>ڗq[a{, ⦷]ċ8aލ_no0 *6/y&#wލp3aG܊ۇ-1e?A,ǡoz\rߺ\a~?e^*y';7ĬL!E%|=j* |=j3{44ȣڣRyCaVA` y8c#-4J3rvW䏪w/,Wvsڄ1(-e &pȗ n:?iKɢ_{vwc˦fAxJi~ę=+̒us2IA4G0KmpJfYuԈ&1;چ*%/_zASK rb]ji]hmJ} 備^e|ɿysW2 (10S?58@oNJT&TKu0- k1.\[f)d#(zV@ryhxePAu 7!?^{{E$^7;.2\qoCgpYga楯Ƿ(뵗egO*\}"zPWO3> .{=WrUk?h.޾ [T$zNP'LRto_ZmFn=F[?sr v?FifQk?p(bdUpG=j$$c%dK.liS_mT,&y$$/i{Go]+;h#IInKJN+OZ~u8^nU Ӯ\x^~BX-^{4pn * 81/2A'ɐ |Cpx* &|T">I8`8FY e̪QǁxPqA™l*jDO#sFqvGM#ґcՑ<OnwȪ\[0WJ6sr ۧӦ5jthI 0Fcf`ۜg nN5{zL=*ݢ=uŴVh t4"i=ϛ =$ʻÚebF7YSwv m|:j5fGy/60r9ɎtfDǿ>Լd[!lJ!v8kkg 7g|!hzcWc,Gw>9Gsu'q5EM.<"w.=愵(A5b:ܙ_(ƓUkf/C7pN_5bogXKxΟ-AGN `;;;jឯ&d!n3; aNGNab0m Lpɫ]FJўjS{1uhLJ8۵l& KrgV_Iz5;(w(p<~{ iyNsu԰ ؐNK=*kĎRg_z1|ㅸ[Ú?[.y-*w.s_F/dT-}~ah`EW;ͷ܂HWN8X%;};oS;\̓ O~8j!8px7a^\3sbGuw#?zt||b06G2z _.{ =M딥ٿ Ao G2~7NO ZJsʉ OO32u'j~퓫-CXlmFLQb:4heһq"=ux!IBFe5af8 q&Gcmc=N8O?_}GuLkh3a¯"u8iQk. 匰 x9HɪHؽF(g8aSG_ʤi%_v7'e#)+0(oIPz:jJMUJ_wB:Za'cgτ:$֎Ǟ@ˬYYHsɯt-'e}o}C^T!n,_t ^}+q8@4Av <ꙍa;uP+A c13R2\~oWsH^mEzt~xOl2/RwIOZx"+~K'@t"+o #'Iyt(Io"ƚc|}>koR::&.{`usG1p{Ƿ~FIa^u-_16{~S g:S?z~'Z3tQKӇm81DP*mF=&((;?|KMWpՍޣTcޒ= -q8b2 N9՜ܤg#B,*Vd)@G;y+\:qsH7*¡fϙ'n}终4gQƙ; -f]Gbt-1+LϿ}Xv h6a|x k-G) . цૣ\16ב߮|MXrF㜦6>x|p=̗ UZbP;5DI+d/=UB~UF3(mjVy7:syM-:_cŢƾ_TU=k +L:N˝ԉRr)5G:<Pbt" &M/| ]=`u b)h?>M뾖>1+X6~[%TdpY?܊kʔ̈RG=WƄq[sο_g; /?;߹g>K ԅ鋸WQb;k>JϟAwKBSƙ眍~Xwb(}+pþO`tN|8?>( ^kSӗ.B߅JEEv0_kѿ7/Ϩه{5_A}FyO͖Q--=^Q39F3_4pm63X3j?5eǪ$ԌB\p"=f]}?C;ogAoz)lܱg2y㏰W!|,W_3_2c[6c_|f'5o}{ߋWk-?C+̦f)SGZ =J Vu&q8~ߠ֧ք,ofmD43}}zG.)Fl'RuRџ*[Nr{c*|nU3dJT3g4Fpy{qw(XK@U8~cr)Ğ 2 e$lg.gDZ]cXg[ut乂Q3y8uef0: :_k! {*ޥN"AWFC:"NlrGFиyg'p^Nu|3jNMshf<8B2߀`K'n:~&ïWFN>Fqp⎇ũ_?1 "Bw 8ҷ`坷?W=koܾoC7-] qqY3f7^r {{l|SW\wd:'կo"W_K߈Ӧqp |b4 _Fmj (OMy!sz%tUxs_F(Z(k2lځ~3|팣6-9fͨd:gQpy^q8=fS :q5 yw[<'5wtk;L;{V Mh|QRFOwQq1"=(f)xfa6w&B/N\rE֍ Rs ($h.UThǝ#mx:0AiCuFT4SWʯQט+I߄O^#9A#үO$;0Ǔp%p[:ēzJk>|sHb=yjSInyǙxH*J%gs>z S~"_9E cNFr7LWHH`t saMy}Td7vO\c|7IPU^>WśT<&g#qxyx)"J#|]l[ UZ+*29ߴ,>ؒ+6 'E9Iqb&!7!Y*<-n4 H?;'xw߃Z0^"Kt2,^?~SOAK0!i_%peoœ=D/27]-8+_kzǜq:hktY8hYrƙǰhO= eG r @9]XCRtF݅N>+, `'cg0Ƶ'GʧQɒԯ u3U̪W6uUԆ#g f/Sl|Ցk)Vf-IVǭf653P`6 :iHkDNWuڪE{`iRp*+͖]G:ҵ:hDw[rP$cf3LGz/-&64NY6za'K F 4"Ո+3_JaC]wt3pacu*hv0A%HPHu1:Wd4q+<2uRPn&b# {RXek{ 1oV^w$_ỔFϩgkJO яzOp2/ ) NoCv>IMR>JG+_V]5%}0ku2lՇiNIzCf1MU_oo< 0g[i,Ϛ % LPފ+ O0?H_Չd5x"j:7/=O}\ fqΘ-p7nf|>w:m\֊EዄFGP(䶬YY3P@YG4l=T8)_aۦMXz‰o7ىqTYV7 uنGVb]p 4Ece&/w<{'Wn5̦ѩb{wX6^ NVI5ZpMU 46Nf y.uHbtԧ&֋ٰ':jC |oY~b!ofO=_z5ܲYS4iңBJh/ -I.M^Nrг;jŒ92펚YRwOWY6^Il{4k`VN-,|~loqnMցmϬ_~Kܘظ 1&^9Ğ0؉{G;_!rEl{a8&f9F;yaYb#+Bx^}b==p˟ğ _}փIK'%>2Õ:ͳW<.t&/o$i0&jya:&my˜xgdϘǤჾ]zt{w>%ҳrC~g&IQղ J&#$))/QYPJrİp2l\CQkd&a} 0BkQ#a+)ԳmۆPMI)Tr|ρS Ec'`2|ft6dG܄Տ=aʰcr?Ѓf{͈dRTxYHżVq^ʃV=i:ǰSx;6=rG;uԀƵfʬ[E'ӑ)8;jV/Vg5Hh쨱_h|3j4`6iwԄ6cuzfw#5LW(PQNٸy##> z:gQ'KxHHs@g4 CC0پisiam?xX۟~ڱc&`Z󻧛%+}t;lŒ.8EKF=n5:-z؃"i2H$ӹRFH3xq:ZKPb"_ead ?oVOJMh 49/yڥn^$ek"9(bT0#})'V U(+{O8ÞQOU6hKDi2m1ؙmM͙3&Lno"9OdwhM3u|u(\I#y2<{ WX׊Wg>&=˯9s=WY=k+o'oSùz*j0EN+=C|Ө! w8}̧)cwgԆ|r.ޤ MC>)4e{@ZDԟ:lIDATړFa:9!{f Cf:n ?D!ט)뤔a^,P1d;e3}) `f T"km0=5}LP[0FA718fxQq|>ԙvV@}zԢl!~182HE@K8b:jȑȖGg fڎǞXe>OQГ3SX?ҧ}q65-:Lь^Ձ̧4$%_j5*QOZk/}ڻF~m/TOf 5:OzF3j=֯rG訡3KwnAC.FM0N؆۰GqDIN`Z1yzl߶HrׯEy0uEްZ< tq;rC4@a} 3' |f-jcID[RYwG+nDi/4 Ј}" v MnKpʻޛ^&E~"m_,/UO_"8JFQ9,*MA=s]ц%Yo?Oz_a/ 7LԔ_!_e14utʌwؤDFd U"뷕W|z7IϘI7i7lڝfCUnՉ]/ g[U<*ޭdf޿CZy~Jȃd5zXaY9P5<ӕ"=8J+2ڀ[&!AS sIR u)\5:FutG2K5u,[G8UFS- PIuuS؏ 1Q$'>ҾPvxA*&*-%R/1 _9V%~w~nx) +u"SEs^Z,)xpX3ߵm^BO^Hg,U" R-76e]21z,A>]Ue#'5"lt8y kdJʼ,sm\s/=n ֒A/4iMоD,7I{,k:M"?DwR TTG>Mͳ_\c$!c/}jg>]5{F˟4)FPuҶN=ّSZ;v>0 XWkڍ:iЎ;L({z^L)1eN}2a4$PUa6ZO/."XNlfaz de-qԬe&LUʗsM)7"':w9P_b<Q[Doޥd̒39)pzV=*!=SdX̡B$%巏3(=.i̺yz '!YPytmSUNSDE2}A +^*ER(I 8aeHQX.2|Y&>f i2ċVw#EzX0 0nidX2:( R i0]I^gd])T|u>Ih0nSX:f[M{_MFȓKR'X?:MRѬ-}SGRcD4b-K Gٞzb18 Yxب6IO, ' V \| Zbp泼WGiY͘)QqMkiQloEq7o.*Z!d(|'`hm">^"䷭J@Bm]njת sZ*)E,'GRI^3;VUi6}ώk QM}ƩZzV?j4=^;?nfg;avM?1?S83=)ЧrcճdJXW/z>Qo/ަh Jclw.Shul٤x"M{{{唣ΊosPצ2vo;ߴd94I^KwtV#/KkGZS^}Ynb'Sb ߕ>te!+|ԭ.=O]^ ;p69yOB̓_3\'+1,G%(1n.o &*$ 3)%h;:1z H*(Ph$4@e(x\T8l^ ?MōSTj>xnf,3BPú(9f@h,hplCi'F̺)S '@fz #1'{( ZIɴGMfE+~J路Q2(?pyيRK QF`y -M&U}]$I=/F# @M{Dói*rS l#y_#/+$N_GY1 @o9sPq )34=FvBF O3cj` t5w`bl~U߬&BI{_-BSX?~L>>*M524 @bk,J!r9cDtPJlI֛h>GX(eSV̰dl)Sl fSC5Ɛ:llbν, 'a2cyCȦ2rh*%*D:#/4@М 6ȥhDRC~3釩PrLv=u ϳ$l6 fCt_<+(Tvi*zw쇤:ѷ0 +Ar e|c#.NT/v xJ6]'6lb%DaoXgכ0'A#EVF,Z Ѡ' Az"T$@' 5 e0 !uRhɇ@~kP$LP4x*nH!IZ%>LYh/%^OTV8D#hٞ=Q+(W$C ؎T$Pl qa^E!Bz0C^+WmoB A|6uOEN╽IEfOKb7Q"S?A*1u ehh Igmdi7uS||>ABA/ R/6ILj[嗓 Qz N4pY6KRHG`v Yb ۶(dky͆rC"ӗɧ YYfSRz@:A髃@bsl|*y1M YJWK*LI:tFN% w1>Ŵ[(WٶI,63@g!Rx<ĬyI[  faL+Cg]ՙҎQh٧:nKeͤ oJYQlGh\hb)լGæ(hE!G  J*"k*0#H=O]馎no2䇖PT潱٬M)5KTa'1:\ }rA]&KN{GpXnsb#}i)WJX?=&p(̺`)A6T b黏C ^.+SL-_aRGFf7lbl70CǰɊoҎb~Cb,_I#WIP {_>铟{/ι"^ $ KcWO,T R"^ NV 8O.еxގ+>v=},:Cq+&qu{FFN6n%.x0T.7}8W]K>I\~ & ߲eڏuo}+g,Dz1kxG?3.8G嬷,f}M/A>>I\ᆍIN3)OBvJw%ذ3 u҆t{h(lxdi: 45Pey -ͷ>IK0Ŷ}E12#-GY C Ɔ *~I l쇗yT?mu\@.R(p2 yp46YTTWXmY v 5KTN{IiֈуB,dd01: 4iLQ{W&(|_(C^"иk:KƆitm$Xs:g̀ vʺ<ALlHۇ{( M$ iVcZ9-%Ƹk2mzuF P^ /BAOu!#E1]UD`uf;Lq|7#AH{6Sv]ˣ`MH&( q k?/A+)\&p8jijYI}$FY݆C#D(e_w3e$Dw,ĩr4},dxr̒.QF[Q[K,iKi:g*#B4`!O=z_ xIuNaD{zߏGxŵe7ވ|8qYg་/A\Ac(Zک!Aαq4#92_XHOwuRb^*>Ty}YO܀w~nwT{YXnM/,qLJ3kIٱcьco-l̖RpS6}1CzjJ5dfͤq8I/?a`\hN%jٺzNYW4)'cYvڍ7>kdz'] p{VkgU~)^|4iioSLxVWNiM8\XNbZr%L1@[Xi&ͥ1F;?DYP=Qnc8|؀$REbzs ~q`u!kaʞƘZJYi/1pE!$ ?+=V s(PY*I*3ߪ*%Q&VHl+rʷ} .I=5Rچ&F]4oPdZ4Q'X*auʨ*\J2u؍SN׊#gdz1HvMcǍ}Od;@VL,tM-YDIq;ĭ7~7E9,'`Fc 74b$.0-XsaّG3ΤE v`A8ͺY 2qa.EA p𩧂*%a5(9+5A03% 0wvBp[%|ɧpO%>`)AEe~Ll<64ws_OǮM!dpoB$2gA6Sh\` ĘAc o˵l)ZgAk4D[՛ w|;xb\t8sO}+.x&~ћ114x?aCDnikdGh?{$nO7i$^j&ZO@@)}k_^j(42λ3::Hg6}\̙gTu+ъN%`8FN^P&P2cx,{ʙ–.3" 6c9p/B]Ђ4> ҐE)XNeԮE{ 7[?]By80CQ8x_~Zv%8+ލT:3b̖hcދ v+{ q­H&r8pCyEK>W;1k.SlbήNhP.JK_u}f;Sq5,:xvPi cVBFk؍×ἫaF#ǫEd|N>7G\J`z;e*+^pvujLPư\s/FjtS=WK=W%ѽUmZM=nRhVJ)+z7~\w;F8rc1,By߷ m+]͝c:eZW}#QWPoLǪ-Lǩ7wwٴ5y: ,ùq[/g|bE.Q;=.E.ٻ0y+1_;ƨd8B], $Pmi㎲>Ys\-%/y~ēpFO}7+Oeii3k01 aX-H9lضߡR^i3bhh0EG;-3QA:@3O'A0 MN8{?0up"bہH [[-:2l>_exշ{FGO7f`y_ ; ]A>VG<POk3* 8NiL.Р*p4

(3sRNmAD]e$#fLİg%5`*(M]G#7(MEkdP^}q~ډh0|ΌtyqxO&F<߲^h3fϦ5vԵc:[A]ӌAlhȟf$4RPHvi)΃c80~*l ~-R~QZ1Hhh Gfd{{c#IH|+(s%B45{Pm@ӌhhxOs/3O< G: 4LFNʢ´&)6AuPj0@6:G=^ttEt|z*}w W}FnSO^7݀s.fµbF?V6G]MmBMS+߆$NuÚʷu;j[bΦ0k:|H?v nT\/ !f<+3a,Z[1sIqƢW!@"Ǎy3"@ {Puކ&v8#ݸw㗟E#&G:Az`>`[ 44|ՠ=3o}w݋o}ģ8ӌt~o}؂ f#J`mw~?G5`a=Vg+!Zk,Lh Zל7G X[΢S#Vm˾9T]K+h:Ⱥ)H{SJD^tSc'e*bځ m觝{Өxm?3N\F8H W q88ԏ xWgRt0g8{bطy30v <bwA>oچl2:Ikt[zfq¼ۗ+5X9N!WM[%M|-o-nc9vu~+շ(X<%f4^mmm&-.?QAyq2BCth1~ۣ" g4ZBXT{ ѱ2`z})aulR^ x{woM8niqWL "V,-̚)fD^̹ĩȟܰuՏIHC] (!5U*K@kv_ƪ/kvĦ'ڼUPj~S .@Rs凢xznʨ}#wKhJtEf|Ϛ-Q3'uqu׾~+@cѵkltِF^/NL3x-"sgk0_.%20y$')=t}{1tŚ}{g!87|?`έf!'>:UԢW!Va$YkVлj-rY7FCr)x8#cޢHlN9DYoSC{87 O= (Ws.;qܒ GR`N[|μ*+g߫Fַbg`8-oĒk^׾S[pmBmĥx߃Ip[mU};Vj{B_(~ ũ]( ZW"  #>(~7S>կ{!R}X`"NPM8=}h]hM8u.z;qοgaL[N*~Әd)2YCA=,ΛDw<.Z vx>5ñ~ YLa#UZsZSFraL ۦ{!p__aor]2^z.pBGȆ7᲏~۰sѝj*~gxοF\7㼷ȴqo3V-' Jp6aqƄy͏ujP>򪡖~*.>x$_^."[)ÉUH k*$ r^IWuJɀh -040X*@}z[~oCO t"x.zM8r7\`@|٥}.㈣G zt|c->Zo2q/o8.SS $&`ڪx՛ǥ7+.nz]y.AݬY8KpK.N@g4)h33yaͲ57݈kzw㪫4X6M+])K<݌Bw~@&? 4/9-A'w8ȺzM(Rg&|$94k[uͦ C2H 78Ŭ /:2F>¤eKhmw~u ~z]u/][Qk.ns0%)gWtN*^vꦁFdۉH}qވybaM"YFӟH>nZǏG:NlOZ1f/X_-mԎzxr9]YD@}Oa-Zコ/6n2;V_E{V+V,ms8~e,[ ZF:Wd}`F3Td7Xv4o)3f'u^B_&gCCٙS'񧘛Mu-WqgtE$TriSwCMgbg_<;on'9;G/?O፠?5_Ś{7,1 Nŭ_y05~__G#4dY6yxft"vFd)'~lE,9$3]fo Zl)p4Z%] ϫ}HNΕZٌZNF!ç(([K̘ń$|p-GFM2+h1+y˳|X ؄#0ťV]W%XmeTCF -_@O7uDЪCZudCع{v8VD*6`ʴY@s 劙wX">y1ylD"R1= ԄB[7n@KS3N1S`מ={.wߋ;|3K/滚Pt9s>$cظyY> :Y tKWM`4L>l|g;K1c`uo`G&H1. }}ؿe&Nqoԓ@!m Z[Ecce4lOY1} %JMJyrz jG9# 9f1p.]xlFL"mT,;̼OYOs'9{-&_*|G^30v\t$Hn:)Apxc\i톷 7Mh2w: ibApuOWK=q2Ѐp.xrˆN  XH߫BA4eSf$;evEkP~y藾w=h?=p?-~Ps2s:4 ˟Ƿ>80n "+4͍h't+6yQLbAL_Lwc}fMeph8Tlڸ?j1yj n' Cک|~ȕNUPFNnF w֢uXA_{Gg\Ft.mF?-HVc&6{w| =Um[~^LZ. ]{өC}s6 lg?vj4Θf$f`ݣᇷފ Xyh6:hj4n pجS櫯MAwܼ|ߌX#1cLJJtuwCa]Bɟ2i8u`R¬]aT2t ~q&85y,*ok@7Vۆ6L_q <,v o0ӥZ {1qMo1|xG?ߋ`pi'c͞]h;ǝL2_;Y׌vn3DW!,ntOlpSO`1y*W"h(2OCӏ?A ffY)`ZȬG Ӵ65R 緻$a7ӭw̝}] oݳ W,͈x,o5h;V4#HSכO:8Z sϾgv&Na?i< }"&W6+Oɷ)euG]:-2 ̣G<3y:.~u8Ʒ`쬹Xo@vU 9[0s_ MbFTZ$#CE+k2Zu7:t[uHɓ'͜Æuup(hAS#"h%za ,OE:ǪyX 뜎껔IJɠy+~?1͝8g;d\Pz}<ؽs࢐":b BHgHlT()S69<`5g㶣 i!Q[?y>rmnh>S1%`صq+nOdB(=Ͼ ߻8p)(u$1lÍGI=}}ɗo| '?~0IlSY6It1s\\|ŸKJ~%C KTSo668kFT^ MҠ yf.b$b?wֹsqKąb9ͻ^r\KM5٩q׮] 8$A߱5j}Xz="v+0ybѨI; 9yfb عyU+C\ڤ5 l7rvbڸ͘z gSo~,0 ^2nUwi'SOe&Nܺ-EoAϧ?S]TvZ*̻1LX)cv!lAĩC]h$O  !{c ސhʤI4%ߓ<͙˶YKOB>mS'Vp DƌnΥ0T ԻW>9zF$1Z-+d2Ok" S^Pݠ9r>ui2{k/G!\@VoN=i|D7el5rBg zY~}( }A"g/t5H JƆ0w>x#̘ϜȘᤞ2ש<ĝOb)'C0mżJ8k3ɛ&O2KW[o3o{#ݕnj3{04zÿڎos3xqfpZ3娑|%cن:oC'Z3TGv"[QAd/cul没iENVg*i)F\8BDZ&h"1@0IfL5ffK>Ko~3~_~ʟzVRg)>Tp8xYl R 3'ѐ 1,D++rVPbLJ='Abo Wx> .,4gLR|s(+)wArMmFmN87Ҕ)adH>Eto-ߢm̰|'Vб|%-?0ꦛzZDh?\:5vQ[[[͖ۋ!DGCؚW% "sS0 ZРc0Yu^*c#xɑ&3FֱMF+:P9xun*Rh?j¸׎7 +;ܺ 3L78q% {Thnƫ/z5yg֡6 @)A4҈mX55SGdoŃ O"z{+Fyvx>øKbCebƴ`zvoz { @2@]Gcaܒ߀> (3~/G"F p~wŹhNPܲ ͩ>sq9a~@j~t_6f,1 6 ZԸ+V}5 l l.4]SWªVo ?\\t <Sy˖ܥPC@WKLOoqᩧᵧ.AxV{~Z ǍP 0E3лa8<\{3k6%k1~(-El[)  #K(X*'rux L[ʏ(R@%•_V`r3|0la?؇kO?v VwV8Gqݷr}Ca7j["z?y;PiŅcF9FclKW?ƿ}?2C!\|ȤҠS c fΞҜ?W#b>ǟrȺ)<'VQvF7f)AǣirF(E+XǺvg^I o? ǃP*R|it2yWw3&LBK0F bklEü)1P}'&.;'?M7<yC> XHO~~nM) jyD.Rc(N8y@Okq yHH/zf_4e\í_<n$l)g;w;&.8,YOw'?N<2LY0f|3'ҋSQF  b~[ܹS^68pt>e6^ʸxj[#S>֛pͅBww1m‰3 4-BZX ţ;:+Mnjf,y9:`.T(5E]Ħh8Ŧ{1nt/лvzݵއi|ahۆ-^OX ;ôԟ#b 94ÃH! a?b'DSrouMwc#rDկiIL8L8YwrČ%lv9'v$cXr1c#~ٯӧcYRy+C|? _{ބo~?B{mq ec 1GXVqEb=/ (^oٌ9\kv\ | ݁q^Å.' x'':ȡ]Lr[p|g\y16UђFjy%)ئ5QlEsMy$;-]r;(ZF9+3$^{};PpO .g_S.ҹoz*-'O?浵cX6g&67Mշk'k׭>L/V 8~R4R!x\#-aMcQ_W˶q-91S`R4~{ɋy䫮ĢEaI'ų۾%`dfkxENaLSTo`mHS -W&ZƶQd;`. bɪS ={pŠlq8NeʮqbBiƱ-zʼ#Ff; L̞Ӑ6# ZX\ԑ>y\K &/Y۱gv uJ=e 4M X$̿2ng2v 8ܳ)B[cΆAw!ʋ bd[t CQ\i?m'^I{؏NY;o'a"Yv̘6i0/lm{]cKf:L?3]{6^Fp%U)*ӈɎP_3źGvwv?<:xZGH"By!5c]G[TS&5Ҙ$>KZOgEޅf($u icC6>$u~ 'B2-5htL}S =/蠡)evG]bY^M$I8\/Z|ɣQa DSOM8e;ߋ7a-XwY b}xxa6<=>9Az|X2GFLO{vÖ5kY<م8q3kq6mD ؿfYM#pAT:߃8+FrC ٍwh1Caapv㶕ѻu a[7CO,fޛMǎ%`c`muPcw#Hexfz!?}l{@ãXq|l v?5FXk)rڐ*4ib-95N*܅ и6v`[гQhf/@`_jj1ر󴋲lѵ@O/iI#S?b0_I6$4Qg^VNx?v1 Hvvd;vRZT[gʑy_kǤ8uȬzCe8ȃعk+$6]>i &b,#֩^qkQ chxs/ĺ>/."޹žˠB,Ĵ3qϨeb~SKj\ Q[U ) ͠}U rYf@;Oeht~rUe6A#t8`}@~?{PT/S7jq5WaGyAYlPI×ު[`FKR K=pgݟ ԘKEA$"@V J=nq  -]qCWs 5)6! I"`KaƌVa[mi7@4aA l^܉Zqmc&abBByJ 㚚ZѰ< QuFcc:#%Dx12KůE!ʘ+Q >f 闳ft8짠1 rŒ X5YJt|}4Pt<̢!"6F0QYIN&\! 7> F"5RV] ˯+/>|AsU)t*k> q3w7cμ:|߅`^ Y MQ865^U8̂j[.q*=w)^hC:#Z3{bLsN T)҈, Ygz~c,<Ԩ=WЈ)+o^$ ͞eU Z @IQ>[+} 8S`<_B۞PYLά S?A6%pW%wd'xtf~&vv5Љ :O$RloZ\ob9бgcN!ڭ!h zP"h=4z&9zP4. `85԰mĺп j$eIU9)8[0vz)oR)#9G{ÆF(A匐q R o[|/~NHz=WMp&Yg.=?)2j^)  F7D[K74`86LHY\Fw͍mf훮^4 M}g=;Ff9Bä/#wniYtPw4!b8E]l2yiO";B#{_*(炔_4c͈KFuB5ZxǪ&d ٝp fd JF$hh%o$OAG]l6[;Qc&t0&C0xV nԭ4@xJ;G %bT$@M}za'V$m"CrK <k Rf[^S]{0:1me3D>LD\/k$Ӱ< ~u60=r[k',[k%JFg$o hڃAﴞFB5F7뻲 M! EӕBWMu ٶ2QVXOW) G:*1Q? lώ"qНK`̊ߌp:Hk]j2~^A.3B-Q4  wt E׃e˖ζ᡽ٽ{>`fF3ɑ/Wʗ׍Ȫ1!xQS1Ozo"夘ˋ 8|w/h[/x(cĔĭn #/|$D}qa|Ҏ3.c/}1khԝE]f1,Ég)'|0/]a{AؓY>$עf Gtm& 'z;0wh, MH;zmxWSΆŏ4⏽-> 4m^CAQ*jsO=9{ ÄQ6$~JڨA=@vzhpܹsF#iLb0󬎨:8^[٪UFH RI:I9:Â5fݿGyx됥=g6ك||P)J12MӐ/{5ZG@"<ֱ[vm7գ#Qp$rE̺'BDq{H]b*z6:&kdc3ϐ@@*cF}lhy4Iۏ$A 0L*'U HRԸ|(k/ X-I$%-imD'x*G ht qNQ "^ "ݬR} $3S.-hx x(L>*(m{a4GU_F֒A5RT4‚˫~C rZYHX%-И`fcN @ '_Q5 sֺx/!ÃLPR*Ryc"A[l84j=!FCp 8Y;먐C0Aa|XD K8v鍵upl9-T[K~ ri%#?jݛ#gޥ /C:|IQ5y+5s.~K|cgIbP  b34-HpickwD -'ڪV ʸn*DbO h4w<'0}h ́z>BW!i+'D*"'{u5,66jg;oįMb5~r(XƁ#r&|'G=.9`A0|mE;ȿK#j|46mFN,8t[>XGJ_Qk}1 Xra#:H X1Z:$ɟԙҫzQ+C}CmPشƼaoQnɿS00DC1BP8dr ^pfiXh!Cm!vQNMtP礵X|wŐc[hѰlab $F@=5{Rl2}e|z)mIj=%NʍƦzDi4h޵(cϞ]fb#H-U2PO/:n0!uyenfۡ2[FDz5cP&5f)qvohWGՅ4n@Z\ z"(ISPSn1uUҠVI;e;h K^m`PK):NI 8Oll7a֋p^|t|~2uAWT 6; _hX}5jHz~YOV"Ju?~LAN1T`YN S^e@:V8. A'g#sh",9qfR批n0]ֈACyQgYHXĺaVi؆VvQY'^//MR|A?˴#&6ovrdvkC,ۗ)kBzI&; Lx!RK,o:qa݄%4}Ea c#e3S@Mގ6c-u ZΌNCtFb;Ԑ߅ }kmTlviK1yO6}Q$4bc#j Ÿ .V,F2,]r(ޤsHu0La7fL1T(}Ÿz4` F(+4e剈}霓tSJ?خs]}3My#Lk(c5cߴ~׹s+mZC?M?ء#FfYpl,nRnGzq,(~`ݮعۨj vʮ!;ѽ{u.T(}bS3ie)'eˀɓ"nsCQDd͛D\*ȹ+'d[l1#5F&M22$HIVa~zB~+sK@)s]UHEf R5Y2(u9fa?4 R3qXFȤh~D+PF͐9T^J8Z^`G})~V//_BAEJ ]";͇q(KEsvPn*Βqy|voi°Ed񱱬AgT|l c!%փr:NB-1:Zu.:=C#RxSmu^|dq$`V@AD Nҋ4xI]؟F6Y.J!5 է45ʓ'W#az2Ewt^֭$MظV'!z]y`Lɬ)P!hdYWS\Z~]] jkj R:(]T(S4&BF^1l~Ro݈v{~򩿌K~TjhRoĆidR%3xL%hjhzFp5ye{zMz*rVhD);5}:(B6sDԱ}jmg9Q"4&h|-;]M˧nC!@c%U\5DC'Pu6Y|WumR>彔=ɚ߯ѩJFio:߉džBGCzq(ڏPK !K~m?і ҹBʼna4ZIA,,!QiPk3ب5]3A*`c>Y^4A@ M!=Y2J `Lr}y*|M?* j+U:oy8ƺ*'0*oXXA=0BѬ${ae zEm.xS`Z|g%X'^g*#DYѩMۼ5; f:648h< Ҽ;EX~SV!d€irhL)Q`ݨ1 $XWڣ8#Y8HLϨ0G񔙂# S6駁e;Դ.?i()OͲQrR$G Ah+.!os/xJG z,:Yc22գcͦ|VP_CC/H]׃tJ#nHL5EyZK) LwTJQ>iÆp6u"wyCԱ."3ʆ@xFپ4]/14@=cɡA$PL&wE-sPy[lÙ~xM=fʛRKJ6M=MfQL(QoKʩ`dt3(V ]$ԯ5ErWg #fQʋ$E'[35mfMє.q^20iEPH{os1,ByB-KVGM>B`.nj֩h3CvF@Yı BJ Y-lTAHQ"iF㤨4 UsfuOxO^Z$&6ulEkGG=y@  ИbQ 3 $=4Y\< {t,0b42Y~ GEs6 ē GYyY;ʐ5AH8+Fes-Fe/fC0׆i(1=!QF9dcv12L(2.5*|W /:J}TmYGP4 (H.lmV dLbWJb2S(S/='|e(l,P!P6u..کguڦs2_OT-PK\)R^ٸzJ꤭[Pf)u=C x7تwj~33PWWNq;HauqnECE: j#V KTc;ֱj +@MF!-4ńunF=rh(-sMoV$ )LP 24Y _ލC|ӆA1cp[nĶ'`75ME%Qe󛵘@I, 28fP~E`!fzy]-"AgrTZ 괧^2}MKeh|maԑ>Y3MJPᆱ0il$jVKFzJ4M5w>4if}Cl@6QxzQ Q: 4JUgySFh(IkÈj4V-]f^l%QP66L6ik<];BOH`wr4bDS5faa}zbٔb8 鬺[-ZM= Յ&| %MKv Abpe5JS ( C YNU$ fK (g|ćU>4o$)ьRq6`4TJ $]jfJl7Z"H ԄpdPkZsi7bnP"3o@m|\gZd4YzzM¥>FY0O^tV#!"`QX걔w܄طg?~%vxYL" i13N±ń[ɟ2f=ʁRAhS]M7S.uAUUSĿ.OO^^H\|62hcB}b.O?G]jkux } ?4 776#m9i$[%Oaui&M_hqO@J[SddKQa/| MY*9jmsY h`--L!e'GK Y~zĔ5Y2:Ͱr*#nDRĢI-E4&?{*O-A)zCx@!#TB WhH%:t]A0ryψ_œAQ(wA] ܚw^KZ߯"1c t{,L9JTINFw8LÖ/nUy mWS#3k՟Ay֚Gk*h2)jx}x@z)A40xC+F;ExH!GߠBXPQabPyg ~%n}VA8SV(h@@YmG h mt_fdXjL=Ȫ-F9ՋE5E is۞Z~s1T2% _8r0OG`)N?Ǐki`jՈv)XeS([ J}z`7:Xzt~wXtT۳B~=k79*hVW_cBUVA6RuKEx |?EMZS%ʸ(;H>6<Æ#$_ QA M߭(5۷o7I)4cA4:?ZO請>r!AP` ܂'acMiCǴ\n C}h1RV\lP5DUPurt>Sxn[U{ynqtegjt^A혒ϊnq':>rȑEJtJׄ =hnG?Q1_ h.>6 hWHo{[Lg’#XH, r _'4U^of*:Rk*UUCӋdہhΝ !Ǜ>?$'zã!5Qo/lS|a\vƷ/TtR򝲈 jl%ژm#rE)˧ohYO`k [9̥3%=#@X| (xU 3A;N+yZrT 䜒L';^5zu {x֝^[XS_l_4uN%mԫ<0~5JαLm', H#jtx̎O2Q= '*Œ{#C8uVt&=Qںr'II*b .}A!u=n6&'mn'eGۀ|9gxW;I5.~Dn*o 趣뎑u7hlxxfٹԗ-#̽N*?bfX O`i{8ϬU%oaAgU,CՁ&EΩFJ8Q9iLD*]uG8m f ui'9j,Gd>k l,E/~)ԁbvGi„ y3<P]3a/#jXP@CB:@!g94^lH3HiiMW2#.7H >L2=:=RG+뺥Pu4ƪcGհt˖ҲFz6~XTSF Pz*rJ3; ` ^*ȶެQTM~͹`|T/#a-Ig%0-:X*2G,RzoFC/:TyRȢb#%kBd)7|n4ϝn[%-ι jbOsU0H W]ΐWd(gGcWW3A@%@DiXzӣZm !RTSJ:+M︓s|46sl{4jv(XM6Q#e8IcuX\U5Nxhʜ]s(GM}:jƎik/ީi&¼#n<;;/FFTIlGA$!,R"A[! cկn:;L;7ߌu=f8}fxL3}U8c'Չ)Zˌ8j(UMU&Xt̬zr֌)94*U!V/`[@7rI~p>ӸY|uUz/9/дM0;n9PBMA´AAImQA,19`RUGi9<+Gz0<,ﳗ6ѦږϣGΓ URTX+OT7TmԠceg5PVAyig{UBu4jW3:7,P3fNWx*3ULcAkeNX:^2~w.#x 8c*v9Gh$^^ žt+k8.2-GzNeQ]c fѢP,eISCygؼ n[K;J~!CYӂ㧝y.t}P&ɮr9 >0}h!M)$q yiA.LZ1oz3JOo?5D\Ѧ4Z#|ȋC(yx9ny[l+B uzEq-j)W RϵnYl-AP.xDGSU$5t-O"i+ԞR'vq֓'4sO<҇qiij6%/4 ڴ _=ܸ.N]rJl@HyqLh12Duy$dL ]29j\v*T55{Ў}(m);4Z0P$3#=%DIaH#$&RrL f'G3VK婑 G%YϋόRoR~G+u+?+9MuZ 9^Y6e9~rXA9Vm} ʫZgz*I yK7V asِj]8fiM{ 5#-%^NXgngn=RgYh_rT₄dTllsCo5.G,A@$Uzݼ|uty[ݔh&rwWjW ųU@QG=*H5qXVNJ58^tN ' zFHRVN"50獣Q݋tԼ@S)fDM8i[q׬}Q#E+H-F jM{D%U(ˋMX`ܵ >xq3i4zv4$D<aֵkM3&*.]=y"DZo?#<*)DN)O5?aֳ#?ߤ|FֱyKtl:ozΔiEw7˜#]kX/6^CP}sNC[md#Nu|Er-Zvw|&`ihSGm]jcN u;ˡ>KX-K0T4ݔTwGl,g00QW*IY0^abZO~aʹkYgAVj-Kq=1a=|.":WgS7{+4BvɊekkF߾=h7TVy,oD:Rѻ ,w,jpAm HTɤZNwgSI<wQMz1a4ό~|s!X:F \S:cCuAmAKSYo>QfxmI<&RQ(| fgRe2t1Qu{sEz4 26fjpF̘>ڥs3备fZ_X&0 O;9{uur[:HK/HkT=nGx:X"@%oyp@w/u SdASn|r$EM[&meTEdh/ ?)yVV/vy?tmv#ob h4cva_)ӯ8K;8].ƫ1g GҤ$Ϥx5--aQ`9X狣b1L{QNJ\5ZǣQ̌c¨/qފ҈ӤE ƤVg;wtȱRIW>+)3$jʅj,y)vѳO3Q1EQTg+yH1Yl!*F54]Y=T,{x4?#QCCH,H`!*:p;Vp{~]FμD^>^ 0O^g**>ams/gP,eP`̒IS1#:ӔQ J%$ hmE{=FǣύG6hB}*aVۨU:dևz E#ChA(A B8JR=q='M梮vD7)ҏ fI_)uf^]"9yB<m2%΢lS1Z AeW )ۼzˈSo0T&{~Xy/LK"my g` p(@b girG*XËIMoՕGXZ-LɸS1,+|̻yo1/aT=* b,} qc(B1ʳ].tPvɾ)iOhCFi9^~}8:H>:/ǕΉ^ӌJDEK GQw6EJ -[|Hb7钫/GUEn{f'\vykq~J>r`ؖ h)$E%yq$."7e5e4,Y14^aS/2u+:8N)SkRF_f,y)iyǩVcymZ*bƷ$Z}s"mE:)U~[+?{đ{Mx,#]yY9ږ*ST޺f'* F:\FH*znA9#ݼGvyoV<⹑ZIl,wx_|Fu{\|uJw >yW*FSPm$) )CO'!X(8A9Fq%C1"f z.U̲hQ+ss1 zig V^&?\ϳ IA\bqz{[m:8\뮶(ߒ B YhjEU:g0ޣ_ :҂(uP̴Sr,bk2$A*/ymLQY2R(k}ka㨯A!f.FDKOoGJ9L$]IQWBV9w~m`0v. {wuoQ?77SoI蜍8ͦ2C*m.aFu[ԊG#ϽԊֻ,&꘩thcaH YyQXL|j[ONe:>:6m!ӌtױG  /kԞ=Ϛr)<'PUGϖW70`Tɷ[b+x + v%QdY5^-K;gڽh3ZξRﶂ堑ѩrbU1MG 5F"Awy{j&ֶaǦ4͙ufs5Ư<aon%o"}mf*iK]i}wߍo'~yWOEFe9({mom皚Gc̙ƶE;?Gu,zHNSEFXR eG'{Ax#! cY|N[Gjg{WDYCf0--Uh20mNbS˕Met E./i+%SG l FW Gl3Bɔ1RV&jFF{uG`E[hE\1NA;J88rh/Qs`T^4۟Z3eS'SoDLZR>SF:*yaEccjgQ3z2ύ:ԟfp'mܩjtfGؠ48Y)YUkv*R.QgXQx\0-=x <5CF5+` TqC@<n0lf:`evgh$qu[23%"f4QxLF^1kXvmÕCs|m‡0uR?5}ǃ, RYLfG:մtߤNt&_J&|Q R-r]73h^?E`0P"@`'] l|)ot[ߣ /~c=i~$c5F3xs^"EhKpΕg|F, Bh#]Dff/Y[rKke/:jt9׼)[%zX srP&H뷈mW,|\MMf1;~˨T|S}OB_yx|x?r\d>ZG_I ^I$QC"Qyķ _a>]63QK2$CRj:9+H+% ܠ$ICXgːdҌ98qT_qT4 % jc-u^ S{uiϺN-“%;KNxH034t] _REZX4sn* !3{ylW`6btlxNNюp`}c}!%1DhOSHX4QN=شwM-$}`6 3fLmРݨh PNLo?Cvh6LcZLD4Cm'!9vQO$Rq G*RuLAe7~GUߠo_#J45d}HԚ6 nփYk(S-j]F"_WU97.T6mXY1?FHaoFnpJL/W b۹,BE DYU]4~=@"EAֱ^D*y Ra44ÍMl vZgO0y,,:~u+D>FKC 3@ItCF|Ad2y2'%ʱBYf=GgP.h8kftbpzȰ|څ.?  'T3QWj|ر{A/, Oeihbv ɲ;Y6ׇAo6&1pעpA ImXWe|4-c\qRA:o+.Cìiw L=-ZGPۄ睁'q0e:h:CKLw8!4aÞF'aɒ:O>`wwo&Ǐ͛ac{uMUWu[_S]Lbny F d j1aoK#6ljvQ6-:,pm>͢,` HT̶hrַjz4SMz }Vs@ןrMFSI3z1"IE3pEzagw&3់ +V?,&i6H2ϩgN7!C _MA*;9W\)`:Hvt$u֌矆ge<IĶc'嬓P{,3']p:7B¹Xt}|.ttu Q(T.*M{M]Ƣe' OF]M-N1B̙?q"N\"Fp"<I/ dw1]l9&ru6#sc0eh5}g\{|8ڛeV.AFsH61U4`O!`Y2g6X9 0CnLb,^z#88=Zؗ6@{c+ ZݴKmVǨvy?_N5J&g[(1'd1 !޶JE,\} F/h!S'!],}+o#3 Y.fQ#ka-c.!* ;C8ƍA Ku Eʡ l4*] I 3hG7],,,/yr}K-Fט5j>^s42FXFGutth[X#g Lb o9ya>IJ8SQ!rcSKUG~hIuJ|`~>sErh?: Y/prEй+WbeU_X =јeߋۋ~2uw lv<ہJCrzyO@  Hџ+7Aq+x(}8LpQɐ&Hgp"ìͩ~MQ@g!8dG&d%u|)[7:TN,áxlD&H2'7 6z}%@;;1Yy9(QG)H qE8+pl߹@s2Gkn{7ގh 8LU1D݄pc.G`$t;kaUWċ/n?}7[y p6F()ֵ᧑( >/GUQI̞ó}{##/>fEl0,9Vu68Wa%VGČ1Xz|pɇ}È3A/Z'O ׿\r D9UP{*۲̀)Sp mZThpd($h6 c n.F߈ `9,a/Y(*+5H猎u|0^B:VPު+Xy*93 G@1GIuRb꣚HqFu-Fi'H[ޘ .a<_S iwx;i5,^gw0@AbRniūoz#M<ғ/zCز/Gh|Dр&r4݃ |r2l4 *u\`5BkI+輳c|ĔQt6sl fX7O>L-4"Wmz򊋱njUU_WA 6yK4:*k sШ_ sՍڍ)rhm4r\o_/iˏUrhaMe&*F!9zs Gاьm)\ Hӎ ɴFnHL~tKH5zF:|D*eᴥTo|_ :_v~s]ؼi;&͘y'%Vc|Mck_ID܄VxY&MCGЁކN~5_n ΅}L z-]. ;Vk/ⱎq)hZ׼pʛ_6lSCqGއ&cMBy8-aWU1Ju83z|L947>7OYgi<֑93p֍׿P6x7v j(8 .|WvGmCuMdEZsk5olp`-mdFij<ß ;W~4DfOc9᳿)q3n;dL'r9'NwumG"|C:j~+5hSCf`Q3'*?'|/|~L[u9'őM[oã_ Z]n>;_V|7ٯaNOA`^;?W>9nvC[4x¨wmn³Nǡ?17pŅZ&Csv[Or4,.Z`x3hgUtTA_pcNEֳRVⱞ_jD4ⲥ fp }ˇ?o0혺j5PzCx܊yH^Tt3;9KΒA#3 ܝ9|f=deas<9ꩥwUz{¯~~[vgdl6U߳~vӧhΰd˺!Eۡl?Y'iGz3{J.~}zRq2,޳H_uׇY.BnްѾo>9m|>_VLtвU6(YI^I"I[!M{7[a^7[j~ym᧜lWQgjKN8ޞ<s$;[6Lbk}_/qz._n<1vf֭_x ?ĥ?yϖO=ַٞ)>Ҏ7ີǺ.'HO? ˩+ ^xlaYٺw(|/;S;lXz/p'p'aj%>]ww }f&-mŪ>ю>h忽r %RV]|/cG^]otiٶ_YgSf[jAxm߲ݶndGjΐI[{z;acnLF̛tCsӄy7O?-d31Jb 3Z)&S5uP~zU.ޜӻPK4B?Gq'Y'gǭS;-BfnʓVZ활%H&뼠ktXgas#{XUFmi2mu["W|nQO- 5G=c 끲6<ͼxU ^ZOX_!9lfֵuP!nn]bl5($?OְEܿDDY\/cء;ngcSu |\$]iLJd ҿ~CM^;H|h91x ''9؟~w?vu7ڒ%zomf{׻mWGֳ0;, 5G?ofŪ+ݹŮ:۾}?)VɖʶdJ)Άۯ/8th\heAˋhM7f^r2J+3yEV.Uͤ2[xe'%4:l;t*KZc.`UT22^Wp |_wq<=5;V:y'/|]dwR}ⓤf,]em۾z|/u/|J ۯsPǞmv;f<9鶒IG?_o{=X-;e\wՊ6+=Oڲ ;xg8ØhIX6pp4fu<)f۹V@Gh{يőު:OV݁͵x~{p]}i;&jCYE}l|&*JDMs$thE, Rfz,?!?^ŏ~?~lͻUqٳj;be(=%ϳz;ş?v|SJfl4e#,=̬ mrζ_{۸¹S:}\s_S;\Ϊ`ؒЧ֍{nmW#d)uOݪ%!gYf144@{IwNe_}_/TR]]%::߿U'D:L?^s}3+{wa߲~Kh,~$#}_ՌfYw-f;vٹyrz!9nG?m?\xۏ~obq96xX װ_b{>`-ēO_rw]nFw{_+CqzշWm˝O| 3v3a~ի%dVEOV:[̶]6lERIK m;,. ֩\\;#K-zϱG?vm>t`깼ʎPLΆ=l6p.nqӽ~WExot 7_k!fz_3 W;hqt&ΓYȅZL79@G,fFJV)5KCV+le*=jcӖ&Mъ;w -ӸY(،%kY,&fYaweG~g=8ܵA[nfm֑UV5tZQVv4SSS y8cA$HN`yo`1G5ĸ|YQGZJ3 | +vC"LE %nSz*&AJ[0;Yf|R[:ƞ϶| 5]e^+IĤ֮ܲZc錸4dc_r~Ŏ=dY.'d)~(s:GU9>o#.,.[6o%)+TlM1kw&FƭgRzk9>OX(9 "Yoۧ;e,l΂RʢN=inس +hzV)줓On^؇V?3ΰG<,wi*%iF?OnGiCv>>X0wRKm6>1:cGkao?ﯲ'>鉮fs!]Oϭ/QwͲh!PܢKk%N#,'CɰWsvP)-&[7bWvg>i}l71iE=߾ӄ@96߾6\+{ߵO~voK- ZE3 >UX~z*2iK;ԜոPcC\VeX+(ikF②([C'{GL7l~澖o{Y/|wnW_r&d&Z>3kdIp}j;}$=} 6JfGbٙ)YN~mWG}~ۦkI×h;S{} M&ԓdv׿n'w܆%#U15k&}^mf1|yj`U ' eAK$4qNDMZAkvFϫmM#~?cnfci6 wClS>1{_![nE.WYDv%v^fJWX;FF̶컉̌F[,j]}gf-۝]u>^6`k.o,bL}_& `bm^1 EX#]$"e $Rvuֿ(%E_vM2 ֗pK5|/>7)iF v-nviz'=Ʋg?]}uVk&&-&X9h,XuTY_q[>+617eSA;͛,;>aC]j/m6㦛qum;[`tڧ֕-Q&m7w>ߵdsy[E2EKs"rDv{z;-~I$Gj'ʅiqG D)s[畵W^)yo޵nu . Ƀy7;Bj{ ZTۺj@r^6Y6tr1eܴ"ItX*VjpdGi"{G-Jڍo頉]6~mv% 76:ff%;dIɂmKڢ cvO.[.Fv˯lނSm!e]e%+NK, |MZsՂ͖VjwUv&Wru/C>җ)ѯ^+YL:)[4S}!q/ &]z2l;xEf)km…{ͩw˲^jmK-ڝ.[2o;휳sxMn>wm9Hm{f']YDa7ܙ=3mlԦ`힒]5~Od&BPx UGZCַz_]qolm8l<6f'lQ}=QYj"{腯'k㥌]FcbBm,uw>Ƭlõg=LÆlFqlΎ@Ӟa-V u)촜EֶnصjBk6mI ٙlY| l&_k 96ʹ/ CsXUg|^vfQfgYF_hȻl <w 9?ߓk-,3Ock@/~wIEY 8ՅmlJ&-ʌkwBXv6Xmvքڝ+)}ݩIN8Gj4kkRFc+UTzӺ x zaW,pLwOlZ}}l2@q`jEVv&'']]IfՊr[=$ 5"!u!S1 ź |%|U L'OlkmRٯ+C'0Zq 5(ܨX8yqUbQ Ѫ($^ `נ[h9T;0]ՠ5̶x}EС.i[cy~z&4ݺv߹Yٗ_/}ƶlh}yv#ϱg><;뤇XnߘE9Rl,k=ɭ;ȳix݅v?bG+`8ϰ׼Ev#k~*ڒB8QGǝ`m9m{F5O}^k)kdCnKSMfٲUW[^zD6t RfdPe9 $ ٽ#f+W>k,I_*6On/x?/xmo-6_u6^'1d>ηO{'ڝePsf1*}8|kR_X#hƮ /;RXi c^?u׽vw.6؊.oP0vc֦%͆XG`=j`:iS{eoZvRL[PnJetMM+#&mDB, Ն ˗4ۻFvX8F," !o5ǫ{RhkO;`zt QG`d(KTk)/-\Fx:zN9.V6en]n;llEW-_ض]spB2)gحW_cMR;ª;ڏud Vlzψ-OJpu[|jƖ ۯʢ;XP5VXqrʮ{-?6nF"C"&onzvܾ1z--Tl6#E ⮰ubУ(2 ?eR~ȁ<oz>Yb}^m\ (Ǫ}eԕΖ?awڞM[,#{U,+dni8e\k;WXRHy쿘`dlʍU=v/c֬S#vo/nEg 6q+j,-~X[6[e.VkK]`ed'glZvb}רW\cMlB8ct5J }7m+]}۝dߍ[Rlˁ.` =@Mq ;~ǧkɏ"}L/qǏxqQvѫfIM5ó⑉q[*ؐ.cO nGߚ@[58"8P:U ƭM'ٔ^{-)^K8y]-![ܦW[*_*y5&BDϡ=cH۹4v|Cݬa<|I.kg'm9U|W5T aWֈKDl ˎ*I)aLׅEAT>$'[XRvˬ£;4_v[<`:_ZdETg"cݿD/"pzj|VVEŒӀjŋ]֭~,-\L@ڪt^6 Ԙk|kl,AwWh);ϲ_vMa1M*1(ymҬ l5w)0b`q),WȻH,je42b/P Q΅~2o:tr4~ӘOrgtn8S89FS?m!D,pxHQe,s\CK\A~OL\[Pf3mN/}. 2XxPEr%> 9;Q)wdÚ\p곯K?y7cm[1g\bФ;YRMWKCڻN6fp'_2HtaUYK)Eo;6{ѐeϮU}G;- '/|=~ZenwmB4 isxEox^щSS/IsZ:rvIIvvJ(H\*LXE\1oKW3O9ͮlZܜ5+"*B6Oyx/~eE}[v {u[mJ+7Xï zޛy Scmv;-cWJ/pAK?'m̴_O_ضSIK&_cxqw.I Uҕ6r#G౹~pݾg,iwll}8\r֙p19a+߈sD/ˌ۲Iٚ]/ϧgf QB% H!2AUj6Pl0jR@A9&RbT.XJ4H򄤷sVZUBx 8s3"uYg$u(Hߥ ]F~ΕyR=֧07-j|u艹B%^h>`!1#Z܆;+l z&Az3ljFIDAT_gaIɣ~Narqκ;֑YTV6kn+~',e֦)NKiBO"jigsu[Bżuω2EdiUGHg ,x]uqMbe.Z".[N}6M_Y`bFYvdWX$NTBw3ij*z>i ɍ٢>~4>oT Bm#D94+ YW j`3_Q޴5 odž=j\WC϶K6EuTWk AOL}O&q8иi L<ُwp.U9Vr0lE\amJM$_C6[Z!;,(YBIB ndt:GG#7v}:8 s%Dσ|ߤ!k$#qr."[1ĉr6=1iK/vG$5“6r,wRC﫿̀%,z?+D+U8 G#e;WYG!/pG_>@F.opTI QVb wJttVy5b%6+:2K&8QtV[nq8>߄a\5smQ+|rǝ8i9TSp801}S! RRh4 ,׆"3 Y)H1r er)8id벤_^Њ`+*VB|E=Y\^߾.)'XZscQ囄Waʇ!LSmݗJXIWivJRmML7 Ya6a"f} #AߴN[:4Y!! ѽVl+ OH9#!:*\,+0g WäCAJ -&xp]}8 i'#yK O}}9eNp2GlY@7;^x.mp׿~t?:e]6_|կ~un&_NyYC/" F<(ă䑑!@܍ /J҃hQŲ¡u<}'!gC͓J,'p'(dx;QkEg9yF>]:9ᨛ|#?ƀ ɫ4V;!?NFDD;)^\d]yEL6T -8xxo~@F%҇߂mUl`Y15FGo>w[;&qC8OQ,vcU!|9u" ρ`]!$usm'0]^!BQqqvtu`oe|pyyN:t sF9g:Zϊ1NPݝbk7E)+Cg_7qH_jgHWNyU[PVG:RM:xOE*O=r+ t7z61Gۣ]@m^AFIzl:_ECCR2N`DC~kՄ.vFި]M}W'&c5Yz{X vFD3r#?R(=J+2cE;V=I_'PUتִ{r(F}xޛ}@} ķytJ]Pͫdaկ~|K_R{{)Ҽ"[G+jϷw]t;"oW{{WgG<žԧFIwy׾NV&i ܽ,!O0{q!>*=><;zb{NEN"P4^A~ے}z-/+*%U͌ k\L[CvlUo@RZqBa)`ijmW]aX<$'ppD^.Y:bYg<~SQMcVlWNvV2 c1Ct]we]xV_s|q_=e+QyZ.5氆U + jhL֥5DUk.t(r]A'ݛcSE{nB/d?=Pg"稟g n\@4> %Lt,tfwN^Fm5N~S6C`W!jah)Et93I 3_,5a$ijqP(B5E|\׮&c]>-8QKW7y2>0B _Wi694,RqG lZ\WaRF-hw!Y{E-^۝+9xy^I/-?VRA8bzMU zS=}~!?!GNީ2h#Ŝ횝ARjC>٬pIHYMI=h>/v<|QNڨ`樄XtFڑUl6.}@}ŊE{lVs$m؄;loNcQsJ}9%\2R<"ir@BH*B(b McKe^}6ϸEӃ Y`h1-ZgSCc15e(1=-_paM.9# z܁zE  *̽y +˿|zk{ {,M^' =϶wEΈfQjժU)5FgFux5cKhXh>qXܹ;qX?K?, C̎;yq眨Qmb7cos?VT!-j!yv"=sW/3S؄SIa-zW{D3~CC%Ja^4Fo qc\h)+otquaXOJ^hq7Ӯ!ݫpT]y-=lZH/m훘u$; ;d6Q;Gc8!њGYicxX'  hWSb䕣/}K'?;Gyg?s͜tIESOU;k}ĝ|p'n Ι3|r=ShW۷m5;#7=)OWUg<݅Wda]W'P*9PK8#&\]4љN֤lzvmS_mٺŊkѮ5MPjY;<{8N|vU"~EMJaybADknYHG>va|$ktCﴕ=#@u:x[2a~鳄"ұv)bXey#pAע*lҤ#JY.qCy!|]^MR⎄x˝i3&}b |y'&rYɼg,SO6VdSqթy60μ `݌}l[N$o\]voo8l D8Iàon.XdlXgG5"%V.,ŠH%d{Wklvz YG51aMJT'G* ::[񚘙+Z 3iQQ\7kYkX&q p%<7iT(C] yn_X~ZLvj$xߓh0}]>xZA  mBXi,8閫hg[rVoM.OUi|E?{Η%xNz#\⬵ɨ! K^h$cQn kv_#,ł다 ufL׿jeoUo)콶-w}%T1s(;#OD& "B*Z"GŲuͨo[P"vLs?[URʺZoіXyīgT3?췿w{ӛNŋؿgn!թ=qvgפ.~;;c;>j8 dۙ"mkˆl@=d}Ko\W^&IW0qYWvyƗS}2 xM]tw,(g֒$IQ)g=>/خ@>߻> GꌚMfP .xٺ4 ^,1Hj 2IM~36Y6H#/҄Ŝ34u N:÷s7!w5@eNBƯuVܛU4FVe8q68hyQcT=6qu!G:Lƽ~mC/A5p23.?dqx; \oĘ oF9_U=?6` ̬&~6G`AbNvb9^S{~_@BmZ^<pq|O.O'w_eaݡZ8kO<~wM|$H%kCo/{߻lE9'NY8X=]??NiYngb% :/'g/|A]Jݜ5 v9^D5"Ym}Q1W{m;OFEc)Y]}ҲnqߤQU/sܓ>K~WXŠм&V=W~#f6椏Lt2k߮q#w?;0PsMN6~,̐Gmfä}_kO=C'o$3+{kG#U/[pqi+dǗrȃ.C>v69pD[f [q4q+,\-[֬BJC>\)oi;c˚6ZD<D,.ci4Aycg  $y. ! O.r^-3St/O}9 T0ߢ5Pq:O-,ӚwOto~0)Q"6'(qiqa8> |hB2,Wr  G3A9B1r};ӌ=x\+~jsPK79YơgѬi0鎶[o%lu^_EϷlŎQ;t0<ξy΅(j kƥu;S7ƹK9 W-679m_}]`3f۱%=* '(m~;Wpt-|wiZxOk}0}>}tMzp@B(;uWnn6Wٟ|vVW% v5ڲ+mxxV?y0X[.(G1,^ML?aW-.C>98BHrL0r("-SO{r6ykj̗^E g.A >C~,Ԁۯ~+wo +I{ӟn}c.?A;s>{eO=w>GI3t;昣IK/;b6[8OO?mlA_QLnI[Ik"UhRo?jeV\bq-^to1_p 0Xt,cR(ivKLWgy~{OZ t@hA'weHQl3B4ϗ#4I]U<%8"&" Hj ۷ڦ[7Xyb8P]7~q,g,[/5Ū+U,׈jҤ8Z<,ȂC]B06H?NW#t 5Oi Hg#TUVp5~:1LGD+~n? 5,`7Bg( )иͭDL6_'=y:%][p' >~ixƕ&4D X>N~sqYW5 $$0pfSx*(t𞞋B b)9 czyZ"i8O+8{J?8VP +X(D0ba{ZtCB)UU2"Kk\ 5 Oh#^V{Wq<a}T2"csˈeU{͇i[7n?%kؙ ih%eNiJ)u' LP=lq>ogi8mwi xG5nayo}9O0(oDxCO3C61XM̳?.[S\-bW|  ݊ρ ;XXy+^v6nhyk':0X`(!)! Wv>񏻅 .'wXB٠GXG3ߓc x5.԰ -#ԅWO[pg)Cd1LF3<<6v3gʮ.hŝ4]iwY&,7sKY+<7np  \rYjg//?ɘB`nz{mР- %Bu, Աd)L)nB)}2^Nޑ}3Nִ߾ qVGkqޭnyd6'$}7`. 4f%krBvg__4E9ZDuKij+  >Ir i[>wh~"a`#k*v1as*یu0.^u.YlF`8GcAk|rB⾜s刳sj= ػ߭ϱ5" $\ ÅvKk^:8V~ox@!Ч7_} |>G7:d4FaX:/, 9BpUxk+.uxs'_:PpWQ }mxG57OMsq7Ȃ/0A26}ynY];+FpAæ58^ηY!^a67̗ӭ}0LG쑏|e܍%:=9묳/ҠȃdGX!Ӧ4i[i?p3v,4yC95}"BM!7 5,eݧ6{6޲ю:X',饃EMݧ5, ⣰%KJH8B{ᳰ/'/,>*IT/CB!p9.r:DW\VBQp(G~'q/UusQU D.I+!wXF6c!ـ|朅M,JC{>" ~<Gh }M~6BBP #.qhTۙ[Jc62w"Ȼ{"SlP׷Ol_u>?8|Z6h o+qВw']&ilrb[K[ooX¥I r!@e#qo~,[G"&y.nɎtuOAӉvW/|Uﱔ&eOs P8w8=q`68q\HuAF gNW/}nz_prQMt4)k,j JM+9.[q{G>N RP'5/w 䠓Zcכ/ !1I[E1T;Կvnmi' fxmj{ob(O;V0qp?Ds-#ʍSN9o|3xK^K8MYv8-`\rQ/ׄ(G"IjPݓN,\p;+c]_̇(LBN e)1pikAiZz,se1P•$'_woSxN'?uXa{'>j~]j} N qYBVa:v +8k;?SWhL{86;0HqwM`)$^@C}R6' Y昋c+9-&y#0yBn]i=xh>p|N#l+.K?Ckƍ~ > 3!C Q@ݾ<8E1 [6['MN<1}噰: vmMA{rn!MObsPl66w[ $?~g1tDUYbgkͅXA˻Su.x,쵂3 5,瞎Lخz)+ysE+ѩ\nω`'7j%Eq+Хozӛg\X9أh m yK%N/v3P3OԜ~ D,xOʵe;Vkr0vL%B 0,D/8 3, mGx9=C'N:C,psjxP+I4. Y<=v4+U<l'y#" UrkO"8KDH!yV,6,7eg.0,ۉ8cPxE4/ ><nŸtI$lrjmmoC -MJz~.vV8I>Oqn~{Qȃǖ+pp7ڰ/ygfg-ܰ)=x;P1| `c(<:zTEE8X\&r<%)LNVͅV荐8TC]+gSb-ː=c’^dUBU4[%hZyI%MCҿfVqQk@B  9x6{zS\9'44:( !<RsS@.6 69:~›8.bf*^UOʹwp4.Z?WVw{_yI/fIq^`k/Ϛ9g>#4>ե ^@ς K~N‡>{ÜQJPV(Ro#z0ҟ!/J]E>(dI7F剒Q4pDJ 7񸞳YAby 2_А'Í OͯmQc۷ c47hSk{yzF?F^;h ^]v֤_˵]UsƍB.GG5kB.<gϐ=.؏W+Л/4gÒ{"}]vcc96l0?#'lG0OS+&iW9z1wh;GWHpLV rM21/ؤ-^";/J#≊x`Vi&݃ Œ%*=Hu+e 24ZѺ;2LbI{ Z"ʋXhKi,3'Akba.hTC/m8g9)E9l&f}-}zljh)zV/""c þmWW*UssU: ~^8sivVnNꯜ(aVE+[^׹4~ՖeD_QrMP ?~Yɬ^R8ޔ(|T$yWPl|^EHXVܫOxQm ssYu0ѨK8$,3-[ 86qة8ŨpI#/<qےڀG!1\[xe!'983͟8+P/|:Ynfڂ3%G4M;YKxa\pV,;;M޾RJW2fW/.;$e88?A1q88xi~x'$4]U6޼W0 i.'7 5_ M2JFIgw >R\0Tځ@2/wJH`R/x({8eC:N)z,,t:'<\: < BĊ|Ř!ѣ/⨿kyw\k+AD;3LX g"y9)Cd3 v'ϽN/xnDC^_8 @ Ux>78xP8 3DQGmERtxFW$DYIQly5(Ӷz#_&y6 Dr&1nz/OÑ8;p?eRnPepEILp/nm3BۤT|Oyފ)Q&7dN0(l5/dsbDRw\hG0k+ ˯}M@'jh`ӓI? \\v嗻VaCihV8E-#ÑiCO.?;u,pA"RW\ag-oy3@9͝0,NЃm9x?Q)X? .Kڋ/H| H#O I[v)fЁAQō7D+[FF-8_iyBfvxw!V\[xA׌Iə_]G[n t[lhWu£\l ;$ /eN‡Iʃ~/|ָN7 bdg,0vBr,3|~뾞rW4pnT8)Gw7M?Tgg5`hx -ه? 7?eeẀ%ӣegۨn#tuыEX.GW~fr4y;Pցj@g12%?&a&wœ8<l(촆I!j" -x&-(I2yJrf6j<4r͍;[yO#ݹ $~-}{hw7z:H∓Gمs c8y(ہq/[~|.u-\//rx~}B ȖWMQ|*Y wfh?aBW'4m\\eT[Yd1 T&km,%*I_k")7 Ng?%䦨^<(ǍsSl#>}&.iֵ̋hstQw-4,B&NcVPwffQy>-BL?دHP1=8RR`xBcq NNBH`'N]xN oC}o7䥞t(C>'vψ{ bVUJu&c#|QT,X{.$i44٩t‰0:t4we%q'E|.5'!V7 ]ڰ#=Sx3yF]QƵUix3g8z`DGG,U `WN\k%O y)+׊}8߿]<~6? Lg*|h'''y»c&jR<䣌NH21F d!8!IXp7x|+wٹDwq5޴?G'48#X R+)`v1OL4`UƵZ:f᪝u9 6euKrHǭDYdQAH}Z-` <).,!qN+<}EdZۜ2&8.za#n&Лn"QM<\~nůHcAexW<}=ę4j%+Gz^~<8 ѝ"):epx5q5*k<~X޾xRJ$+_[F?E9qo}\U󧰈0<-L57psxҏЍ_K~ҸdQωʨ~Nc4!09j*l]vؙk~mP CK{rna^>餓SOuX?-7 y+_1vY+ GҸ YwwN֠YЇ;jxv;j$qY ty8`;B1Ǟlmqs$+*BrQ<^ڡgx / ,{l-餵/x7[s&\`xyGx.62Vr`!(]M46 YPsE=*.LJwaHwGB_/Z' 'qt_gg"jB^LJGcqSC{gc|2|.,9Q-4_on 9y9 2;vvȇ qi-i /GJ`\_ <3o\VkwuP4;/&k3/E$Ԝ|`6=nw ;xpBns4~x'\Q/40%vOӒ6h7.E筓!ʢy}.; v6)_c}+l cIaN m[<DMBMʗUΎ ;.@&U'jHq$JZA2lWM&%5[L nu=w1L4D?.6Kp\s)T+Dx qfi?AsJ#ENօ3x': ȂMפcKr[x!q?G}i3)WμC~&~n~ N9@x8\\ﲟ<=͍:M9~cSvS/xG? ۝лg6~»s3y\?{NHϘ>1c#ng̻Ƃߜ;Kxq>O/~po8u/L vq6'ݰe :*Kǔ/esV :ꤾ{r)V8='=ɥb &`.]q<{_6K+?\9a/EIMo8ln^m7SQ=ϕ&khNEk=x-,z5m' 5wܼN8Tk0O ľ7)y7pF=x~,'|KGT/ QGD)-HF,;9tH:%ysjU$Kj蘐 kk\hm|?=} mgBaxZx3 ~{C<'иC ;&|easp6JMĒQ0op7=:=ɷR( x.I'9zHopD +y)OHYlLNYtlb[eHf;jR,аCq8'ZB4&(Y,1x{RBܜ͕r`ZDιeJ;+8~ϲZƤ5t}~cQMdir\$oI1 NדgjT~,DLhY!WdrA0UpͿG>⤓tΕ Rp9/r{Tq Œ4޽V0iѧ(\hxQҜ&Тʄ<q8"Q7ɓF{PYUgN>~{ܨ`\)Ss5izM%NW=$ͨOSetųχpF0 )OgzŵS._(IW!/~9! W2P*|*j{ZRz^p%48 fBI8E g vf&ǻmo.߼ϨMS t!vUͦ Y?pqR#?mn$I}/Zu 'Q'OMPљ)(c#mSEYpg4Ȱ/)OV9S+Y^㉯*P}ri}qF_"}TtaYYFe<_OkkުM^%$Q[8 AŽ96g qu_8^bg, إT!z>+f ug{(^xNP? /Y͡\i#S)(5Nr*( ;r8 xO0Y8=Q1sv6O8DS3NhH;/.G3TGqal<;НLN( An' sF%dƢ3{ /JFjn;Gvے%˚\pAcU3c?oV`\dRw҃aE)/e3.} HIs̼羈8'wEYxfD@1ʹq'=$܀MlL18q#]} p-xF;Kla5l%h</xX(3+]N/;^;>c_S9h,D{z9xmT0w-NE^t.S1xd4iX@s `t:h0݉g>N_SG7N6lpe_Ա.n p?0W(Ϣ=4>"~J9=R&g{[@./$윥B8 ܦ* ymȦ9S50e5P9E%I6-lVa5WHr2zM 'sokPyTwF>.%0 '`>Eld“x=Nֶ,/ۥ/Olqͷck~3Ӣ9BQ᫱yuY<0 Cߡ@.9.4eh iM&QO: [\zMN41R`C;GFi;y$"dOē6>1vtp:]iS6%ŭ+.#nhxk&MON7^0+-w>*W Ϸ wlýF&Sgl|WZn -^|2]{n\za o%>"[CGypeawy_>ʅ+cX@9N{R3<Ngyġ=Bohe[F0Nhwv19M x"4,~?Nj.@^@eW^n?b:<ة<57,p"ˀ ''_|—D =՞JZ$rn6pNMh# 37obq d$#GnAW7+]‰)h/@gA8vo]3xBnڿvj7 ;vl+Yg_ͩ4*^U/{D 5ȓ F:xZڥwJ4힔Y/S_ ]~7A xyD;e:2 ZgгSmEh¤O't;ݩc YeMMOࢯ $ <'!?&rv@BK`ӏ!z~㮼/XÜ,ቚN]*iQfUptAS p5r8x{F:KyVG;їsb樣p¢ +\N̗5 8D{yK21D;}X>8#qi߀ɝ|h>9:f?N'ܹ۝ދ|_z;{|<߀?E9><opdq  [`6y! Æ  :@m,p[<ΑN ŲYwپq]AYNkEm7n\ kߪ`_^V@Sd$>) / LUfE6ɘA31GmɉV~ܩ7&ٶSv }o*쌺;ݼe`[Q?v; }O3r~D}զ~YP?X)O#p_p _G&|"?n1F6DzWQuV1m8x@mF0^Js[!#愱AJYJ#hX`S{˺0p00 f}}2<% ' 4Y3i8Eb.NCú!&WG:H'A +۵KDzsA<5qV\_)==]#atlR$昏AF]3N ףI)mlh=.p!<0U>5-Jzu`Ipa@g!)ZWWt.uB?n|rn߹݅Y&}M\7۶:Wpk׬tKUt#V&Ƅ8 >s`6c_dG ǝ)[4B̔+7 mw }Ū*Nvf ^&_ G_Q iL=Oi@ܳwцv;5>.m,'&~~+B޺:'#OAQ4kKyK^ ^);g{"vqTggof&uA@~ŲX>MPXxQ;Ӂc߄LҚ&$HQjb@$dI]O&3Ncc;(p}rӿڏqlr ͯw$x(y?V6'B p2v16 "'GK}'9CNŮx-J۞고 ERL_y|'ڳlA/ cLx mG ԅ3c~x@v d!|3p%r|}O<~_;q,яN^bAno}=d vǟ*Git*8_\j/z ݩOmk3;\d pi:Њ{rb.dE pgn>uk* wιX^tKuwtڴtEG>QKqԘ/Wx2);Y.,8}-wq4[ Ch:"2m }b ;w6M==MN݌=&'ysC+ČxFMT 0w?x+|F vٲ%/lh{7%O";Rv|lDDCvIwf7}C}n7Zf!6p< [/c] ,ÎqGHE8o&2aA/ ,D/iDʐ11)GQl~7]0m}Oҟ[M?/m8^"ܙ0e1pBSGPn͝xO?'`[4( );iʲҍ,ނ`x:DC^W۹'8ぅbߌq)4h;ÒwW,wwݹ _6V{/'k$j}ݪO]uCL9hXh7| AlIL}[[e7AX:+ƔׁAF0i7#x.Y1xM,r"sgCna{KsR9I{<6@k5Dl6xxraצr66>~O ɝ;vk8%> K݅[ovp%hn$[CvnW[`c4 ۶pz2ٮ9oo~8zJ+ʶ{N}l-C)Cx7>M96P980:ԯ+/]MRp6st4&ܽ.}9ͻ{]b_ј%#V*VS6kG2mقlaٛ|vxPKBmLem![}Ʀf[BUpכOpTgJAIU*S_uǥmFvӄ܀pE}J$m]t{ff-9:_ xWK]|dbʥn| d Ǒ?,p'ڝ΁_ы|aɡnw|`OMH3 !wz#w[2@alMIE%k3ƽ C}Ȩ Al9nC J BDg;cBnd2[jUMZRUb ũf' -NUPImrˈ0!MR2-^,..*jp$51ye*!avA5;4`KX%X2d}ū*_) IQV_p3> Z͛6ٌrQ&e4)ֈh^l"0͈ci88)[.qo)7 絥^nEAwmi N~XW~?V ꊩ);u=j"zI i]jwX! l"ɖ|?W#Vb}b`KuGi# љVΥ+}Đ KHџ5Mge\ nl-NYϢ!;]%>gˉcGO5 eöC];i?Sn><µcB5`QC}>?;V>ӿxïz;6UG |:׆Vrk^{9vCsvr.[!eSL,îH;8g%{!6eE('ܩlVT8nRG?ʦF'5QXl , )eGxNgF ffrsn6)P5gX՘^g{qO(Շ*ɀjiGc&}cepk٨sq)>ݫ-Ju ٪CXb, N۸ K!._dUMowVHnrxbQo/W -4JFMVC 0ɏA,ޠG)(?<(6&FHC)|QN9)fi(: ҁ ,t w [=F$<8{0,9h 49#BƳ>۽.ga5" ÙWP|# q4z͢x*]pN\v-v59D /M)$`L#<>Oq S Mo|}E{5˥X؍wPZb$BV3[\ |^pd|j|tu&Ot&mÜޱ{|J}Ә. pk1U/qc\݌X:ak_,"H/M|nيyI5elxG-YՔA RG_K; nih 0s͎;늶qE)cNKUorJp]7Һ2Fe]}vĺ692dhW{sȮ=.mͲU֓b&od[gje%CKsk%2{eh"ӛ3N>##8'uZj˳d`U~&ks,ƃQ]dcuĊlR˘ρA^"\7hkzS/Ëx:&\yf$7i7l˦;] 6Ѯ*]ʀ_Q2{@EvԡGcxI`zvۜ4DyҒe+X -vhPpvK[Es>Nc6vUm5qmV 7d%kڡ'm@ŶMup{˖jw7پHvݝ^YgvL֬{٠  \JRzr^FцIFtj6Vح;YّadgX4Ɋ%-&\K, ^J^}vLb}+VQ>T57AX|$;qN M#3hukEE_LZ>br)%dmXUs!ɨۓ)j(}]ٝ6 #Yۧ|!xS%YB9STOHV_᷍6Hrb0۰kF;‡pEFl!WHdRAx"_aSqDl7Xp"<΂<|}SY~^9.8#KNaoYA~`|M]Y! δM6Ξ֠;30i'A::aA\7t{bxRq5MTD,6iI$mc=432^dI!!  HGAP"" ՀJ$ dK3~3wɰ;!񯂾w}rsnU0[zi<-Z/&%yh)15 w8`{t8>qQ%DB~ޭA 8q\ ʤS#n޽kY[G-Z?:uk#c{nbe>$-u8j7$SU/^sNGS物苳OՈ`Q;sXJdh '4௟E{W)_e}?*k4R)UR۫Ra֬).%Hl>u%U1:ϼonE1x8H>LֶoI*법+l/#4Xc"a]֒nqFm+h" Fy 8J2p޻{MNGRו$V|%]{=^ǟN{Urmwowo3d I!WCK;J(iPB ΊDNJw)֞QKpn{ϡRv-YN<-[Fkԇ.RgNp\8IR NQh?ķ0‡zן%uG!@PI`# =CZd‘PW 1ܓ$],CAͧps|g]콿>h:q}{u]gi{pq=[~ͮdkh/| }'e}k_.m΅l1?rGs8!sbG?ymlkgkJ惒uM§'Es3nvOJx}RPRWo+ )fEp HsP}p;ŏ+{|G,Lҙ:J]J&۷ggO{͓# 8EAws-N1161;1h$%pm)qQlٺE2;m+goO!)PiZ|b8wsɟSߎ2JY?6;Eɗ\!g=]=8h_[8zh".:=p I?|4M*{Gl8 5;[E^IW_t!_vR' X~qFɄ҅'J(ǍZm RvwGt/@'ŋt N;L&_ZBN9>Nʏ.GR р_AǤ˩>kWq8'cB:4@LH{qtRcj"7̃fYYBR\AwU:>|S3[tK4 -/} ̀ :ǰ=_mn%vSwwں5~CG  \ܷ~ p,董90焿Cvެ3N{Rz&OlW7ϕ* u]PD3C{%|1nein }K8m  y|'O5FHo\,y7/<=;.O&9`"߽4,:>)Be k3mlwEޭ8ίyTa,2_t]6%X[Ĥvr5=x91< n#./OjVK,?qOVYS]9FU[>c \}YPt>W; JGmnu) ?.yu7O{m8q<'Y*?xX N֮?_8ٖ{lprɴ3MJu~ɮT*+q-~|hs5`umt]YxE{gt]VRG-X$+y!>$d@S}Lzg잞~ ixarp^oS_nɝx;2/]w:./|Y/iM_;wJBF??qDhzW@gh2үyq=>Bt tt2,ME/Ylנ#C /7Їuʆ73C2{4Q! 7wCIW֭[/ *vIxo=r䘄=&ϊjM6;%V.^j˪)r53tA)&_p;g {vmf'LM^_E1Vh~wL|q,oxS֬Xm]ըN[deci۷CC- 3jgז*"I[`394n1un;o e2BŚ۾>y :|'Dsܖ .ȱG|*6^',sV{ʓyEKTcCa+_sD?e:ɒypRaFIu:``%/am(AZ. wy ^~kWt૒+`-<瀗 .HHO-S2 eK*"|vA8kFب<= cEWm|y x6{ݾ/;c5ĻX nˏAӽ>b1jC}6Ɍ-f8Oi|7ډ>@t~;y6O=vX|ZJN+wmVC"woxIY>zOϮ^Zi)t'-Tl6o|/ngVϹ|ߵgj)[DVlb㥸EeZer8|=6u@i&NGǠ 苾T},]|Coe%.uEz slVA_鄎3!;㖲ڒ-N锐 ~#g[K!`}R\JU۸u>-BX}9vxdNx-Ia#|P <5V" @|C#P(A! KADϕ8 8(uOP6vgBXOyp)3`Cz,":?y/}K~1-P@>"X8 J(oL s>e eC{0 A2d5qqqOI12 ĽqVjvq'W:i[7orwZiN`΍,-g]cd} /pشQ)j]t޹y(DY_bwC[:m>ӏ/\l2cK,qYe&<_ād <.=b`ԁ|s|dj;5R zxA mS$_W_x\3:Ϧb) 9a Y=zϺ(ΞC8]nv _TҎicn/\=Q\i+^ZJY$X@~-Ё6CsHu|BC~|g*%Nۯx?e[61i;~J]vO,Yj{?׬X߻ϢOcwK֩wlns#GmD  /K?T۾>HgIf[+ V;|qJF[Ž>le1Yv#ݮf]v~?"8/X^&"q; ~ҽp aQ^,|l|>8'vn( 'zSROgK o+T>'pUECvL e.-6yMcv@UZ>[]i! 4pBLhL۶qU=˖oĻFضZE^'bPzli.1n#އ^Ft[苾F}Esa"]8l/HB\aaä9fbCcvX p?(Et;\P_jLfoD:1gaªɽm 1v|T %c&ubuTg#] (̔3;(B[^P笖0S307`-Z8 4KY;khp-;"6lmֱ:ȇ4W* }%/@'ƫvFǎ:zL0pYwkms>y/f)3os_W3zb1|@%;ٚ;6ceI-\܎Haڽ+L:zeW:X?S" l&IE#-jM~j_@q$h=~9%W^}D%|.JN+/5ι|WHO?= ō'9pTQ] Q t֖}Y5>~oȶz>_8e A `akTI$ȋ4W_GU.wWRyYsAUc&}om s^,pBj(vaA`j.Ä‚wVD`GQD0J)Jᔋ0A0F~#Ƥ(J`%.uy`#%_+e!hC^\;WWk3;jx#K<-΋\V uW'.r/ pĀSҰzF|r$Gԁ#~ `e] ԕ|qO2pc2WT xU;)9'Y5" /ZJ1-dUGr~$dC? ^X# |zzn%7adsNHe}ў(W"CoUm!A Q3`w,H٣oJ)Xxi(KK?&C/KwKv?x#ݑtj"YfR>A!ql۳SDo.ؼI3آl sż-\47JϦvL5JxҎ}qQtjbG{m~(+ހW.4GOzn qt4MkЀGUЯml3nٸek KWZQqu{;&YѪA4p3]!/mޱ;Oܲ%q)I{ htݷulX/!rZOH611AGFY|]mE=/;XT{|baU8"iM;rq΁h*eZN;I_0q`ſĪwbRU1t9:6kvs~qT;uط&D?Jn- y^{7?i|wZ C'&/mr8= ag;w+L3߾kM{zA7ۺz 5(}Y{/::,MWmᲥNKSB3xPWsU X:z{ItcwB߭?ڲ<ΝkjvX'^,Fq|`&nd2yF6Z .qIn6&ݑELx?#Bz;2bʂ"HG4O&Ļx޺ۺ<ͱG&OX OGŶ>IDmgC '/Pn&;˩%Γ̧^){]bOqCꄉz:5=$|º>}D BE!yqݒDŽ-^~<.cta$s4&=A%Sg4Q$+󭧻vd *vuyOǔGkKRَ'~Բߓ'ېU6^;OhZ|gm.>lRcErhи,I~OJ8jYϧE>i/s&5!蚱 ;I diZv@hqHGEBaR0~|O}8,ѷG_!>B\Mҡsv7zMxNFtF`$ԫIW蜸L+ K`;1O+lkҠ~%pt=~LL/l@0C$. B&`>C0EYEIy0 @ i@2 =/ CX`,kqɓXo 8 f6zSLCa`A: =`xO=u'=a I90_IUc+d8/āh(6)[C[L#,Ґgh+i/F0§L x|Ӟ>ih|' >j?;H:WØ7`'l)SP׀ڐ=B:Q.\CG>I<ģM5 q0̔6' [b鼴BLkf!:v6M'/`^L'.Rym](٣1aK*^S<<)(G&y&.(8iR fN;P|=F5BK9/aړɗph|>ai[G8鱄g yP~pehTqfK/dՂ^3y7*BDž5DLp)x2a&a>OڟO9˿Kso_2n<>O}wMo<^{]9JC/| ox SA<.U|x]ñqQאָߟ8ӛdS4Cpt-߶zy!M#/ ĉoоz.A kxiO耺)pLF@?v'_ʧ7ߠpEq8LLԢЇ-F> <)7}xx k1.PF  gXe'Q"mCt\ ^I "/gc) ;=a NyR?p ,$d?mI=xlDX#пtS6q#m\?  @|eSvWԝ4!x(0:/x+a/ / ~\ ȗ ,7XnA$2(m|ڇGS6c>uHC|hM8Q4Ax4!e'q mHӾveMq!?t-紉&3?%>|>|W\? ~xԏ|Ȟ;_;8⑌7~}l\vq ]Pe}N!_7/ԙɘTErf Ǘu_W6W ;rXeYia{}(Xvat;wv?ptUa,W\B͂QጅW!.~ˑ6;b-||zO(o}LW |\ K .` )K'D]m-6UN+WX$]dh -EJK%8]Ӹ@t鑘% _Xb@&Ss]V.-  ޥ0PZ;~R|zվUupoJ>tUU&,nQIPz^RNߐg[0Ï. `zOqbsLy34L^ ă@*O:%=tCMX(|_74eC~#ț||u6GC{6vS~PP'Ąx6'i)3@ф򔀉6WKSUx.cu:s 1@k$BuWl!R7폟oN\V -|'4HZ%EB|Qwy`r`{׻ޥ}؟ySI)GlmvH'#~] 'G[Cm}hc⒆o@  ɇv~c/K|Sq0# qc0߼O@ԁ4#qHLԙCZS/ȅRP?ȬN !+oIAI|'a<C| ħ<=s!?mȓt0k?&O<o^`Ǹ8 B{S: 00C:`OK | 4I^C <ă'0lh[+N;Pg`D| ?8K C €C 8 }r e%\dlLN^NE3;8RUńn/d@yd}/9)|}."~# r}=WxU3<\Ȕ #B]% t<~ɇ2+oaSߘbR[nwRͥޖʓvD,iD8P.*~6F5 B)KY3i|'F_N@_NN8{zpodt卵̱8[vIᑲ\)ϴHx,[c&(2 +Pysz,cxxJ5LY&^~.tcڕ;FzW騣z+&Oz{/kgMcU-h6`i37EtˆZMiKiw  |1ƒ)I^Uub/rI ,w?yџGF.9"M*3Ut"RxYhD*^'B.3\&'EI1(ݤ`['XLP!\70A`fɃt *?G}MٸCYg7gG]ce(/C>G4p`:N!l3|Q)쁈 N7i\`p8ol~:l OFLظh)Cf6<|ю/cMNO6~"'l. CS4 J,q 7!3 溠f1w'|Gc|Cg .~^.0S ^HA R,C8ԙ|!҇ >ːGȟ|IAg;_о#ƶ"-T>:õ/@Zڊp Ґ'aw;|'CCO|vx5`E5Ж.]鋫MW$C&>E[,#ImkWׁnEvq2.<1 }vuM7Ї~e'#l_n/~'ыO}O|)`g8_x{d)τ?wy= ɋz}&+ع. c L]-|;\.*|;#CAoLOY)+$~3L1p6b# pN N65?-iN!Ox對?m -]0,|o!_6+%>Kѕѧ?fMdV XYq1ӹ6'UE4 K0lߞI s#lpJ(T,@80FD'<*F?Ѥ &@86|'o|7HŀLx#opG8 ظҁ7:R<'>kv> a ӓ2A˙OLp< B^Ff_]`Pq00tGy&gՅSț0Ì5aK:l\O|udmjH D,@P+Xq^t%}&]TZU!7G( e( }l\3" 4/A9&o ӈ? ~,yF0n|wL٤jQ]S*\s1lUL-[i-7*;9da$[sp/}ɕ:vu˅x:J;:% ~zHWO:Ȥ (ذ 8E&Lw87~S>07N@O|8Q癨A: J'!/ Cٸ's&cgf6BL\c}ͅ3ĝ\" U>=_|OY|mL[ 8HD\ސ/6!\,qB>`$ aG0z K<6wL|^r 50`C'RS}h0{y3p{!qگ}v2ݖL}L:|%Cv]~{?j7 LAb2}aG+Gz <dGg|2 lȃLou\5.Y<܅aBO[ Nԗ=/ƕG:Qv=Lө- ڷ4! |4A LH(LMoc[b 7 |o!)Q᱙ j6kRc''T$C"+*~~"8' +,n ܈.7F2svwqtɄSk+ gAg0,3;}1Ci[Iz64Nڀ[^;z'퇞NJM|6n# :+R ΢ʴpO+<.Q`I1ؑÖ+ + } et nP@au BO$C=E D9?|!W% xp)k6|CYlAif.WP`TAbHC٘er)#xgPn0'ģ|,emꃣ:5W4㧃4H[:F>gj_! Kؙ-! ͆/p!N=]=ML#y|yȯ0%'m{ũ|"Ʉߥ `)?w+X21W%:1 e5gט ,DđS Sf7"/۰9.\)իs|~r;^ K*w6ƅa51 8n1qvƄ{X8Cof9DL0V_$ qxo֕IҠR=^}?\8':`HDMhk8l h G4%v zO `1b,sf{tJpFNMp)5 w;qpkP&{`6;MgʦPs:x>_iB .~) y48il`\a悏8 wVٱ4[ё?M|ŋAe vZE~cCq1sy4icwh+PVpz >wo!_l̛p=?y4Gy'niC2јw#X҇!Ncc_8 2l&{ﹾ o`!>0&6!_CɃ8mcc!8'o bHF&;]V:a.f2cg\R|2OVr:Dg-;o`މa;Mab'n~|b3,_=Yəx>&T37O\+U92v|ӟ>1>9?2ۿۮ۳0 r{рoo7G__bO}3^,Ƨ):_6Ӹ&jQ#,bစ;&k؁3Z΢t$Ж0?{FFs# |&Ya/:MrBeGN>`y<}31؞D!vp wpyRh^Y X~P 'eG@K>4aKK#Ƽ0lC'|_ ?><3` TlYfW/A[gx:N$tmS+x r/NL#]p'~`wg^SZv#Pq(}<7g>c;vNb,pӤ 2K؊CG[brlWaeMKI˝j"v!Msm?Bp\@S$A7ʻpQs(?'ZBJSa*$ VӠLD[&tPÛx(ڄsC O? | S.?WT֔'ς?<>ȗ3JA0@u .v4pkip1qCqC8 1_7'SlxNSUզOT 9ES~7g8U!~=v<;xK'xL3x|6lp^ǥ^SkuI`]vWIǷ)*]Sq[3ܤxFAG\;PR+S/9&+]}*xOy(pg;O:H2 x)iU1RDMDn<ӎrӬ&i@7ΫA} 6o:;\E'j4?AH0$ "Q2QTm y!PA?FVYcYCFpeo+zɤwpy.0_z>Ƀ ;p:e_M=&ΎF4'9S=:n~Vl5; ~Wq7e,© s#;CZ4/|Cq83nͱ'vaDEOMdeϫa*u;wu>[On]wghb  tN8~џL7l7ߘ8?|s1\!'k!L]tv`A۶OM</PE˴/7s ~pЏ^b\ /ߤS^.1}~_H#~/Oyďa\T}\ey*|)x룗{{*ά^_w«҃. ) k_C ?N?|a\~S~( t/It5S.Ro 9?v?7.p>*+>Z/Uo q'5QJvTE+jڅd&y!A[7u~c``6g'z&bt9qbO,%/X_xkX@#A^=iOW_mo{|Ș29lf΋^"(>Tg&#| LԄO\O={ |/^q\N>"3S#M@2}wZYy0 -95oOxT0w\UAz0pID@(!ZMw|(\F+m{~.'S>]^¤ET L֚Z6D[;,WTxaªSio̊&Z]֜M.ƫg_2H]A 7 = ; ' p .F˸pv~'./g+>\bac*„K*aŪ+:.,F-.8^6D t sJ #^wKMX`oLp$^I29JZ]п>QQ XV(%# 7\` (UUDM(kJ?֞[<`{Z[-G' *"@,-͊3jΔ!]5qR]F PF?!A.rC8~ɗ'8ZİϔoDp9KC~uUcgw*#t|_Wxʛ߈?@y 1~=)b 'C:ZLhz8G I8=]^FO[6}xxh\,~mQ u:Kʎ?#<+p|| >vS|V/^rw~_hځЮuPN xuD̲e*uVMޭZBaqN(mBRڜ.3]π?fŸҔ#^[^ gNgrCU<'+V}Oʧ\x6+-P^c:wo5S']1`h)-<c{4a-DQSPh;d1gyY.[#(Иp([QPXx>J+nL޽WPa߷-Ow%l@Ȅ Cx.؆Ls4Lz0ϓ\ BX>AQgdpayp%Nu#$c3IG]&'39U66^?F>ԏ2#7O-Y^\(q1 WQU=1Yă"w(ȪsdYSWhja{:?Cyom9}ϢG:@u >۟x]ʡ&oG7@tnB3 >x]?p[h^n5 ?vԲIKXF|"|I.$mQMSW3ŤDWҞOƥF7qC8m@#W[(3vWTklr?oBTOKFG(G%#')KOÑ\! = ~t+?/'?v*ߟuyH=gE-ǷY {K˝{DӘC˫YLz3 BLA~\\xRB;EfJ9fʪKy^^h x ݝOcg?w\tvF4p ;fQw8gMIVij_bu9zdsT|Mo~~K_r5'xՋ^۹k]tEv*;30epb~;q wp)>ySx9$:oku !&X|A&rQGaT 5qq0; K2Z(Zƍ)HjMmV5o,aj)H|'<ҤZ?a8?q%(~QV,MdI#zHQZrqZ2\~\}HCƷʟt'~=\TMO1RJS_*Ky< #7<-_/pP׊yN^Q2\2,&'zKK&nEM)}*<K8, |#5`C%xw>t=~c'io'qiGer8,<ŃZ&|cRR5(0\7_߰NZΘjkD& [JiZXXn7g"ƴjʌTkP g2Sa~S$|\S^ fy63;lpԉ͂g3FÆOR\ mA>\s8fCzlwv3w.wϪ|KXȓ=o4pcc4FBQcȻzQ& a Og9YVV^؁}άp3H%}lEB[<&lg3K@wYCCiCFCzl]04,+z+Z(xDF+SMBhonҮ| fz8K='>dG 6=!0{|5yͩ "GXcUQ8.ښ1(hQ(L1ĶiAkVȋcNL0np|VaUϷMaHCXGOr"u mil_Vnݤ<1u?ByONeyNu|bW5+Bf',GV(J03q|A|{&:+1U)5C1-.%8J4EU߰Q nlѭۭWbvdlț iB=lLuk4npxg8FÙa qyF,ux{>)ƶyAV)X+|SYS0u46p\~9_OmK_"-y5#6V͎AE#<\gK79K{s4RT38K~e(9GՒp t[~\K޶g\ q//i3}?|R.(T#AZq,;l֭g>6lI#//}_DݗlM~T鳟sL2Ǽ.L%O`׾>vϲÆE_rrd" =ر ѶXpGbQ; cŽr&;oϰêtXTK:j; 9" : x%h?X%iLv7 &GZB!OltHwh[U @M%vxxNK6d''lêUR;)%l*7nnIW$gvg' ;QXBj[رv1;9? ȏ|gϽ|W{8!#y ? kF n;>~_gcd.;pyȃ%Mu6w1!8<-Stu@St~P+f?~cSn۾i#9(h^J&0^ps[ǭz$[V2Z *~:mLlVw{_F @'J># 4 T, 0 a୾g৳oB|L!6cŏ .ӘocޤybpiD5s4:5\Bŏ`B`B?LHۘ.a3UƄ xn(?3|u&G}0@?&!qCF}+NVb yQ.T"l6苡^~1ܡҕBYHJG%8|5IEglEfp$^jLޘ:`s6␮1uão-=g#0[HisӿUNMiNI1 /噬i=dHrR,bkeϳ@Lh*'&I'$D V2C0|םPʘ` &Sġ=ab$ 1j&g8fp}3J"~_HOJ(ۮ!+x+;CÝ˄vLmKx] cyuEuu϶xM@ޔAFn!3!M(L ?01p, m8[O7'f&jFPDMUyԒS|6q HطHn᭶cݖhРNIY=R~\4F=;1L(3;M?i,3Fq0,]&syws=9˷m~AbH2CFXJy_P&ȋh|ѐ\U7ŷp4op̙҅o+1]0g w{ [AWTp&ןބ<7VLaBw9w^)!?')ן:cŠwc0!,7&G~ h?O8xPv%Uex%(2_$[!G^c~"S>x:S/Dwax Y,i$,RȇIHg-fps&%$r+b A&yOox=?:7󲗽xҟ]}{|RWҹ#L찃Y5 gdrXDA&q0 0|C.1sWq7>yC ԋcD?KR9Ŋuh>~r2\y6?`32cK)3=?& yaf$mAXOxh/ ޘ/fvX/𛸘FگMrkrѪ=6m4NT*ac~je+m-?RRҩ5菉f7{:,'a"$||S`9=1"™ !ߐ|?o!U.5=2c&yhЖBXh?÷=4@?:q'L<zJwyWO#ÖT?:x\8a77_S~)H3l 沟i v1wir'hߒ"XkvXwg OWP8AcfiM"C p x<#3q041$("< yz LPp)N, DcS+"FG$@;ƉNq# Ї|Y- x9*3l `΅ 3# zj P=B߈! !eFǛ,%`k:zL݌SbGiQC>`Y4YQoM[75N\ȓ:CqOj*;] ;Džy%kSI *f~O^R]<ݴmRTt#mkc'G}U@ZJ^٦ﳭwk|:շ/X_2YʕXDR9 fJ>O<;a~u(4|# ?ߍtn|~;䃙M+m4MG )m;ܻOdW%V ZDMpPJۤåԑ .ɳus(|ggx{j[9{S\vq*Q<oV g3bQ*$ag4I=F?>wOs0G}[ aa)3dPLȟ'|WK}A C0.S5R41ǤႽN V\4Ь--?~zDɢmOlj-o|R[48:SYȚg!bCofB5Ä< g0]t9>a4o`ibZRGN}_螕;nkm6<6Y)$R(*;jM1eOJǬgsb=ȩ&gP(ȌcrYM;hyK ,IK!WdS{"M_6 [lR\.q\$4~,8 x3;0r :CAgp&Ql…yr(Zt)=u , a|BHE8>5Os|7uiOIv[imyߪQ ND)3.o0/)Z5i_ɀ%5<1ѡXxԟg7aQ:8+yajt6y /ʲv6~"]UwybځX ~わG(2xb0?LN&ޘH7RN~ yCGJRǧ^~HyE}ʧ P6><#|G!.)*[usȐ$"(X>43ECh3~;c. oh]nΈ qyISvO۪_HHݠ&%tJCg)P3}4誯Vc~i҄eqkS6;M¾I3<ٕW_c/۽eujlbS"F3h2 !_;(AjDxsB c7TVIR \(\u~ˆ%!ҩ, 03Q<\՘ɏ QF+ Q rg:~X 0xJ=D:%psl9c*li.Tc)ۓ, M)KV_&-r&QZXȳv4?[xPfJب.O2t墡7ESt >$ }X&1Vi~~¸t|&IӰra\<ǡev&ʓz0 +) =vf$\]~ Qo:XwםH(/UXkVY}rD{9ko`Ѵ #NF5me=zI! ;jӘ_Ad r_rn'X2ȤIto&ӊ-ߐ'o}Z Gi{>זݲ:u\O4s?FӌuE?\pL:Ǫ_g-M|.|V֓t,eU/@:1{ӯ#G4dXb+j] ŐcO,%Pฬ*LGq]j?f1ZN8 5b`.LtN$ 3p\]'GB0NBB[GeHQ|*|fu@q)_ܠ!|K8>Bf!LQķ)@|I[ɼc(}%̩z>ĘΕ !>_7EcSat /!?܇/g[œ<) %2;[!%l;jKAU)&;ҡABP޲0`wITE1vEuJ((抴|LҴSRJKV-HԿ\/B$Q5I}HJ1%FbWOz5śmgM-q1i) )G&!L%KDl` =C7B LM>8O0IB4wFQ榭,xU65Dk6?2ь}_U{2S ֤]gځ{mTWV9zmxe\)ūHEz4~\3s^ֹ|aҾAk}[u _&7V.0Q | Ə6 m:M̈́F i 4!l ÿ́q\ܩ&^8D xE~'!< ΈgYMdeª%2V˾j?b}c}b;oˤ 6r8@=1O|c~ +0о}o}* 2UNTbfu\l};߲}v%yGVwݪwz;E/;j',#OnŎi&W %j<#:gŗH)F#|6 ͒y#Ŝ8oT|:..\+qhb4 UpJ_}3!Yd}B6%8O+4gmd#vAY{ax = ly?o{ry6bЮYJSL TH^Jd#2ZRބ,T=wun/wi ]v(ⱳ[ZxhoQY7;? b#.k6'D7X/[;jhÃg!W N1`Hx//ң cJ/:BFX™L+BL9oW1@Mnq^GYqwDP<܉83xydghW՘TTZF^Y-lg8_2;ڥϻޏ_0Q&:I>aN~w_Uqzp]Lp/OB!.&jsxj]W\a]KWy;55W+YƕR۶YGDMg1y&'YL=j_f;:oߧtʟf\tvDFӷi]114ɥrǡd"ƕGaIzT/=DMnbxAg_q8 }}B&V}G#b3>9ceUF0\(zz{  U[D8U*V;p\Q?w=]()*JIY44RLH\Ep+*'Ĵxq%z)%Uva$:GXD$dUBE0JȱMOfD҃?MګM!F!]mAmrd ܝ}~g3)-?˫B5^6տC]CϪxtp+|j'0Nj@Vq]B¹Un^ɜN1,ageV=e--#dJSbPSXTik|ΦEQ l⛔Jc 7!zJ.,M"C/ݔ`Ġ&qJʾ/p"&{b|Ҧ:lyKl=w[i.k-WCAVYd&P/Z$^yI>eV;XMt(f+N n\)߸[{YM &EkYp56鯏EiJe5_-ʋבxli}C Dl&$Uw&YI^pJE &]` ;kǓĘf h\ Gl[EG⵫mRv ˩ {]cN);.*-r]e m,yl3;i.srt!lx-qrEGfCPiPJur@A9eq&.GY}ⓞ aW\Gn?H$h #1>wӏy5k\fD)VQ0BQ@Q0~QWEyl~qB(^}l:[Zm9^㩓cG=!ޙM- ɄI?K*,NNGlN-^_-#%8Sԋ#bfV ʄ.<ڿ\Hr ;!Nz{$|m⥶V9:l1);040h2/FN(&9ΎD-'_MLQ:̤{E}NlPA& y) 8+i XQJ(_xQeKv$SR~s6t_ %SvxkڴzKFerG+iʓl'*Lnt4g1}n\It9-y\:F5)2+"L:(<6h,UF3'#.ʠrSgp)ImzER\Y.C6W ȟ&u=]oLYIG&&O]BqE꟨-21# 7J|'DW EFD?A|NčW5[U4)ʈt5ApAKu?iv[g[kLc GlE2O#OdԁcSo@ Yx%aAAWdA?KjL4.ZܶcMI)?] 5(FXu6Sב"'9qok1)svMɝ;yKW5f1Ӹ7ʣ~Ɋ"K( Bz:r+>SwgruS>놰r*|3p?:4ƿ.uklU`#jS嚵%pYO4 c S L9y2cC̣O>.6tڊ|vҠ瓎cf 鬜L6Oa[,.#qÙG~:u+XidVQ7L4nq˳1ή$g~}0*QԣpQxAA>-DQY\61n Iv5nG};.٤D /JOx>;^Tn`jp|sS&H/ï|"3;z(6=U 7f>_/)PLUj1';%G 6& "֒[`)f} ,(R;D/]j3^krA;(_|}Z~wH k%|Gns(T*eVK/?J9oX[ ;h5_G*c]֦;Hag:#@*ʹ\VwZ/zw@*k-i5pkUW`'Sj,>>[@Syr'3Gp7O٢l-춤$t'%ҢIzPxJgWy|jy` 8;}&sJ ܄Ѹ¦`y:>!v2D.[ٱs6_}A`ghJs6 7kLvw3;] (X:geZ Aq_bla!EeU~bZ o@tttvJISnEW =]_m|Ѥ/O Lb*й ckΧpLs_$A5r .UVK;^4!LC<*A ?$`,EnH#v~=~m ]/](b'?6} 儣ӳ u3:ɭ2c1:E5 EG_X[ϔ“z%[Jh]7T=|,7<$`Ylq҄on[+~':OF+P*+29)eB *RVа)}s6DtZ-M'guE{F3%NZK4msIF-*e,xƭd%+1١WKVUbU4XCyՄ\5ghHx- ~Op*if)`MLR6Ij.s]n²RP6l:ho)aIDڳ%bvۅqI@3_T,g3r>} ~m[Vkcoª2!;pD[$ BJzhCܠ\lp΄2B: 0p1lcwcr zXUܵkDWUUv.1“g+,$ G{p˫ \a2ĉQ&nڤMOĴp/77%:5){f7|'~^ijJYm4%R[-ȝP#qMԄ`ٸ7ܥ\?nY KÕ%tժt'lIzRS/ L]1)XrDzm0 %G2\eƅܫA\&fILNeBW|1u&yӴQPxV\U;.geYEDTo\r!vVQY^* n^]5 O6%Clp͒˜fcOr'%YMX0r4,7&8W,Ldtdᢼs[|\r%[,4w%$ Z%3G\2.UDȦtQ S{TWpZi-%"sBLHHMɏKq6I ~,ŧYIoYnLgq6QDw<-hFm)Oy:sn5|JǑj%d",Dx٫N,MYښ}D}"'=vH'o͢&ьɭ o;+E}Iˢ;JyIʤ-2`݉$I7+6J tQf{]Qᩉ+="N)Uߨ< xn-ZWGx1kJR*wDkQ.P3/y8*We⏗v(|]PMR#?Rt!^]@iӭ\lS&ҪHNĭҎʋ+WJ!nS]kˏ[ڴALD:qGH5R][hbr٬[ ^U`iNYz Kඝ~GMAߺ]mvߒ)Y&4~k4!7~87FI agtG x yNgkD/Qe>20 E֤Yh_H̓^eGxI;pI+2D|dnٹG#?tئ5(k]c7oќe%IbKY+\\}Å`UBmӺ o:,T%Tt5+m[lrt'D8~Glrx/F%T_obؾW-7Y-:OV^+ U9qRH -_A:TIqjMVw^j#=lTqkV\\\$Wj EɄ&ɏ`YS]hfmB =6A`+>/<ߚ{6}5ES~Kճښ j-X.*UQlqLI՛XtR՟G oQ{VnUfD\EMGȪJ$7=$L??Oy) =CS"4F#o|"?OW"EIH~.3糅'CLa\)q/@ĥB{㓓DWRzC6DJ=Xc7l%#ꯑˬ[U?(pJjKf,#ZeƪLC_#.} 2,䅝4gw `LɜȔ3K̝pi?b1y)#1xVk4A g~0Icn\آA۳ _Չ8xQqO8NݕWc6b:$#)(I\d}kWȉ1賅 ϳW[r'Cyj-PUMէXNQzhgn@ZCxp L>.r{dbKX(&P&(;ءV1{"^j\sOp10GLUvcI&[xiU~0]tϷ^QB }s%m&?>ikn%Wk1 N1Gַl͛R]6)>=,K,km+/K[C31Ȓyֵd-z$ďcQ IX%H֤%O瓒)U)&X X¿-okZu""+8Ǐʁ*YU?i&mAy{&ACx4 Ӳ5ɷX0 m,mр>j.MGU Iz 懺u}O r]ЗרG/5rC<ҠKi㉴ڒIYzx{V)W<[z^2qrĎU c,:GBrնs,e%wX{E[ZRZ,*|f9LMelfŭu=^g ,LghK42#vLU RICӋY >vB?7nD\r.ʹ\vZ-<3FZ!%kLդ1Tw7ݳ>|,&Za,>I$NE6@d# &=Lʄ U&Gu(e-}r9 5&t9vɋV~/_&|L Bo.. 5%ɋfL875j x >I+daغt!h2E!_lHd 2^BŦX~'Io81ett<\&\a5W{2SL|fR6;K~~D>.i}Ȱ%#}dFgdLQ>QF;Ő(~LBxY1RV'|gZ G T ym[VC@ B`[ `~C0Yȥ~pa S=?ؿ`sE־t-z Ϸ. A;v=Nd}r"'F$iٴ"CZ1}/WjٖV;x3R$%r\m:amRI &;Qzz_MK)66W "ܒ8\*٨FW?﹖]Gy~yo^ ^MUPǸoaۻmYY8 ْj^ʒ'=2}oK5-]qlg[ض-'47.x_ [W[Vmo_\[[ClkR"_~Evw;;< ɠ6_Tobs\,;j&MKyA "MUSMQlU)A%|pǃ|DWgZ缅֯ڊ럦]ݱcE[|uֿ|_ޖ乖m6?`W=)Ed-8w3lyo~u/]i筷?Kt=,TvRz=*:.`{'wY>WKx[nͦRz4`;T_kZm8_^}sȷaϵس5 0Ja[+,/~ٛx#EVQ|r]e 9I}UxKkW x Dxt^=E4`sE.a([nuqBؑ A`ER ڪ*h[wܸPŽ{ma-Fŕ4MM ].D;jT_]?*2z6]iWֳjm8>)vΓ}GqkYĞ߶g^mD۸{ˏ۫~9OVZyEy56;Onzl\q/Kk|Xdڍx;rvoa]_yxt; W<;sUֲqtvJ09B~}&K\.&V,UH<;zlHKmA^ф9JbtX[p#cos6/J'-߉IKv۾'ocJz)\{݋^:}6[s,5Ǔ6.t?Eǫ%K 7ζoiGXEeJ??>j;)mvͻi?$҄C9%/]I/|-zˬ}^ }:^-%S61JzRv?';jx_䉚;W%'pAd[o~}Ɲ;wZXɯseȌ3{Б7o|dHSKF .wUZ 4XJ咆zժCD$Zۥm~>}~.?}#;?ƺ-\by/l+\l:ntb٢K.kl";ٖs}-B;)\ 32j'XFyKp'l Ycֆ{>=k /*ߩr[c]Zݦ+lrW]MBT S}= g;vWۏ?[}o˫٨p~HʋM؊sHLs[,֎Uݖi{_gSKnm7fk3Y2 ﷏|#fOL"UXejLD6FGz2e F=e}:$M?~[so|}SK.笵1xھOn﷥|-^βV^ol7ʍg\ge'Ǎ'd}mo7[ڮzM{ٚ ڽ7-Z^w^JHŊ|;!RlZїeN }  J ]AY-Ds6N!7OHghfp2Ŝ ? 8;]eCŲΟUMV f~-iꄥ^3+0Lx\Q߈}cyo3T{-JB84|~w{^o.[O~w~o-wi/5&]ݼ_/oy}ϿMvtVl>{o~cn_kVq-mcvޕWZ\:_I/zn2>ݯFm#KvU0th9IZ AD$G@щ'+|ll6.|D]Vr_٨jErwЖ\|MvXy! ՖV[|k[ȊM =KXٰH7۾+]7^Ji«gMmvL2?=8Ϛuu9һ$8;GC2NJW~z>Yߺ ^mh̞pحk7voڲ=QՖ uvH)0,SXuW~^z풾~LcJVU*yJgD3c e4;a [ ~X/@7˜9 3YZB<3}Nۄg;e<#/3vɤ?rhrXr'lR-D&m9+V:l2LtuX,E{>c,?,\gvP.-bC+Q?\`y5+̤3H5])4yыb{SԑI0Q az?‚`s}Q| KjH˳3<+ņL=b0Qa`^a"C&jd\늍U{ ́h 3I#E qGcyܨEDU#$6%-t5yj٬=jntJм̞ڹ\c۞f-笶vϰb׽vӞbO|[se7lc/K_q=ncm+dk$cɮz+ʋ}Ov[hOo}{mOhؕR7ؼ'?r]vĈ]7u?.~ZOWf{/n?_i׿ּhA勭i|{G>lOz˭my v<φ›o2[EFRVѼ.k~]~5vo~#6zbz{̆'%[}yv\ԏmu2Gmĸ%XؒvY,aSO1{{3QhA,32uA oVcD?d tE+[ELշ(F2?QځQ_n_tXbvl̪GF-9N{|wRMTn b2BS01Zbv'l\xgrlj`KME5\v_lצ5worL#f;Pe" ;b1տSlW_ q,=| >9=ys [2`ehf`y*\2; y.FrVqD>!vڜsN X )_c9PW?O8ۈ~/<]ӜtvHN5OTl{_-)3vstv+hv]9b-L-YB"rʹ t⸔a +%;xE9[)(.@rСvO0LTJ{s>뙷Ė .5yGt2#,<1@uH]ᦘud;=#Vَ.'zlD8qIr;~Ch?..*?=WyϿΞWde?n|l m?c;j+.k[VW/;_R{Gߖ<VoҩvV7ʗړo~ڂKH]إ/|-]`{t^=կ;"w]kQ)ů._O_wmxً{%/HGlkKg?î۹O/o?l^Mvjp26جP ,?z+;E&X\:qdig{[JsM4KnT9hUOXܵ~|묿~tַ`]Rlv}=a.uz9|7s5@qu,}LA?vSl|7}Q?Xn CL 3 TK?5cUőoF:jǸU1'=Ftz$c"vId56(ȏvPDGFih zXV]6벲r<\I;LJl<31Wg vϷxtI;:50OV6^.D"+pfK,ibw ]16(4PhOCy/] WgNo^b' 4WDԜa`:g;IÝ5\v q-H÷ٿ!Wgq1M_gGeEXV8C`?4勖AoG/*'Kѳvv'>Eػ>Gߚe26x}jh=a>*[v:}_GB6n,۸m׾ڡ¤=Yc. 7UmkcT@K_OɟZX_l6Yk_|vOoJ"n ׮ 4۴y}c]ǎO}hۢvԟm޴V^tm۽ێmj?նK[o_n-lڵj&Pjh҅kVk;Uf/{m[ho3B~-V;94b[쳋w|twJK07-ZkvHW#m-T _nяw|W_fyWmS7[I+LXuϱ}w^7زy Ͻwwۛ^Ffbsœmzl&WJpTe_zp-\`A{'Cq t[-+%gh'fKg*2a͝8KI'(N8/zWXd\'F?L`uSX8Ūܰ,iT7xL}?ks[nx[76V?.JM$ӾswgikiU+V趃{ %/WF.}SiМ+U^m+^{կd/VHxK퍿qڋ_j?6=[+_z-g;pw6rťnٚn OYURcU;S3RH]p%CdE*>#bǟO1KfLIe[V-_rw-n[ۼo~˭}RZk^>_8|[weVW_>n=ǖmO%n?箷3_o^+lѪՒ+%?}yW]n뮼ܒ3XCҋkjt|")`٢Ag}׻k]'۶҉GKܢYǼy{ûm''>0ك[wXUz[IrFN iwnK_}MC;-tvDX&«c-v_g:&坷Tcu[tܺ#-֫[,⟰aU޲.WNW?vt6۸sؽߺudZM:T݊UAcN`t$wqN cu_E~4ƑhJxAۍ(q Fe6 5M$aP.xFR=b%}/Nؘxu;ԯ"筠ҏZFK%ۗʋwwZͯk(*~^ewU*95{aj8fJCvtbe,6hd-i+d&e#3O-!;:]oP4F|'_c[ptbxes1:k4)"&[;i{v`_!+grY6 wg4L0C'Oy). g00 ?\|b g0 ˲ |}~Ğ3St˷GcM(ߣiJ 656a-߱3I۬)n#᭻7_7ӬWh#=jlǿnoÏٯ&[ܲNmRT?7>_tګ_> Q+N;}&v5 jǶDھ'kzۺGvc;vxNnIRk.lg.YeعˤptС;O:"bʅM͟x'>Guw_q/|S"q-j{eA=V,q+6Q-Κڬ}!;Y7kkR.o/x|߰,^bwpF"R)Փr$N2gb: i=4.OH4PSюNMplLT5e&hM[e/[%e1=vp^X"%6>Gn+Ѽ8u##V=~o~V$pa-% #ͪaf+Ie3v -s ~O_FLƕGa1O.l4oS]ӊQQ&h *.˧SMcC{vX?4*0۠b\in>}ʅ*߲`00iMC rc?rF?EΛry[ԡQlBs#d@[]#>VlWMeThώo/ڏ%[V˟$祊ͻcU9a/Z )q%S6ō+m6mR[)+I׉F*V5h%q3ުߏԭXBHT}-.\&_HwIUO9tNWrHrDz]z-H_=c.;BD*Ŋ}`e+c{d6mZ/~zm}bJt3}ox[EsU+1۱_xI\m]lr;}mٴՆ6[Wk_wn{ꓟfx;Tef;vۉG-2R4;1n+mlQ^mذ]vS?zg ?jMc_˖-_n՚띷'_Ӷ^k[nq:&c#{%ַv81iPנfCQ)OZBzGXc=8^^oz$[d{ƘơLO IӌM17{ozo]IDݝ9s' 'y |7bEa⬣OE:9DrwIJԐه,dWC2릟KGo4֯fD[\vY~HTtvm';]6ƞ) Ii_v MLrdG_J筑3b†[̂ZP+( W.Y#ygKr)U!D;lFzMW a|x =|8̾F}66[Q`-Ϙ*ֻzP ŏʼILm4q=3 W &:HI;p=6)fMiV3NRATFotlq ]0qD5M֩$A"Z8՚YU͵ml&ۀPNj, -e(Jy+bE6Am"\#KPΙ}*;As9v @@[zY.ctdZelq#Π1GVoXৣ%P Obdt']v KolJ Fފo~ G?"x|-`/#0x$8As+ r|hgMx|3ѿnAC#b!}n6b&G 1|C&U 9hhcvkmB`'OCO>{r?{1oښ̮=@/_Bφ_t!v܊!xvj) c4f~lٰS} cUp:CalUW%:[7+/ccU1h%,wۿ[67j&Q͡qr!G1;x;oɿ[}߁?CH ?q}Q<{sFFt?Kĭ7?ϣTՁPOďbUSQI #CS6DdK9$A9!_bͰ!L묰xk"J2H?EZ(-kۍlԓ }k{~ tldN?v_Lritu}.&&4?/U:64}&ֵW3j4wMόtX^ ";zB绣>\tA㛾|M??ԁMK=G﷮]O?I^4/N/n!oO>;#7ZF>"&q#Ei/IEhʈ7@@OҴW%OjҮt7~KT! !M" !H'?M1L| (7cnxl1s8yY<̳cI|-ТMfk4Bbx?qU7|ወ +XHo9gϚc< Ab /- Ic4 kgViG1ۇRN RYr0*ɔ)Wv$dna//bwe4EI<rC#hok;6XgȋI_{o?!';v1K>RLlnsO== ~~Je#KNd(gC,Ĥ gSv׳=ЙV f"Xz^*i:).RQ)l<ʑYDȶvlTAo-;x,;ĄڅL /pM7]?!/p?=xc=|vũ] sfyB>tq|3y 3ĩ?vnG8+Oz ?jڨ> 4Odv]r±8=_>@憛o;op||Q88A'hǩs4xӓOU4@@okHi2224Ocuw9.|*ߢ^ X#An> 1@C; xć mhQA9X %* x~FA8x'n@˄6s]4 9܎_<^|N?\) CK&΢nQx9] ~p>E=־2/#N9 gp<[S:+/&tW7123@FZj$ e߬u=h˰-2mzʯMĺ-;XsIӗ~ !j|7 c/0¬h:a*3*M(eC8b$wS<=&v].3yvQBYWnxBJ$p.(}x9&(/[-=_k\dPDvؠ!Kߤ]JvL03x+HNa;k(rh46M?vvIr$kSh覱}v.`f&MQZm%MR`Bomx`KD}*&ݫ'D<yڠZ2.<_qe[WQ| M~?\ wbr#`AT@F3o܄6,;р\z42ChhMK] І^}A!h׿9oȓ/ɮz˕&eM̊l.BEkѕՆ>R}pX/ o i @]Ú^<\* [,3X 'L&#I.y6hv'>׮}M?ٗ]v=I={"1D-.;ҏRbO/&y$; qh:?wu1B)ycʘ'Ѥ4qR?s. ^ٸ+NbVŠI0 ~s}*>|q'S'!b| iUE?4ptӦaڵSV)\hEyK7ǝ:fNč_;4kE\sƹhmigV$vbH ,JJ:oz7\)w>S_-gVmS's>+Q&ΡqHGU:>c9,u$^єNmm0KY͝ ̙M?̅^2.*~0 ~o⶯=^}fY6S>= ׯ#l)]Kcp 㩕/Xq=̧Ox?5w0m<wU?S?%^]fIMSbk-1td! ufj;L>26Q?TկQ#kPPT]}Fvsپ};9Y+XaxdHnд b hA9g)!*vtM^$r C6#ӵҁ ;;iJs2bMeTD)͎0%鳝  D@)eRooކmކۋASkC[o@ƍ U{]8c1uB'('ٱ^x 4Sf|;Nx<,cGzO#ރ-͌ySmX $vlq-!6ۃ T2)LƱB#lBb t Μm[6g+>M[p،Xxԑ"ø뷷!GXO?R6 tΛϗ;c;po{yp3 [V+_xLKu$\*s6ScݍfubtFoTM4Z8=&'QMT`L&XܹUT T75@46 n1/?4Ξ9S'?މOa2zX&6%|F̛c{cyV ˘[yM~f591i4**v_'tk>픏0ҟCx!t!A[puk70*1c"2U7)H rAyl%?^}Ezؙw$@REbk/&tHUOٯ67`󹗱mzTYxĺY1Q#N: ;{v` 8ݘ:}+T(ue9H7;"ʏݸ q S ;&6ʕLj5yl]a_S#Cc~V[d4u ,xP-4wvO]qwȤ5-oK# @NV3g0R 2W [ jFb5(#Uֺj/o?O36m9e VY/Pvէ|{,b >Vz@~Vz a+;z鐔1e5pliV}Y2q)DmvUo2]_E8_9WrT&^nZN-;<(|8 +(' TϜm;##-3yZTr fϝVmqb B:5ހvud|^tpY/?͜ցJD@S0@eY퟇f-m(<{?ͺ|bd&l]Z-6O:hyك?/IP,#_%E+1TUD Ol6ӭ!?m؄̶^>pkQvAޱq=}4< tF"t,ǪgA*K[ڷ~ ҦÏMƲ3Xdֿ27n,EG qҟ#V<4's4̞0ѭ?)|l0Z3!;XLDPX^Zx ^񧝎Î9E?ftt"=kct6ttu`h5{}7i*^}itRn_v;ڱm:_GF#J_qsy&^}3.ČS0{<0;k`m1zβSX܍X -U7֮zCۥm̟m˭vK [|a1uCb.=mǎBev"# ѦE`>lfY " cj_aT;H/ ,m~W:5:֧N6nڦ)SA4Kf3ZF`X#?g;v8}i\*C4Zy2 q4TTrF _r(|oH@g63G!-G[Jg1R5cSaj3QBgzV>u1o;-bffx&Rco7%3J`PLk]݈veg -gy&OAʚz`_eb~2HL ªʣg|C~ΉsgzG3;{+ffUfK:TOW3 'lW=_S̼wMU.}"`dPDND]Юi!גּDC='~r ij_y2Ykal˖W?Г$=-;lY#(v# Ótg_x>[H SOB/{:@7_rvnߎWbἫ뮹;žM]XI+Ҏ캛 [SYw$(XWn/woc}A*Բ}MO 嫲S *T=DY z1P* K#{ማ]{)Bf`H`ȶʤ83̠t B`@ ҏuYNɰɎ"A{ga:4Cp}2X[=lۈ:-w? ?τm8KCZ4˂+ wInu,3;]Cgc~PǶF}Uo>HX^xtJ"]^eRVςg>^p󭷢D[z9fKk#DEx-3#<'p%/F?۷H#>i >K:~; u!Gg\{_.76; YB^% ^\3(Ä&wOG1 Fv"mm 6psZ I3kf"kq?ӳpc_u_`աa#!sMX9o£N%GuL؍n$B ׼WVaC#HPM^LO~X]x75ngx׿^5Ĝ>$*)$q8?/>قdЇA!h3Pզ>s'(z)z=_4^ /:i1t2ec`g̉^ kݯ|뵡yY86#CO7(ֈb{(9"BIq!*( H IiIdcLpY5ra+J<2T2rdxg(@ea}'a_EitX P+LXJw}#&X/'SOn 9֪*_Ք)G~ka \MY+;vX8)<TvEcS׈b_q=J̷b= [tU|)58\̛gKy[)s^u}ξ^eW>.W8@>XM^oJ $42LY,>"\ q.(kPS~gYr4W@c5A2"KRLO}eM'UK+/ <婠+G:pwy!<b>E9vl#_S۲MQl ̣9@S8J*gSRֲHaz gH 㽩Bu] 0Pw+jN@f]eskjNJ`_\kdcLCV9&)ʯɎ $sңj|o0o+3S~xQ $I6Z-V_c?[[ $[Vֱ|e_+壠WAv^ֹU*/źF"J"#C>=XӒQ4 ԫD^_>G!b?)cŮmFM;DmE 9}ڭ*4q[(J0Es#ΏESw67㹅8FLc!ڸqF>W$ʼnljqm3ݢ0y/ ҞHbqqxuA͆aY_N\Bh<4Tr$r6R̬% 8 U7 Ny}qqbhyH:o%O[E(1R L+uA%)DKYnyud4В}F1>Eeϒ͐fy1/=OS- #Z.AN|2Lƈo`׽ JlWxe/aķw ^J>i,OZ,B( 3Beg/ΘoŅ &џȚ4E1T̢{4lyyTy]?`҉~|'7ybYbC9yL 7И2g}WaEHmG:5Ven*'}v0q,L:dxpKxdrhǺF/C?x?K/w WۉQ zwRn:+S{]gp 6܂XN"g!Z9ORLIg"2;'剜 ;Jƾ$hwzb3ҦB/R0} C'r:E~c{G2;w1v_G94$G"V~U^Hƛ#eђOEXRހ 3o e4bAa_!oe8!H2|d{Ia݇M yf{j0J"8nnَϣ*S3_0͈xu3ŰM&Mc3"~<̳N$$k`E|wҎ$RQ$K#Hv}<.ѮyRq(G/$Q*FƍK8?r-.R>z&nU~iD&X N-Ɖ]Ċ^y},<$ȯqDe4:n,H%Rqw\f\tnכBp|i+3m/q%FǕB\S)fH]׍Wo)8T|{TYRlɸ^fdCJedy䊚mD_åXj0l\/r^T94jvۗz`؎R@/S _Bom io&7Yp"Gݠ'?wiLhBp|%(s-֭[/??SO;g'mHmA,({h:]~ڽhm@cqdNX5Gp٧S_k\Ivq;Qx0PS+" tI6l}W&;ST'MMьס!s&hŒW-LЍKWWD_̜CmAJKB{E*]8ZuRM;JA+ȎPC+pPCUINzApA*sLC[`kB~c'>w}?k|Jt5k "hN 6T._kTDO5Suok+v!@.FNox`xi1;YF^Hb##j|%~mqXUlVF.UST"udrD0 HUhKT9%\7&PrR*VVlq}02t"%pRDN>;sRq1g7oۊjwiý9\%:lZZ~k_C_@q+؎U56(fײ{a3{Ho."K-d>f,aD}\nzd-ٿ+}Wߪ3 &:|M01_촱A&Ӌ#VPަ.=B o-= @\B Z_SG94vT"@_ϸR!&Xca浨͸ԎZ:]k$<|N8  Pnڼ"#'A 1k{e;}&}ϱq@dc_0A>3sbu<|A#=F.Śo`ܘFAa'N7$slJU_9kBAb}}5j,|'ӗ(%RBY'V=3 ?AwAf]̗bqx+TzYӚ]A'q=ilG֯ovJ}=H+eFvgmiOjii4*őxdm*;0eb#yotH!C'v }{/s~tO\EҧO#b0m ղlp=!}X+ge8TH8yԄr>?׾U|Kí?!z~t42-rGpWa(1  603q?(_ ]FJ.>}gf&̈́f"nlL}i$HZFAJg Jִ=I3dtXA,B7F ̍"L*1FjXYfeH͒(N'ِ{ )ئ j鵄Yӑ@'Yu_d=_ekH%ǥM%c_cQQ *t]=6TjzrwQUdgfdXBrIci01MJ><-AW@qp4>'r:|{&}r]w<!ɋX U/"΀ȕq@ %i` ݫU>ok)+H/-YѺzîAD2ܰE$ r%/cFvd;t-כM] PA<1ֱk?~;u$/Fyn)bSϑ̚"~#vu\[il?>lOHK؃C*b[46'i 7m+l;iu{=Skb4FJmW"H]#HnhyzNF̢髨rI7Fx\ѿDΜ>O綔-@<.d+G*rOyQ/쪯#NKȐ m2"M^0q1sv=˖5<Ѓ!g.+}\~6z~S.cޙw~kwƶGºիpi'cغe3e;<+h<~ipMheC_[`JGw$3 F(呫pp=OϳKtѦ844C GWia?RyD-s6)#mmOgPKoujHimm5i)xtҰfݺufFG$ONE4v-k-Y>J`$#mOeF"~bJ/S* Ҍ Xi2U*^*C%{K(Cj ϓ.=!f^I!8AƤH9g㤝^w#(24,I>6Β+N2_4eJP2F)):cѳSWZS,c׎K0N(?ŬOI浤P%p_]zdŠO]d]t ,Ղ߇΃a 7S}8eڃl|EvOq@a)Xf52ɔ91L8C 1~WWfJ9]bFYƎc$X!Ut,kXm:B}!0JHTX4O{MBă1؇~d1fyˍIqv7g$Kq\{PQlC$Li(1?;,0*ސ##Y{٤Ex4B}%fVg)ilc2&g)C]ueE])?6b+C jc;~Hv8CH՞=6N ?7RN'{fȍj7+7ca7xͧƤew <xϿeS)Ks:ԃBAK0ll-}`l4(^ٻ>ZP_YBLz‹o]d;][@)%Pln0bXW0r%\י5;5橄" himG|LokD_i p_o\ݨb#'7t8r6mY//>Wb.s; 3\( `BCaD:1+PO>٭;i:4p*i0V=|Z75;`JG'{<9pU6\?yJ{) $f*RPb`rZ.4(Mc) 2w}IBºF3`suO$)rhL4F]#7gv:QT~%*f.ZUfuiO 7F ; 5 34k)$VJlfC_kPɬwX&bb|ɐ9 $ ȱ1K;nxxNsTϱqatŬ y\f&c,c냞 :%joڠKSYt Ӛ h!f#ǛYY k!jDdшgREk h #QLaxv@i3i 6+ gWIZվG:HGB}R*/)(o&5:)6_ MhǪ#އ7@ߎT9۶l1+͢SA}lZAT_JRћp+Hnc7ĺl_3;};Ys/3Qb~餁d{hקA3(t gIAuӮOsi5h#9OI 2]*.ʔLk>BGc5 \y)"H A'eRCgQ`˒m&+RYWblP<[Jջ񛿟ǵXAeߠln>lIڻi'E*&}^*S>$cQ,z%m"a+3 ëOaK%#>D&⫯ĚW_@<[/r!2K9Y嵂I7\te]A W3y2㡳,''*(P"/NQQh'ۊ&:K OvR_{o _W} c˅xSl~\3*K ZaOaov#MN|xֹnկ-.3j XGA|u]3uy8o̮ _s>6Z/7(E#󣴫Ɔ_+_@1Ϭ.Hxp/ZGB6G/]\ٻ>D$DH_-b^m등d\r=܀ؔ襾_fG׮O~kSSn_0QO-㠍 g*GjE>&= {D!6^Zyxb-<#[cǏmhjG`zI'!˘`$RlI]"Jf@E#OM7Oďa7:6ǛҚU,[+W RFMh)KlS蘓qቑ>d"A!e1Ŕxu7fww}@ߊx AaPlقl:c]Im[Xhm~fWi!OyLfjpW3%`=(d3J9h1+TmJ$).?#8XxGk>K 6w^xgy&ʪm5Hcvaz:JV Teceg*ʫz[kjpן܃t5P3JШ2u駟kEPq@xaHE7PJp·:PS-X5!+=GJXG5x}߱Uf]4]3 iKuj뿽c+Xy35U|@ͷ݊m&Om!sYýhW:鐴9*w7Aw2S kd%0桕ty|^%:L"P.KԚEw 9a+O~tQ#Yt&bhI ^>T`zxhr1UNLeҟE *J2]txcdm0NR=06>sKf=カ4mFr~߶u2sg̽ç=[׎vZ/݊wX|V ͵B4H׏v?ⷿ<1 5loсc pr.1Kgyq4嘽jjV=w[ NW4kϫ*:s,yķIoz H]3/?W̞m=uj-CQ}~̞=zyJ fFCFksiT8Trdd'9KȦ0z3ha#<@QFX䩓񾫯C32##(tUJS-1wR(3nqX0l0+O8 I +ZuY!OC*ʦDbl}RnݠcMړjT_M0gkkr 33F@ 9\ש ZM(gA6^.EEU=_۞y1\!oa9'GA[e}M0`XIp#DA0dE|u2Z" CuHNUM*XM2ftboQ$\VFQ_Z7Eש zx"Y;ML[o^ɇbH/]&O2d]4PS"߷8c`xё &@2[ 6 9a cSvզO+U`jL<1A}햑94{׌3pQ(5%o~<^!드NXzg'Ƽ-=Aʬǔ-n F -]F!3mUjK >iZsoʡq0=WYoҒQ+`,K ~* BrJ"Zj>3PzDž..=;̀\y sYzcӦM;@izw7 Wid)sZ8Tf^\o(x+cO[j .cۖ~c17.^=3J'ƆA`nP/&Ghh"e uW`QFW؍, =~&k.O5fF.xaūhv np&Ăg>^A ugJܴ5ٿ GW:J2/ivkX3LϧwΊ APnV 96bC;?0%D4/ l lߦXcse =t ,3lCAAJ6VAWl: Bvϱ]'\s 3^ʞo(>[}@:ǶқcM(f̳|UϳcKߴYza<=Ce~U&f-Ɂe7RGu|ֽ $滮m>yYB5X&Kf#?%&2$46 :E-b9qҵ' j?s=׼4ysqmFK^ۺRh+e/y䐬&W#x?ժ@zɯF!7w6eQVHevͨYߘ(*sgؼ]<_7;7iib^uVWOu/F4F 7}ʹ, 4zEf,I #2c7 Á0$ig6RJ8ENAeVӐb>O=~I}5\ɡ7ubĉHU25syҧ Ek׮5C>tU,+]$!rZ4'^i OӛO<'YC ]XW=kWP84]i0-XxGbP}qxnӨj% л41:@  $֛g 揰?'^ځʠF;\оQlײV.>o~n =@l^PHw'd8ڑP :uK%YW-Jԧ~ڥ<q5?HBF"ƅ0/?6--)gOx^eJa|.܏vםܭِ@]vA־%u`b^XxFI~vh{'1zGѶx>~Dc  XW泥܅%CZ#Q/SuI {exL|{~}}̳)Gm"/pB:Y:J~3:Q_y_ce?C5,W9l((|$/7P-XoOYv*Mz56fO~k إu0}ޭ )5Z5PY5ZF5@͠;dfE 5}l EjΪ5hʡ!S@kfVJH"iO:^R?< `v̏B|MOiClAhbas<]ƴܫ)~f*XvbF؃hfPk%.W%^Wp<tR^H]Hcv8=cJ$&,p#p63XfLu᪱$'_M#Ž.v{o Nla&Aǵw`n/lΤk 멷 &k7 ғҳg=-Qߎ <@=]kd_2j7 7JwPh@J%nF0f7# qʴL.KfH2$ jlpfzc_3xO7m2&%:ؾ]<fwSp$ffzrxTqBfOAB:Fds^:y:Ek#c?7m]Ud Ig7J{{瓈4${zh_h' X"xƭeMWMqMlf&.,lOG" blF'RVhI! &&)"Hd>|]<4->E6ڏXr(0H7EmblcN+stCa&J)]v8ˈى`!:Xbvĉ9u:U0.)PJee[h b1G Mlzj\WqE'{ 1xR"t64N 9'b00s`YQS7po7=Ib7!|ŲÆxfrQw"L -6YYM~Fޚ5$,@Sg$S5g6IUd^S&l*]g ^+ؾ΁L 㥋X<͑3jXGllOrRMZj$ƌK0*]3m,УL+}Yn-Pj3̖63k'Rsr2mr,@M*5jp_]i%Hsm%ZDDߋE*eYʂ^r<50c6Pf UvݭYHAR_K$Ym\miMV5Xv׹`&:؛ A=-.\GCTכϝ45ӤinNH"]0v^*H"Pj*ކ9'P >jG?tWDӋp7ȼϞH>V"jż?(P-Q!& TdJy3e:R 1{))81y"!TF\âP v5ڱ rh3š6.ëY}8smGi5CedB㱋y([ڽlW?M3H~I%M+ 5VHO 4{ !7ZC;%oBpXյ!fIysȶ`,RveG5/6-^EnDI돃>-+td/l)Z_7rKKNMq/A GY C O~y$3;^汋rdHߙQ<VrͣH6c Җz,/uE{h6 ;AfI-_3O'(OAJʑ~8mN.0n*r-}&. M ~{/mv5%֢}nt<탉 YX&Zܽ8G,4hEaƺjƑCH#{-1&c3X{um[vVۆk\5{hl;?Ax$fD *y e|+-vqiV:c ԈX+s0:O9Mѹ,gYD E/SbfgOG0_b>ބăj1+"$R%mNKe&-By*S{zi B&̕K %M\1?^#LuJ/=1WZF& Wd>"ڂ[rB9kzޥF3GSŅfrY/XpI1]_6 }@vXML1:D,t7-Ɏ^A2hp詧҈g3ĺķrIvwk2*6,x-YZ> a3mU*?^̖Oo1lQ?,Y)`8fΤT]R3xrc/R %vddDT\Ws (e;8:;Yf}!ݫO44! ,_/Ldq}H|X=ImĶslOX.˔i>qw7Cud&my7 @ѻ,HrtFlO`byʤbgNfh0E 0. E#5 pY6gif mG_3{3#WXIs30BǦ:kjFGsW#tdԣU>avl ~c^Fւ}<6@ ]M{J;Ѓ]W$7ʾ$u'(b  %F͠'H&cmN0`i qj{/C6< 鍂tL?؟sεb2ug,ꓽ##^g:+#լD:e>`OE hKدY#_)f uzQ VJBcQ7CmL]mi6vAP\u嫑 XSwS̹#tStW)b4gZJsRUV_s-P8&-|@ʔ4ŝ2CQAkC FyH9T%&-S&`M=~ːQYM-h_9 H1k)0pm.j-2ExP l$am(\lo}66I/٘=B3_rsi6  <~Rf%RMJ48:4$\+MWʘ0BG+y'^7Ղ֫.CCS4b'[`Cl{ ׽ soFhr7eYC/oɰkX ߶*@U^d^~ȞG;֗%^)۸}"ؠm=a>_K~(]}v>i$3ƲcoV`"(S7TDA:wX 6m.4l*Ah4j~Ɓϼ BQ׼Qier.68ut.lj]^QO0{w;| k2FQJXJC|&NIZώ=zBCA3et/1wYa}iaB͍ZIa7ʆlj$-`hdCA:Mm_@m@j`C hʹ-[B|a:ļG7]~CGY6M'wxu4-Iښicef 45#CDx hCae PuD b.lj,pcwP&jd=< rs̯Ym@(7E:%A/_α@ÎyffQR9X0Llf2iG7\^ν¬mQe³T6K&#E ѩ51$aJFÔ ɳs95vkP3_%jҖNeϾPշd`Do+<3yg4! J"k]h螈 R_:iA87n=c){[T\8-mf̐aʍR9 W:]OvvrLhh`-E ].ۣ佟}mf7iH҄{teTйx^kd^v92>BA3xvtNhSܡYMnY tPmodݎ%̀g@5素JzLb:N>7y"̻wҧPZfoAe3>B|>u5U5zB]f0!%11zoh:MR7r*yBsGѫ90DR1jTfZ\X!fj `qkP_Yu!GVZn_IO;f5ʈ%st{Xf)ga0eŽ{8dY i6!)3iWe 6  ;9O8eK샼Nk8iNj>"fP4n/8nff&mba;3AP=ŏe;E76G8bc+| M3d.8a;&a(BU,HbN颻P`zr`UK 5E\/녧ZKOY؟ɏKneʯAPۮ{"\]:e.e!ұͿMT_VQɓH.^c6㡭4i{nmkV5Q&L Z Qrb0)BA7fT Hs|Υ+KNK9I{y\$Zqcgb(/ָJ3+֏\yя h!6 M3hl P'²6kʞd:Iej1|v9"/, 0tva0 uc$'”3Ҡ9vH )v+$|>f"PdXl@WҢtK|v 77"l%KӘns_?A!2VoKl2 R^M; P VlʡhF߈"Y果;i 8ir9{~$ &wHF~9 ({Հ<5X};ת_WM\X ̸L7qB'Ax2QFEU7Iٔ*.J).#7!g-+|l~qHG0:ZD ،N- rGpqѧy䛓U؉ INsfl29u/|M`m))"Zm4$Y* Ԉc<G87|\\;eJj4z#gcv'[d !ki^Mf5Sbm]]8qYg!Ѐt|*qW7򕠎Joi+O<]|K9cXv1pDkV XR^:VE mos@NmOקd˸d/ m/.uu"t쀓@첫ĥgWc!Ua0e$I#]tů!2>ffiļь'uq>Zr;}$&kD& o8~~/ٯǟBC+F~ 8\.y4%Q:^㸏܀>|= dqm\b`Թh@~$*5䦑I3$~S$+v՚)s$fWeBX6iRyc\v \)[f:3 Fo1ݤiYFh1Fk!уazf$d3J HQ0Z5T2jWS Wzo%X/oS5Fz3^h qc8խ.͎1M-LgO;g]8㳟eW ϣkY8d'ڑE+[o;(nE- AD&G:5фyqEͧ*>hW7 : m4Dw|ѧEGb(t =fJ:JBiké_3yU,9<>Au8s`sÉ_n `SupGq&ԍxח˿eN4c>\`PCO߈+>a{0sbOwl4d ؊U*->e3@AOawxHXe_273lm>&'X  t4J 2skH6Ek3*yL-^|( {ٝTy܉LGB^5D&?v=CU.^`M s%镲dJ" "f\}}O:T;$/V%Qkw']t{G>|]C>#\mPN4PF }@JxZх ~>Ic%GFi)H+Ļh>s09Z\?ϱ9iu@`$@/^8k6-F5BU R2]<}`mVt ldz] ߙƼ5z}uFN֕MЖ[.ޓ>{xpz}h)F e@Ӯ'7,"Eo[>MS&#~u`v(氏"ͳZ JL{ P7t[`OKnj)cgY3ѓO@2gg@aK1EvYdg"zH{i'z' snInΠSyy%= zpYg*犩n yŶ 0v5zEL9tfqLdҍe oMGRՌEYFϓFWW YhgҔDh5#df 3V݈x S^s>66ԋnW+5nNNk'%>J狠u4Yv/ݟ41Gp%#Ō>{ At^e){Oұf+ }"A)C%DKӢլt԰6?04vt\q!ำ瞇vm1-1fy4.Pv(xiO+:/x>i<4N g d&@M=;\_u_dL7rq e7~~qy1s'k |8`5w}<&矋 qukO/]~Z(c?4s.*_ )iW^w38q; ]|F89,LLL mn`BMZGeOmgKAN;~EXEJcZK} Dέ@{E*Hn/Ҷ\)]Tod5xhEW6^:Wߕnv=,Uн Й@H%qbÙO“ṳQ̥ w nM rZP,!ݎ[;Xay٣,]fւl^|h0F !Z'ncA uubom,?hYu(f5h2I_/ifMOonǮA۞jK(4V"6QZ70<2+Sc ڔk={G u/iFJA ar9G ,pR.AMZ)hOD/LS@EYxJY8Ky<\Q/n &i,kA>{}r9+Wv:Ùx )SC2Kfd;jG‡]‘2` Kmfh:HdsG%LY8( :;bv~+ &Ͽ2⳸_cp8᧟/> B#Q ڈ(lw9.*{7ɍMf Py J<:G90Z9YsJZG@Ju])'I 66b{A65<4e9!s ܊aA-X6ΧrhtI';܁@PS)NrM}5=IG%ONkc܆sf(6&VVڶ6T)wm-(ȗ=2Teu~,DH S9Wpon)bk#tDqU€?ԙ8kq>0s0CԆ'q%O5d@_O"E8"P͡C?+aawc/bg#c,䰝-n:e{ h*2MfvH^¼k^ɑxgb"ϔfl)rP&%o\k춰@&Q,h<lؿ&@z,XDs'()I~l'NЧ$SЀf:H˃;}߾]= &HzXxi8o| :ƛvuE.6N*F<#G]u .gq}G|Ԉn̢{ޗ{//rHI>BuI_A–~McUߘ?JKS&PN%.>L1nƠr|kzA%zĀI^#д^X;\exog 7}fdQg<'Em-}>zx畃6\QT耳7}%QҀ[Fyzj>[٢CXWw8}>uRiֵCTJ~6}^XYFc@}+'SJ"r!@mS'Œk.O_[cێ^ك9t<lLl96,(3j< 4~l3Wr ׋/9s&1SY}ʤfc#tLfNA¹H''ŷcׄfD?}=bHy^7k.D㴉%#TL#K֎\; ]/RŶR`TĆkjxUki0߆h˵Pxϗϡ-0uL"lY֭AؒM`{%^c6yEwg\Kg^'>~ μʺdz1[.(q;O1,ǖ@ܬ.kCu%d5Dj۪lc۶WA|} }9 &޽`6[lJD6O_\&i&vVZW\W*#-sC|Nc!W[Ȅ|@GNXf]Hߪy+?܀ C-COcӖ?~@gmGSX~RjADze+`R+4~!-U͘`JM/OT?M2'ŖR,b ҙQ^ȾL2ڐgl!adb"%ǖmeL P7l';q1KP'.@f N v%޻".yz7q҅o4opɘsqwѸC2US-˖`aKq}%K%"$&Θސ&k͖m/~mfJ$g2,j2-@&`cfE54@_?{ۻ?|FYN?T~+uxWh=~E 2[)tL(sɡ3J[.:HlnTN+:=zxd&V,,X4)&Yym`61 ݺoMfwQ<.wZy1uB v, ZeyQ  QGa#FگJt7΢v>>a*^qϟpiwp]"~81a,3ǿ ]KO? [# ?pL:h>C EqIE 1:=3e~̸n:@[3: * y BSy7.E"ud)ozcymσۉD.X JrOi_[ j,cS}xkB9,`b&qR9N[;Ue Sv%ۃfSϽrOK;]xvJvʩ8]OW}6T{ǻ(1֬۾q [DZ]p6uʼnW] i,< l!c ?1TdML2gҮkG)H h&!~؄)W|)PJ,a)}7.pֻ ^.:A"qi_jf>;;p%#> f֍j%N˚ j? &̜hc3ϳ]nDyELcZ8)3NgGچiēO?t?mǎ?UX*sڧL6_|-wþ"ɞbɟf)H~vu֛1T3,g>J,[ [#;-Rہ}l|ы&UtV dR"&[c\kt`b+* k32$^Xb6cMoTg&Vw͹ 2Y~f.>ضgp<ΡN;O5gEf2gt`'=E8ahF\bB^{FYUi,_fGͯIib? Oþ'? wAg=46ԧc,oj{-& ^~eaBL<|٤]si0F:qâ#@9IyE:)?ppqXp83O~>.ưDajZ5ea5bǖ|IwD}aa:޳F*am(m ;EawwGgg Tk7c-h#-aX0VlCp5㊏}N͠h!&} Ho}qQ'??U/E<‚0S‘cU]O<_4CWBٯIkӛv"1g~yMfI<7iДO6 ]{fvP~ >C+6 KNxxW\*k +%H:,EC|NN4>TSvxVc1v",'QZw֓Kc9~5Eov$eG?/\,q{ދ Ͽhŝ;p/+/<_|x!عa#:PN(h] o{,kC"HBn<أJbamՅsg!>gy۝H S#UJ7F BTC[z-s(P}|R=?z16>cdG6o>t`|kt&F,=jFKC#G7a-]ssdoͿók^>vLgC+V{5fҹ3l߆o y~lݾUXR ]wC 9|1hڅ)jɝp5̧ kc{r}rCt<ʼnQTJe kJz%,' ּ>FA\D]7._Pk1M@93#х++hG784~CdGԧef$DϲԡvcsrfK/)W϶9rá,DYh8W0(!a#O8^yy$i_qD:OGQG!t㚿$eO?=(; 2m2o_(l rhͩSW%Uv,afdh{/*̚0,=g<ک˖`ؒHmqꉘzaX7DYeJ>3yyq~<"pu'mF Nn< Rq? \7fP#4~7^?k U;[y;WA{$!>%2}E|♈-qѹsQ~7݂֟!=t+'oުWg*"yb~zZ{*@3ټfH HJV[0؎%r:E%""h>0ӱ4]ҧPy;ZK1V*'ikxn!:.qyC屝n>`r, 0.ZO ?}O/;+VB93hK=d Ş>D58L!> ,0DhqS_PK[y A|+:V}'hwP0d6tO6n@7v ha}Շ9 &ұ}ؠTM5mbtz(^UՔ3yåN؂ *S-ū%MEʹ+KVx.=>Q40K#LeE&Ⱥo74w"G}> |ڙ7 amعf-wZ WϝgfS&x024_\G[k:ZMw "@Wq뭷c4\bӶ^<ڇd'~+Z2eK+{W]㛱Q&?ᓟk}Dqȥ3_,9 ;waҷZjMh6-qCǫ+^%y(di)]z}w^̗B4CwG zO]jùf#߀><#%q맟gM{65PFArc Xɳ3`ċ>X~h ,ȺKAtҁ:em2\Bĉ)*ԦPmfh|y*R0}dBAZ~otWJH k'|)BhfM#h^tB<na2Ph{񞈵;6a ;J\+@}{23ԺZib_N E K<0 O&wGt f'-HgtrRb k -ٳ 8M8裐j9vѸz] -g*JYrXj[_@`s= Vse#Kt <(uM6GZƔ ݘ0i*߿ǟ}'ps,y/~~+zznfLp\]A7i ()kzy%y}"C;oR^l? ,<Ĭ6I(UmlϾ|? 45B>?$C lX@;|_񓶭$ -;zQdeD9~8!O? ǟkz?btE =(SN3|E3/aG^щnZ;UIo: *ٴY[Y em?yW H,}-68V.,U,)eٽo<6SZG}@= F)c!9[djc^q| ؿ n[y.RPilL`߯`a^"Y$jJZo!,6/$;+ Ie'}s=vFn@|4X&\'_G~ũ/pz}W^/HQe&4CC8nm՟Ł~),>iÞTϿS;iso[W(2 Zv-:hgk۶k ˜1[(Mh(1y֭F4~dXP6Rt@J":2f#:,hFBwz4zdfwH%iփUlw\%zdoJF no+~sӏC/pws(U Wыhɇx;?-2H4xp S  cN^(5gW6`-#g+Uʈ1c:K.>5k&cŪU5>.y8 qXSG0v!܂m!MC?wkYR϶@[;0𖝘muOlۉqǑ-Žދ/| G-Zg#ljHi\*>,$Pio+A)W(A{$lf#ذmYd1t"zY6:wgp)'[:p5Wg?ǪWW|,{N$Ś-ǘ-i*cmTdb_H $1YC0"XdmHYXZ}Cdɡw_x.gP:?chUk[/AW<dd9<(4Z$~-_?)7f[jʦ:J)"{t{ rD4{F6BY}}}"8S: N76662gD1Ģ3 WC%^"@wq^߄J-h_09>36I<)cNS; GPޱ`o|gqۧ>MMـx{3ƂpwƑPV;qs8h :Ă3O"X^̈Yc XP/q=0oD|`T=mRuqR18&wv:]Nt ڮ87H@ b5v1F?>qÇ1ivMTښP̤p1G!`>mGP(#pK)C#Cظ} ;}K7?pcbWi-&MDsk# ,gssAn9m,m\jx'u<6nd~t+%si4FI[n=G uiun/gG_3 Y^ή> i巾~G Gĉ魬?hAU~㩏]'Li^:spʥ~lfA*xvW!t9l?yAooދ_wͧ--֋VغblZcAlsԩS/@319؊._#m܁a߹G-\N,,RsO=\KwwΝۑm܉=ݸ丳py2"u_h(]MœHĔ B;sKl-`W;,ŘP]3fumK>}TqytQE(tu_^ݾ!<ixzJğbƱ9?l׎(qSޒj6lx!Vlŷ~=CM P,de}3Uv)硿Uv睍?W^fXH\ptfoۂZucִҋ󓟰\8өʈo?zvvmimXK Tu+/+yfMmvN7.nW|s v&x~3 2)$gQ,xU{i 8^u=eHb|=ǒ#ˏ> ,=d1>~{k/fk"W\/|0 At;UI0-n? M 8cP^΁Qذ8 fq4/|W|8UX{opߋO~+k Jx'H[] Q)<.Vo6y?@C}ځIVu+Mc}TjXyN'ZZ`A6N/wopafΪ_y1#KVQΑBA}* Fm>/M?Ε ztC~x9 /O*-}_QizI+ܫk zȫkZ_l4Ch g@ Q7m.:i7rE_nڻ󈧶dnTT>_ 0.uv/8Ϧhx,SeBx9Yc_5Vg#FH܁l?.ټ +zӈ 'УbC{|yKڈmۨh |!]^i 5y1Ťv| .53a?"R2ѝ=LE;ݦ8lL:w{Y{.<];r+oia롡~`cڤXGZ'uq,gę}Đ*08ĥ\NNǿ}_ŲKެߪ(yT¤dW3Xk,.\ӡ6)IϾ]OěRmVpjΪ]mgaZ{Zd Nծ nfL^hVO$/>n ?+?M^/1d)pT/A Y6?o[o-غy@ }-omD5~깍+WRw̄륇bk ZDcghB2fH<==W7DP] &ϝoBܡU_}J _2fm˭uFrq'LfT;Yc63R(teI:[YB.{LSSΜMkW#O%t5WΜ@v0hkVȺ}ɇŔ6KgRhm%h>c:zA1bC `r$×.Bx3+š'E¬Y}ܑ|Z O?L#?!s \8h= "Nmgyd4bHxF#;<_`pt',9>42M `Ƅv̝=ٳGos/ۚQM$QϠJ1邏۾&Ϙ|oKu)#Q;wbðqGK/2ӟ v3OʗYXP<;/dl =_>pyg!:g鏰~*4NŧeG,Eӂ&3N8'oϞz',)9P!/EI KݒغjWd( Yye$l/ hY,b˨XZ:^&͟eE x T33#*;;,c Q`'gBBₗl݁^:{18܏Rurk*egYLTY-OZ"a.ΓBnf.Ih{j>㨲#is$Krs8Hⲻ. d0l(gGS=-F6fTS+ܺ[imAIW%,]8}G#ղ1\]A_O?"\}s$>29Rl -h32mHi}9ww;}Ojk/^فMP=ԇg^}Hj~}'7u߼ /l@K`ξDL{'H`7z>#Xx6uy_܈C"u}y(<̾я}Ͼzc' #Q3C@NU49MbɗB~d:5 /+AުæQ>1mۚB,Į[H2 Y-:O {? N|duˌwvf˔y=݇b .8_W Gd6ГAرxuG dU(z1~Mhv"TyPsT` E7*咙{0}l~91!bD:PK^5X{)%Vuׯ̆| Lji91~"@{ MFYށ=;Iǣ~8lxax#lJq:4#=g{bZb]Ih{SCXpU3o7R{IWpb'wtۋ@FG9@ek͘{ ,=q%VηFE,X]Xv 8Kh۰ǟs.6lIB= s N;3VIOǜV.G&M1kxz׵876y ؿ/|*E&3KwO!D^s$cۥͤɹAJ^7i2DQBɨxefI;qxCZ a<'I漖g%y-1 U` رk7. jA8*3m/x@>G@Z-SbͦNc6;/Ìoyhg'mT?x;rvSo ^/VFUƨ[KF\t4; #oM}doͲ봫0̈K)bؽm+⃽ 0݋l})lz%I`~=F-G/9G>ߍ`O4Τ%INZ"k͆IE.#9p-/݃\_?2T>mx `Pz%Kظ, |{\uvdq*hC,@vɖ:VmA o g> Af6Pu| uMRjYRH \H>,⼷wݳf\灃|6ѿ#[}2f}/ay3OcPZCZ#hl_ jѬ,0j G?fR$%ʘQ9Aulj<6b٨iWdIh7ȴgr#SDwxSxS4jO& 9vawHx&hJ a 7YDa2LK%D-ů  ]f?IsgT 5'&Bl!ѾujJ%f嗵X-#FԌ}fJ:!f8jf9[4HǚK?x:p7S;C MwJI*l}RI&(PHA@t̵ reZSbM UR<T:%;{n*hپ$tZ]3|TV]~4﵆.Qg IEp\32Tf21x9[ dg A2iMF4;kt Ьz}vkW>ijI*jm.dDz45CEmC MjˬTR!IhdQԤ( ȱ?bD?HfC_}+Gs1PO^f){#c) {ϼvt{ed׫~D r5 pT0r$vOG=hݹl)v!E|!X;Y~gi% e~E#A&s~PC&C-jDz_Zz'+Bqe1PSYXē@$[5;֑-PP1 &8%T$}?efi8|)7V< eN;b"3/L7;vH9z~oMɚÃqo";fMt`#ޤB@ީCRi;d?@Y0H,VxP{z<2=V El׆}DuC؊jXը{%d[[Εb"%ޜ?u.d{ưg˨ؼe% ع~v{2}ٺa/`/E4C˷sfrixY2TkWWgX_/?Wv܎o IҽupF5XAܙ$Əו{I?|~pNOT̵}m(6nDs^lpPkÞ;lG{7ZYWcjkS8u3 ;zwO!Oafy>XfzAF3` dHcNoBM/8O!l }lC-mX#Mé~,.0H`]f/H *YR1 |r%~* . yagk ˋbYu*~+9ߒoUᢜV-ǡԈ!1! )?rJl3\վRi{ l#:f?5w5R,Q]\ϰh9[X@rQZ-}G ȗ}ZP8 &KyL5ј0LIg^>F?{F)gȾ"Ìf)fw}fbfhmO`DS$4vXcƶӦf3A*iC75V@BTuR;Sk Lov!W^ L`MP}6CVZFؕꆰoY )VI:VeުLb"̏eB̟Bx$av2NqQ *r4ڽ|Z&g(455Sl[iU>diqfTn]{dV ?WA# E2Μ]#<:R*JmvHoA։i 4S2k9)IO-EUڸYUbZӾTgjs>32mG}B0o2? cu&])2jٓIl`LPa-qֵc꼙7 ѡ btL~vriiQJA>:"B4z Yfϰ; 7h0 cLs3v#5hk6b"5|v'QG"/vʗ%HdxJtŧ9V;_74 JV`8P4t"<`\kϓ,xHX{ӘQuv7{HKQ)b?qPWuZ"yhH7ܚdhrLT8 <(x9 N(;r"B|"= MD փ?VMٽz#'e( #U. Π!H-J^xj8_ T ` ˗؀?!dd:;;q%wvlKu@m-W\{ǣB~EbJF)'ƷڳkVu[~ÚE'n*9iAO'iņ/Q31KO1)A"{|`Ahͥ)Sx,tK#Q*䭖ykNZ|\3L:LQZ8^*j}flρ{FS>A~]6W?}kN܎X,yx&)hƚ2Cj)e1;3"gdG#yZ&;u}cUk1˱8DmP<&Oa~Irʋx˅խ-'#'٭ 2/ɓ.z&',kee4QF˝(uO30bh'N43ktSf虬>6UM=W|Ê7Zy(W(dSIKy3cl<@Z%ˡ9JKkĪ̎R*|HQz}_U*xݣjeJ@DeuA 1 ȼ)5G dmX$0EHN[шC8G/#Df%!Scf[!ҵCna aj{ l5yjjhREN2HG0#1uc!#cNg{1MIc욶@CyMSʔQN)\-[}mDdoM7X"/7W~䌂Ȑg l}XGFx /&_J o՜`ѝU׺:v~eG("S^k*"M?dB6xi@@o蟿)|k:KIPju ԨGXZ߳y ߷,c' L7++dm;[}˼#uzN;|~BO."A&ׅno(}P&.S&$5#,`jUhgz4C= ;3?ܚ "&̘6Ja?bt:>o5HRlXa]Z17WJ Th (f#z MpHC1Y W4k/B)Eky#-֒.k֐6&x~ly$ 2WNf&=w|ȻYOGhDavDba F ]|*d)5[k{Ic([> x?04BCCu!qˇu^_{u$M;)$GӉx#rsA& )qyPiSUSTex:BI?#e9vkkֱ q.8 lO}`tP@}'OƄ'f:cSHGr7J3GI=[ p] q/C'IOD ph#ȥJ}֤$ՌNi}X 6]*T/6+Q~nOrLo䗕+c=r37q$LLF]p䷋߱jmwv])TTW6&|=Ԗ}vv 4r*~L2ʖ"#)2hfutzHY4jj1QF%U]Y~ksMrRtT#dLє*Owg<31;VqSQBúdA{Rq/X>1/ WK1এۍ%ޯPo2P5L[cɛ&} 2*;5"h|.A6Aߥ`}H+a֟d8roGV;}qwH;&]RWk'Ywn/GIIDATbn%+#+ @U1Lq$\0}*zv5& 3!M9\,a8wѡ928?+)7zG03w┿ 7{| UR@sοxb5x>8hA0ڵ7}A ;X%H- ݜ,jK͔F3?挲eoKej* "C$PBp(1Lquw`[A4jd^#zkl6X퓾 ~z*?yb ήCMP9S?^Kct'S)93ˍ1-G]<7eȡ>)8i6T?BZoo.>)7+_5[Fߓ7|94FМ:4/=8(%-"4׀Y|M)Z)hț lu3yĐY DS +)17'|`OAb&ϊ2 EO}EE +֬+*^z3Kl䞇dj δif CZ$`&}YӵWIR}FQЬ6[&Z2mdʣo*3Kī{֌ˑE#f0|zJg֗1mN6,L`jiYR\.|.i]ۥ}"%v-X$S GJ1.LuI6hzYľ$'"eގc Gf3zef 5uxק?}ûK3d[19\G/CH%|J*mJyC^k&9u<}FߧWޞۦNNT7.+iDk#oѱ[ˡ}/izf L k@.ŵr^пʛ^oߩm:qMoӫWg8X˟tfkahZ紶#f%7r3i[};r6i3WD%f \ DD!'O@a6GjQ@s"9v#"0Rؑ\AJۤ>F|AG)nϕoPiy+> y_E^s$$3 >O S'(R̿|)5Siy!mʣZaJq6fFU|k$oʷUf,WfXG{.1;yV9 ᪟4{iןi/^'Y$C]ɧG\9s) 2 &϶W9fu򩜥.pY UH&8]!˟!fR)NP#In0rsy28%+.%ьn$P,p:R|rѕ͠y ZG b`5Ĕ |wm~&Dª cULlqggӗ.Ե';4kI,&Mb9K(1f]}Y{&He39IJ8? _߉gX|8)z- _F\?pzOeٴ(e"2h 0ļQ8Grfe)o\^˩Nm~iQNut^ߩnF׺w -Hś[ѳ Vk7L_ҩ"u>g-78Ujv`K<[Fi,* }zDy]~f\Rb~ Z>A̜LpћQq b{nĘ3){( E gp"h>4DћL M91oj ]s) ,̩_'@Dyp18Xv r%tu!6xHpȇP\*-qVuh{H+͇pXaaCW>by=shaQ[җmWvBT wUN'ѐKi2>W:*o*]e r7Qg 0۩ *.>YwRQtT.q204 }"|pݪ=7mm[b"B4}Kl}Kf,WU&vIME҉Za7=oyG1p{zG^vry(KU)uTY_eHͥ}7;̅-KXD@ Zc[!<*s^ 'nFc[ގSJ%ja"W. )'H3>aq;PqaUVWm->/z4s9K6C%3"3}xLQoU_swoՑXg+)#)Y[2SfaosœS0ѱߚΪQ%g-HGTp옱fI1淌ka 8͈q܊seF9ldy=9]C'LA /[p"!+:$Sd!PowY^YqJSN3Y^XTW=J'!2A ^}p^׊s}Q\ݏ3T=),c=g@u v4les{^ݳ~2l穇;dy]'~<^@v8TQ_i/гu/֋-=;y/ {ۄ)N2ݍ~q3|Ĝc;B"FP6}#pE` NU#l;ьf8mcQp>3J{M͔2N_-y )W@oG^{T .)U2IP pAk-*V}stC5jye&C+]o?T'\Վՠ H kf?EڴjIZ4~e6ԵOx1"sUݷ8YeX8;٩Y)7lqO%TWx!~`OqRi4`6ę4yѸ?ˏA0C'y3/oD=z-|'KtLr7 ~dm]cl).r,׳ws::̽,x_[>3w^H|Je (giCKӵҐ/gygo/Q/ ;܇^XaWOƄ/Y4p --,pP'?%3ZRqeؼw7 =!30qcqG߃vu7`ن{GvVT]Sm,PPM>Bz1G>gYvD964ZF&0jIdxR)=k%T9]0FqU[oCP+e[LXF\Ճnftgayy-]Iw]x<w"{#|o>~e|냈Ĺ0Kg~x'ډ}6#<x KęjFOŁo} ?w0efa9 aqqۯQ3Bhśuv[j7dDÇ) zbgێ%}%@Y8oU[FihO%C#զ/9-҄WoNiʉ=i&CL zkf"ZRĜ_R [& G{g)SZƤZzļJ?r%5f{T'S(O[9ˤEefQN4U '%Y}q$"U-2Mi^Iiy=`p.^a[Om>{mwq*B-Lią7h2fY6%:$Lxf3aɤrzy*7޻mm&,bHQʸˎn}.[ujG?a]O䧁&D=qW]ǧ>id}w܉m,Xk-29xKN=訤Hl&\Y! #P̈́7g7.,9bq|N@iZQ\F(f}a>W}g\)@&a_Kw1-,.5:<X[+Ɩrq?-6; ͿdXIWzNLeClc0OS;#ul.vzPDu2Ե"h7f#t.@J;eANR1fn7>P#de5O3N;l lJaaׅ<3/cmp P̕EC[i?s)Ä$5Ye{!lg/6鹜-mlOύP'*ֆpBЊS(W:6y :2\)_$+TR2iH+t9,-9ST'OYuZhc՗58Ȥ/3TiݗV'TL P(fL~ `QVdj_kч®_&1CeUk:+ oPX,*V{XA υ+^ c mBS2!A> 3׮A=;1at' Wn p<_"N<<)?AѺg`_<zf+HleM0F|f}߁]W}cj|DncC W\-'Psk 574G;2YN&6$jCg4 `D'~b⏤wуuԟ}C-$*lk1b]%`U&}WtR W?Ě~FmAy9iGލ1+9ҰMk6NKo 5gH:/2:Fo~l>uPҏo=&㨼5H%n'њ=\,^gѯli~~,i䨑V8sELAqlt+V7G~WţeX"ڿD>m1{P3%EqoPl :|9; \MS' 8[~}x~ 8@ߏ >ÈK?qD:= B/%7'1͈wKqWܑ+79wO>fʇiNieIHnP}8DJ#_+,ʗ"CN}z;7VEZ.~C*/%*axuq˱kn V/Z '?#wދ3O>s9B> 'KGpS< FS.Yfu_K Sc}7P3#:Ɯ?۩O˦y0/9w:XF7RGG lpK4'zF?{h'J·VPb;R uCb;k62,:e 56~FN}ʦ3hnn6X]슯e$~OLCCCHR֜N}}=ƌc"۷oiiA&13mN:J}1)nkyj$W$qi KϧU+i MⵋvwЛM3x䕤1:) "HTdMw~3-C  "Z y ۂůzeȋN-eXa^5CFu?&4 k!iLߥ|QZcJWGFo 5zKub(W*m|{eW<~.jb*,T T_.֏6ӿ_3oUIjW݌,6Ӯ6MD SV oLȵuO'd" kэPpv^e7zfh׍)fTh?7uPixXwHH8mB!?#$aR]z~! nA9 ފY'̵'s0ݬVTv8w1yT}N fp}L}BrKa;OpOLǯ]D݁d+O\_"L/ c"K,iYYgt!ÌȬU._e!.ԭsouߩr_9ry)@k?cеUh}c8C9=Jnv66J Hcw[y1qKWI^#n_u6ˍNEZ"'$qZޢWC)aRzF{UF}3^JSY|]g+eYTʡۺFί-ޑ7yuߤ=&f@=lxⵝW50>#S̘=-]7`+ P=%g W#L ӊZ %Xw/|?ŤxL!AիWccpK_+cLA ljئF*F^/[ G{/}煟)s#0Y0@}>!8B~>֏ߤ<9y7 ;~z7u Lm~k'<{GB淍5LlAwT7%g=ʿ0xp8_i)IޔM`>Ƶ{#i>+o_^T>=7\y ~|r>x/yx_y7syQ=,oճ&mykic*ov@ܔLQ"tzFf 7o iOEu3jN^KXז,f~ny~ ,DnuE{{QwIx;/o zqy?e:x'=w6"}fSUF(M6xX Jk%cf & 3*mB ( g2TEAXٱN48FT|@E2f-* ~Q-gbЮS"[.Q0X$b*oOQWS|`N%*2Ff#$j֥ xLVϲHH[b5#(kF`L=9{?:/Qi.SyHFhada2Bk]>V u urs*S:MB Mww]eϧy}I|F)I<F\[(FLI! oQESC2ԣc @tX"ªQ=)~O5H^#1 #H`71a9d x=S$PUD 2@Fa2iJɊ$DB7rdCgn^Yp4m≧DmxYga9{0.=øsïv5k/#n܊:JͰ-+isƆC{O0MS<Oʫމ933N<xetbGpg>Xq3M뿰r{66nG1?W^Nt؋y--رc&Ns>a!|ѺZ| qm%M y I)7t1OLr#P&SЦw)ez6֫kpĂa $b",hŏjGs2 I텉Eyz͖ $M?K_y뢆>]A8~P@54wT4! V@/>:]JfLXd8zb(U !HCoMeijECms0٩}>-`*񉏡e͓NԦ:B3Gףe_#%XrBCOX'Qs]bbM3"@͌q DZN3SFh/?ڃd!A<6=2+y|֦iH^@}bŗ?_~KhsԋO|_(E&̟wN ,jN/"K?/ \uvwc*8B̕I[Yy9"zO}`F["c")Fm~u3!giq ɣҕ"RI97|6Fʟh's2N2^ZF]FBUPrC+gjq$*[a/u'a5ך۩_ĚoA̘= fLBS42FM*/!=*) B 4(!Çt[x"R$%I3 Eˏ$$/t_,Rɴl|MyoW=IӚ)3<8S2*?ϛI P,`faCm鑒=jLo R[JoD}V"Zƌf%  5b'L ^'~BBՌl3+VV-3K~ PY 5!!LKJy)m!nN"@,AQ娜j,U@r"@C4˨eUS_@ `hvђP i2 υ"#φHsDH Lɬ(Tr`dᎅ0K#P6өt3u<d@ ġ0x:<˧)غ'#դ f )ա$ں!$/c.S&/ZIA_ri>q(Ph2 T/A]?LR.Ju ۍHtU.9Hpdbjooh:\`C%#VWgǯza }5T];bNIF b<4Y{xdK0at>:c2#c1a$<|X|%Mg8 ӬEHh+@&+Vg|N; ;w*M]d |vL3.X8{-}Fj^-QC#Kd᳟涑OE >LX5+/{n8uh[=g`u&lԴpk-UYZyC:Ųk} ژ {sWF{)lZ" g?nG`P\@hOU)bD"xqe`Wpǝ͒s'];"T>yM 'S=N3EԵ'c-=wj5Ǽ%хYg"=8W^z2( >`Kypne"A~l ~o4 ߬UnU2H^LNThe(haZZ,S~3Os>  O*aB8a}5HyNVS ˢJ|"cK(Y.Q/2|`G;*TN] %q_i (7M?꠆\y#MjBpڰYy ]M=?1^ M5DZo}ݨ%}YSL*rM<ºlW"'#x *,,4~a[SbM70URfb)y2-˶Ϋ<abPC-ls_3S1+dU7eeX `=6 ^0\*`)k߈V5ݛ{B%̟>sxle-} /}2/C -CMvҧ'MBiJ^,KmTzk"15]_GKW4;BHd(R|b,qOd̜s < _7o)J&Bj; $:}Ɓfvkhz5qtQ^=N=őӷޑܑҴCXYs\y% 5FسgLeMǠ3k|l P@T/S; (S^,^`qFT&(OVs(%S4 ےZ UhuO7CTǑEP:E&icv6}SS<\Tsevr֘i^!@A|LKSZ! Y{U o2 mJ";kFPTH8A/kI&0k]@*X,aR0m~udCn?|T'5MK5UĤ0Xr IMeT2Y X(I>KPe -Y'~4Qձ">/l%"j Eࠐ!Ȉ402:`]Ը|ab qb[NF269Dx]ôʲ*gD p EjI̲.?e<uja@y,ˋ˨YLe֙uOlSF/oU@iGYkm8BUЖq4d5rgH:֍vHcdpc݇0كt ˜B۞}1~3m9CVl?2u'\Ϻ$:1ڍd{`h_;}(~J>򯱡0ۨ$R^PumacшYت)L 2{IV_hJO pZW_YeS434b 9R^  >[4Yx\Rԏ˖`udEJ㲅p`.**A}䡗L=pmLDw2=hGWT:DxHSai>*12wu ߙ5mux'ʕ(ɲFd٫ ݌\)<,W齬wKfO/'Lcy ;G&_Oe*3ul'?eN Q.εni/Da(۲{)CAD(<{b:jz2jOq  jφ2eG4kAb-ivRYS?J;LA.T&b0']W<b/L h|AFE_C&,oƈm"0qP搜"\*Aցð؞bZ*@#<)bFޫ ͒g޷uva*^xO7(d ř Q*ըt4 T^3 4M0SUp`:y`h`L׬@i+Ԧ7 d#=N>tMC5dž[I݌f=j0Tyǭ@mƦ0;|k$mXFu1ßf صMzAXu%O`iVzȫJr|ajVV[z֌ ytCw-3B]O2$+}}O(]a]G}_+Wy}[ɛkOu"zfg/l -Q`E/elt2 'eאF_0i$5gh駟6f72깼*.(tmcptrnb1=wӵ ;:m[luU}+xtP#ȊD40.j/8"h ۆ?3ӱm;6SJ'wYgJ2m " m6a%"jp`G}' WO$0Ac,{*Yd)53 HQhjF_?͎Tb` D~V (* /[+~` 2fk,x@U)RQkN ATD*aHK֔N)16Y[I,8N1E>ckxDlE3%6h^>e2AL.M@6bf$+BQY4B"+~J*GuA`dۗ:epӔ`2iڱQYR}Qkd'ϺLpwS Q9LZQTbN@.1ʠ.J>rNR6M4/[}H1 7UZG9 P24T!}E,[s֍M3nD[=d'=Hk>=TyҔYP3n,m،* djlDz'G8})bhנ# kY *4$ay=$L@@I aGjV-~B T5#WVY5CY7IW Nhl`fjf}hfØ|O"4P(d<5vՋf^sS#e"f^Y'%( QުntL֥Y2ޚ9#YC/l̬ͤpIf|k)4$Fjgi$} 0lGxXr |fɋrdN.;6L!I%3/{na3)` D3o>^cr2y j+~u2}ʬ[>(CWDt Cҗ$jv!Rkă4Q*$_cu38@ΩaJx9%H(#j>  h5.-;1f_xIL8nR}=x7A卨t3 vu'h~VԖH5z͌ (~u?g.RN/_k!8XOnؘ46cҌYf f SVqW`q+1yqpb{  yoU磯YmC?'bkPo)cI|[x=i]p;Bg~|~Gi{&; )cpO_/"-G a+͔_If/ff6k 72hV pms>aظq*ilQ:Q(#gj63u}-~zlݺi41edHy'F3vXcQ4GeD/V ۞#$e^0X0yY˚%6EfLjy~JW^EH̾j‚U陙x,#87WUHJWNjxfLZ%k~jMPhOyNIPuvwQ1ÑjTS)/)m tIP@҇:W! "hTn}n$w_:GEPnm!T~r )sH%T(B츻;aGJ_f0Ye|Ν*1%ZRY70LL]uJzh @6#Myў['-d`!E#щO7H~DDLrzРwȸT,JfTgÉyV~!i*"yJ !xň?]GQNݓ^"y-/Y>*e{,:s4:3I]eQ"tGK鯽0JxMYx#P1dژ1L)|Z<;MELD)]w(wBƈ 庌#9:A BIb3)O[+3˄QBe II–V1ыNmL)G_Aoq.97QV)*_bySys)HHsYl@,x[&wܕ!A:tl -(Op| &%~Ā“Z%t %LlSWJ5& :S:"s`bSӛ"ەxIxN3ʤÒ|.oNk!;#=  VuߪZ4|%I"հ%=l 3)P\;%{ej'&Dgp 'P#oF~=|o~/nGs/ku!ʏ+}0 h@]ÕʗjN+î@ZO2y>Sy"JC)oS[`l 8dџ ux> Ys]óg͝?ogMA=gww6}O^*MzOzLCIzn{=;JcxsN.o⽑WyFk^bDN4'W%ɟR֯J^>+}fq%vH%Kqeϐ"c,>hEeqsŦML:a*+ږo/gpd=D^[M%P4:tdLbl.1ݒZŅNʛ,8ڜL j 7rGGfvLOX$kJ=BzX U3 0Ԓ%H1!% ^vkł D<0 2n>Fн-p 4S@u*Qu=F\0\A.sوqc{2NN #:a,$>*).}8F³!=Z[0ꩀ)O;x 5C632l̋c'&Qa#@w& )wf p^C2|H,NֱΦ3P$jF@dI8u2 8z3)rC#5|ÓuD69Q!0ٟDu҄b$.^G߀({CvO0P|ZfLE^Ycp .*lOˬ(l X_LaܢpXMbZO#=^9}QAE{n3HG#DA3E-89&R4-zFj 8|2w,6ڟytXWѩ7%dQKddR6q<j\!ʛ6N}%ؗ5zG7GݟύGQnV^+ϷlM4AB5P-Y$U)JD!e<<Gy<4`KّKglQK)]cH~lxrpf :LPa~) 4(  ^"/x?yy) C3}_D 1hoײdSz.9a6%\)B9D H2߱qc,TxEL \ EL;hFNelDAƐ 4_dΥ8:њT"րda82eo} )/NѮ}kB xXw|ĚEa'ֵX´:r)T!cJY?fͰmX4e@.LG]2jHM+Ǔ&#l z@;Lcʟ+#n ) 2$R2rh|c%vr6Ԙ|ȇi&FF^Κzq$-5i,a#9'.tV HD^ Ra4$0q<ĚaOo'M8,w:١d C/o#mk@QI9ՒAv?寞զ`rvn&gxZT-ADTz.߯zfZ =\)_c'QӊYGx&f#w&:*فn\Uy%Y/o>MRb= i v2H.'/2zfWOʌʐeמP.xzɤSPL4C8ľZ,boH=щntn{N.{Ys`Zz,k[Y7 ]{Vvo{z_}y{J_~'Bųs-<3]+6B3Ⱦ+${ԍf5R˝4U ek- `ChBUf(DVv+~HEX:O9g K^NF"Ekjl2+nCas'u,e@S̈́ ,[dЊ#&fG5 Vk5d Mmߺ,}Q|MBțK{oCB%fYHHUjQS;ф({SdʃS/+s#\92E*מ]8i<9LCkX+px,=Hٰ:,]u:Μ=Šw(&ǪVaw*;yЏr}j 27\ȤBVPqκ*OlN2e{JS^2AР~vvY;56)Q ˒o ' Z^ ~IS,@ xPΖ0t{D%ACzCȦse#-yx:T|C&jb< 'zЗL:bw4(_e5r P hJ2 hbwY]?:jB:;O92ЅKshJ `o4GWe=ҧ'ڴ)1GS.}z{䆆 }ȏ%˖S{lGD%V2"XE c.Tw8>0enV˺S㏧Ncۓ] I^jI2hTVD9T̔Mbꌙ,qN2+BEg/}2*w1_>q8gC$1ǜ|"&̜Ӯǜq=Ǯ>֮&ߵ]ƈR <Ǔ*= -7]ɳfЖ=(r,҂ ,S f͞ކgc֬sNGeQ%CEoOC'_,9f%6܋i0ۢU 1{"!ڵ}i9xy;01e nÖ眍 C26mߊ$i?U>vDmKc  D{G͓'M誓R[Gʞ@ime_Se6 lҧh?ҙ@u[*3kc02ēgKgtF-]3q󻊯Ŧ+ ^Cu_X?ΓʘSzC3AfsSy'0c} &ѷ>6PǒOeٓ#/l,%;U|9KZMzmVot%Pylv1H03Uh j kKN=tHQF<>k{hyYfQI p+`MH≣/e:3)'а`.M<{o _|ƣ>{o nz3K3hfLE߬02>23XA!vN'̡PKC*{fi"ltB!fNGQ Nx|)DӪg[z|= ` +medWH*7 !2X"|zEfE,fLqDNJgU2Șclt vd[ъ Vl#/1+z{!ϟ9siIԋʌF%ݻ|@~A@^i<~@gDS;k͜=֢4$ Z9-gwXl=6>IuZ?9l L2F@{oGӉD05ҨxǍ_2.1[Aqػqֿ g~c7! cH!x~Nh0V߈)gc3Ӫ}[oI֭H3t)z\cǠa|U~r>p./~q0sN&I3p'>˿Y̸vnO=8X ~Q41R۝EtXq87|_NV:'pܻAn88e^'?HL.ai9tv6HFmP_ )SRSqa@8{"p;(K"Kb\ PJӜeuc W@g2U]84r>HOn>.< c.ÙUS04uu%W.C3ÉOFs,L̜lc=m[ӨYu'-SI>sN<պZ%l $({q,xֆOoKyqy(ׅ {`۶@m5TLm+? [>0-+`}wLf(oybi[[zFu-kųUȟB1Tvy))‰r+/9w.HR 3514;ϒn҂#BnIq~C}Mi4DGC>xT©wi!#A3ӼZ[wj#m IRʺ"N/WL:IKk5|RAB-A[Gx3:⁀4LRaFsܬ+_4tz8І.Ͼ6&o iL!&hP_HaTg'߯b,PLu,a1]WڊgEoϕgFN1y=t9`5\5<24M OJnMzvi#xyeQ_whD2Feqfطoy&[͛M,:S1˅d֦ZJ*DTKnt؅֩ORjRz̟1wJbFpNV.FFjF~F~L\Y_?hvT.׍ljb)PB-ǜq)?}~: jع}N=1f 'XsX;6+B{nutۏ~r*h BR9drغ[QaGϔɈjѹ2 ֬-?0V=:{ɥM+t}ϺP#N!$-Łh큟+E4 gch͛0k 6hcE޻c?s~E?D+o6ms/I1i2<80st~o v==g"MژF&4qybθ:uOC<Ʊ,,wǴ9^L: !GS{oO>I L[ش u($"p>6?n݅&Kdz?>^xyRQB믃71~(kZ*m)4i0hSª'ў[Nؗ4ϑi#b.) Zm_^SVIsMUV;s.S&?>S D0uL9#3Y]ԓMcSɘQB2zh02|;n;w4BOW{] -~χ(-f㹭2SmGtf bѲe:؆C8LS{Xy+O:mƂ0{u}K^ N94,[Yʨt K.<ɔ/ox=]]XzY8x`&̙gP1K.v tmށmȥrN9865ްQaz:v۰`Jly%46axd_ĵut܅dWL!b e8Q=VPwُv~'ypBt؃P-6nنsهSė4NGg H< ?{>a%N~5Xw0+3k[[qF/IP?uQf&9*WRqEͤqh6_ƣ vNM297׉R)a,P5Pa %awLlf&h$Jɲl u܋|%%ڿeA#f7JOyh=p1 =$Ƴ56/ӊ>5!AWt@: Y_5[E';duƝ2̧g2hUWU\8Wtdpar4DuO\A˚Cx6^*=r'կSf2;gI,eF6vHkaeL}Iׇl˒2 L4SF-uиQ`=:ִ2M5W^T-;館B6ޕ`|{z(4l:Q'-^۶_-F؈SN8{Fv3}u+vC[@=+/V(qM)OqˎE~(no`HFCeFSb5m~%~Wrb`I 6bR %qhL#1M7ZA+֠vdQ =W7u# ?v 3Q>2WIqa=L~|LXX;EPL/AۋX(%mb(I2ҁ.@xby&H"~φIzvHHFOYw'J#ך(.iyc3٣6Y5Yd+Vs80S=f̑{\GC߃ǟh[?> &} =uťXx2 i4OL 㒫¾M}; :6ځwiX\p?k*NÔcؽa5e2d@t?pۯ:եqHŢvzG;~~gթ@H$4C1ʐ/_S[K#Ɗ;bRL8cgŔq0wL97_䗘5i? ywX8sW\tMFyejw\Ɏ*X]K(s{ޏc~D' ` HQAؼ}/`#'S{/V0K#_ZrTNNX2Y0e9MGys~w=oX |&a#>s*`bw!o )Pf #LʦMep֩p+@$l61/~}8O>8 * o d{#EZ'? O<)ӱe6=3a)s\nmpC` zڻ&ݏ<~ ?'cGcѻ7خ_7߆=S+ߍȊ~p}F|<7^//؜̧AGf7"pt #ڍZsltOl0K}tR>uCk;fXzށ.35sbw\u-ZMwI<yb*b oQEkoTaϤH k֑DC:HU?>DYC< &x8D:{@3A7i;0KEHCZ&LF;u|؏bT5EFøFtkomԬH(}pV:*ylke"n9q{o43'f?=mvdYM`/쟢ԁT;WdyKtg3hyTPZKoΛGJs?;._~~=Z{]7O"F%%:`f20ۇ9y_qdB)&7x#.]j->c5 }'馛pE/2;^G{(Wlۉ./#GT:.\4#NV,)(i}H9(A۪{>LمהU90R{ptLb}PPT$ˉ, feDaï~sBہfcȂit`h`cPW3G}̟3'~&fN@\߀O`MA^_t3Ln_W넍AgQa}<MTcmIp%XlEK{tw)#LṬHf6mLd atְNZmCe8i*\{q$A[ucP9xO?O& {2+"! vpt+iSqW``N$0~s?=bi vnނ{n/<o܄z (Ovړ1 GǁذxY`ǍK`fwuC͈{GsC9K]Nuahw{ήeQ֜Cբp ."Kb1/<=xyJ퍵uFꐀ/cr,_44WKd0~x{kL6\~0 *'[mKԦ6}-P)~+m9۷o7t0qDTK:4emFS[ed,P2h2kn1+v;r«8 -eׇ2_uާo8g%nr2fl7CfsV)~ C*M j|(B3k/Gʰ e6 C(L yjI,XL6\:1~)̟7vx(R>=O*A6`X'cbr%qw9L | |e}𲠚0vtjEZbݫ) Ԣم->g0mmR8{W /m L+L@ׁ}ha21Mh߽/o`ik8оRE5W\O>JtAys^QC՚balFd8Զ4a,,v#^c6B={yp?4J'L$<̳#eO[_| Ō{&A׌&mDU%"Fm" Tv8l$$t &Wyj93qGcՒeAގC>=q'`K4W] lX"͝|colw.?,m1T^ـX;qɸP%Mf!*tuٳ+,)1жw7V{;aҋg>Qa߿c4le&M~ߴǏTb6GMcwv?Өg}R'iub%#?TThOʮ=x{ǰ3'Ǵ pw]qci Iy9g믂Qƺ_ ͍u8S̟To m{vae0/ą8O7i˵h!Iyү.GTL&ǯB EK|?/r Ά |A/J,cjϧXK&ڲMB#CMm #d_[OAOAY4cb]`ͪdI,؋Ԇ/~1aL3 &ϝXʗl!=pz*p)@%b]q<8>b2Tnk/2BK*@I+Ci,{ yv6e^2 ot2= fɁ~W?x\z n~׸nj@낳&h|(']H6ˍArNu (<8'e[RW[s[Ѻm %>L9oerqh4 gOW]"矏?Q8Xw W-/[AicI_ǣPkʳA`\ }oq?LƱ泟AuWcTuW8-@)/$_9+qMCIW8z8H^/|IPqiH|dl PR S*݂us:!_ȓOG?RLE:Jaesi)95O~%V ՖCqD ul=N!]M m kDdъ {/]e[ZmgTD6oxWh2SZJ_퓨@(aQD5G4J`XxY7(3yvL> XL)oL-[5"2sl7+jy3f=f=j,/ÍyZ2DP B;VXx+abC=0މqT50e۾ea֮Y5+V ށ|Va)d;Y'0sXE}(QPNjIc{Vd5#Ha_81`dz/)Sc$1ц,AYq'1p* WA߳8,[Td<fm~eR)d9dYfDžq0LsMË-CX~IxgE t,=Ё}Opp7q"lz2]l'_tƍj#diSaj,x/;0`jdR:_g$GonLmtw`ڸq۾X:ru{K'zG* ^(Rإ {%@H}pk,pKe;FMK*56uG}8Jia@{kAFvZACQK~v1zQ?IQרYkZ,EP}FyGn{n${PulNJ`/([@NjJ͛l8eX[x{ii~xl\Οob8QiY.:*(,Ym 6fBK/v:[j0zu7%oޏ"e "Hqbzm* _1]u%HF4엿=6}`zcMMkZM=)κ }cF8v:TmQo#AUm)̜;'y:ف[~;%çMlj Pnx ̙0v%ucx:eu,^*bx\Kf%Iyݴ-1z!7_HӐ0 ]nfGGs܄XzLٲכ̙509kyU˺f;J]ƏfYFpQonG{6- ccA~ZAz; {+k(:k`hMΆF{X|p ;n565YdޥFg?2} Լ}m5 9d@iaQ  "?m};֨4PD#=>NDz(О #Ħvϡ~<$Sv98PV{#^xЦk, Cg/ǛϽBVoFw9kOcӆ-,w!}ާc3OFʕ?µK{Ŗf$Oh9qd6b+y*\.ǦϔfvӤ>r>%rO*D6aiHU I|х54`ى0JOAWz(SXGk^ټ9a"R-+L)\]WWgH1#~,6d=HuQVX]u]FM5d5 B4ɳiZ53$}^9Ań5NsvlX6_dۊUh[AV\ ة(qcQn-2QҶE#N dCe{rh (ɡ Skogh91y -ؤ4-GPi=Wmڌkʓ`t@}g! XOeijB ^˗"J& IeЀSVΌDbRvt]TK/Fԁ$u㏠ GN$GqXGOgXdپ^wt" 4|,lmX[ $_8z(:7m_GuV>!yF8zM˩6,Z4 ;hپ!& @K'sΥ 0nZ,~iķl1NlY y*lS+6l1Now{V$ZxA ZX Xs~>/E>Du WbӯX2+o)3nGKWl& ز~=R<㠜1K4&YdehJ'2  :Ux{XO T0 Jt2Īw%;1`=( E V<@5빔kl|ojFm`q rlE_GۺMp[l] )*aFl،&j:e )'mU>OCFc8Xh<ńsZ@1#ކuo/Q_؃Q{e;=HlBQc}f͚5F_I>|Cԧ' f1-:jQp h婃~L}6Snن(x9qRO@|Ӽ~Y_կQGww\hn؄Hmއ7z/ ї[;(~mCY$MA:ڥPݞ2Nk*܎V▮F475`ɖnL: ,Fǂ^ R4cx*Ezx@ ĈYdFx)SFXeS- W}+yytsD6!*a3 տxrqT#V ^UO=h݌F -KpOm-(vlmgAǍ6b%?JzutY(yb2iaF>g mF%ظl |4Rw3m.C5h]yKfM'{%-Q as{FYh~wfݨ_WdnD;f>D9 >(3zvGtŔkF8jH5L A{1a.]+NXGǢo[`5)l;m}ńeE3|8)S4R# 6S{1Qa͘d}V_#O8 ͫW7^}}CVLwJOc?dvv]O[lq 1ӟ0§*;g}c9 C[nN7kP/NJl'j7M9EUGM eiXdig_SʡmMyyQ;󗡖2 $hg̝0ir\{ݔ,/MQo"~)fsn5 / '_jm+/BQ3)CiRvPRRr!4[kiW<+XkYf:ր֞$y!<#ST|' GLFTѳy'h{K(Θg *p+?"i3h*U@NUZWLO ErҊE)Ȳ|Vf:|OE @2ͱѰXݧ)Ro<[" *DQcLJV_1?cæc֬& 嵨-ش| @ʁ`q*4]gahY)XFWc "qF4_a$`ߏk!  $9x6nF [ϫ(/7é7`/p١'E[ q.獃ZYVdxGT˖cܐAx. o2wkR Ԣ8Fw u+#'AD3Xk|pti1|!͝ `Ro܀ڍ]gPFRB,.]"Ðx j> #t%X6 Pm/*XFl$Bؖ% D0۲v=* [wYyT1fHAA3u^d1>$!` mQRB[g [Ë-U55b=aRmfw@؀f9"T`CK*PFp/bN X%YOܴcl P}# A (aƐhYض#lN )vȐQf=ë*͜PE\4L4D]ZrR@K>Rzr]K˕Z=KI 34&=m4TӒagKrQ@%2T.s0Qj`IC׭(yRnN]fMr<֮qOk@[z}M v౑,SH:^|i<957kZRhcsU(i͔z0W FgSibTSG/AyBTRp/*7@E,k0 rm @8뇳 2,-C"? oU4w .[I=:Dyj>xpuFQa;?G3TJPN~2s(J<N,Zb(Ύ9OeIMli*ޚLSKPG-Ķ(F)ecԃn E݂';RXʳmR6*Z_DdKʈ[΋>ؽ^`-"nlDYZk4vtbde%Z6o0bؖ7P8'QwOv.E{]/} QCe՛>[^:sV> (xZ׬L䴍2RAvُ*jUtm-Ն$28~Dzg׶Xh12cFZC'hxBZFo(A6e2RĠibyi5qLD)'@쟷ފZ|Օxp^vSw<Ў[sٕWgW]^{yfֵ0x}g7 q'ч5kiSP*[ͦ̚btM׎Q4aR,="HYGN#)"1&- 4RADS}](|uKYDٺlϱw_Wh<剗:44CMP؁,}mPcݯZL_iMU#U7]Pхĺ)Plf$i\ .іsr4Gydi䂶Nz f1 Qsl` hf;=(Pӈ{H3H9RNFRG{d;@s*$ 3J`м0 "*?;ҝM{A+vgTGCcW@uYT֞'U^W2M0wvExoI9Ye鈙ng뀯 (/&Ru].+\'ADab"<|CmC&guö/qgw')'KEG.bk٧.31Ԕk.3Na!^d f#/ӝl 2qA-AKbea/Q3/,:zh(׍r's)xo'$Ǿt IVE8H#v]Bt~Q?A`+DDԍT+_%T K]H >'EKҒԦ"-LloP`hOH"xwqnh#BuA%M&ލ2 "TPr`+OAK1`39_c蛼#5NRvԨ I@'x U e6E;be^!X}唁 =%($,y_. Z0<֍bZ9|yS}X8ׂ}9ykwoݟ(\2ϐ6tgRZ 1I֝OIܔ! 9HJHY*ҕBb1=]N2:3O Cv'p21Dܴ݂pWt!nW9*ˬ&v o8XVTˑؾ=0ʮVx$u=(^x܎]~5P^mF^sG4Y8s~+#`˜WO94ҌS'q3iӅ;G AB<ՌW_ S0roe8q)'P69$m<añyB+f ie e**K|tio.-DA{#4W&OU؎H((BŴBژDCね:tEѲ皂+@K,`uzݳ X)ͨnbiP&jɲ =E]*ǺfG?yM# UpFԸAyT1r#؏2γ|}x'lbʣq/߅m'=zoQ0بu^n;$5 FAlg䂢~'RT9y} .v)7b ϙt6tNA_T6!AŽ//O.*X2"F1J6GhF$P"J'C7 XƌKDv ^h]l^],x}CIH# RcK*ZwAyUp9A`D|8Rv]lc֫R]W>o%o@'Aѩ󹑞븋W#T\-<"<}.* +Fx,^ sM(4ٿ#GEe4F -%#ȿMxo i׍^b(lmg[ق )<j0G|nҞSÇA St@` _(IZ*HylhS^;D4.'SF3E;vZG語*tu_:I>һ(u]<!/F϶P4<a%jwOk GvN ќNr_>4'uO$*wri>0y ksW.=֓.L!?.RFyQh`o@ArJ?>~RV,Z;:RSOi-[;yP6RAp-k+V[x'HiJzCF8ƢE=8>Kk`c^)}YyK>JuUO )ҽ>6e؞Yy>F>Bc+X#C^XUQkwۨ\d}Lb(/-ȁkѹl% BzFeRk7&8g..}~tɏ-?Go~cGb?P7y*~}˭.BtJ/\gs3(|nQ`K{t?0fyyDib2TPOVjbD_~c+sdرm 5C;NWJ񭫮WR_-ib D-'g|)m#ZVG8%DoZIlm5.)Eu;(oG7"UzyUbREBnF]-c>]Xeu slEk>0[6$Bx#*NdAΉ?tzW׵Vk֦ui3 yqt'"'~"|<x)6v)!i?}%P0|b]i9I|%1f4}~)[N"OEaF$=F_J  Zl@}Ac<n;ʼ?ۯ(,wP,)a aPqT!3;'};Z;ѵ}M-2/5 ;Ujn_e6ND.pM8x a ' p_{m=jhDӸLY*\M;''=gv{ˑ]S;2n~wpM!M.I"&L8PU9N;q ճ@8 ME9F#5MjSީowS]7ShT$rh"ieމc1- 뷧T {ߞ]>lgc6>IyWjwxmXHj 0D|  A;FF*F7^n嗡:Y[Ylufb/ȏ$M|D܆[Oaڈ(fƒqNĝqTQVk 7܈%wVv[n: Еr \ l^oּ6{6ohH11}$3RGKo,_kنуGbȐ! Z0f9Q/ٸ%6l1ekQQ@ZDVTF=7!̠6755iD3KdMfǬ3ށFdGjiʶT 3"O| 0A踣6.-PFGoBM=16I *W4]+5ufFq׈ &j&󞜥wp2)6yy?I#1G7#- y,K:VЇ [uU̳bLp:ɇ3'f3 ~m.kg ^Y2?)@r@\YC;jFb}*hOGR+9k-Z<]VZfhuF*hĿ/\4FÞjގ"wk5a#F|XxSHQfyr{,F 55#e!X5;I폡OQ?aO;ߛ%@W v>0{ݳ' ; =_em;.cE}aѥ8#C¦;@7rpSoܰNx?dI{}K:[Ӥ=Ua'GAOzErc*(fɒ%x1)Gv-^JOAhOJ {<'K[~KEY*MUvѱ|K d~ÞYqoE]/՚\ɠFSQA$3HG1}thaM(X(;M^6a.'hx!SPFҥKq)tA1mџf ;9jbA~}*mF;9#~=30ڂZ24 n w!3dBmH-a m)$f-;=d&-&҉5Yl>"|`;5"v(lu+GFb"r VQ;`=Lg55rcn5sDw*>GL4h r)q _Z /r3r>jήN 8hiiHyxӓb2\}uwap62AmQIzؿj+(7/{CY~R;m.-`ĊXvW^pCG[=o/dh!VJGo}ښQ^"uBlcȴFryoEj.Esf)m }w"niuBK:yNӈ*Dw}oW1׈,i\ߡw|Rɱy_*yY|5}acqڝơ3H4at/'W\pd`iDif>bvY#yܝfƨlN{D݈ͫ kQIЕNNjO",F$%0TV^؎P +@n>.ڣFٮmQ7X>St/yT|%Ro=_[jZCo/mV{RF:g2D"Ґ4q.l@eyCE"krXPscwE7 S ;S n! d[^x|#*.x]|HK~cZw4xR9_D ?jCs/mŤYoyI:/%BKC=f$Ѹ 7ʴk`e<*Zp{f?c!QhR̘88jyy2\\2Q/E#w3Wb23ӟ\ini6< 24;;j-6*L^yNn 4dQ5rh`F9G+w}&CИ{КЛ<=RQ-GfHPX~7=님՟_w:5W{J~~{qTMJ\Mݥ1s{HbV[u]ߓϾk2P0wEP^Qh\PQ1dIZ;T ]~XSdL*,>Ù;ƈ,ds?!kWoAƖL7IuXz5U?">] }T~sW.Mq}!vSG F(3,i(ocQG 4/Z>tf7f{wrԼ|x'Z\c/W"1|,+dU#TG-9k?}M%]gB~W j_e;R( qϯ蘦h/5oIxGFYS0SϧlP23-K|g0ޤ<˨Cm&F_S4f%%Ljqbݣ[vM`:Hl;4{߾k=;WJJ%5y;]2~Va~RHﺶ.zpyC"g1Yb}K8b42# x~b6bO@[8 0ug`ԨQn22}453GOQS8j|+Eh$!j-Xy]s>w60N;G5N"5ZWZۯdB5NܭǙU~EY1;"(ZRhuLl~e˹,P8EX؈*E )U[2eGDIw #GM!Fykvv&nxa R;<^ Qm^-&p;hтڽPm6ckOAmژєÇT9jTYF]N2 .2ouA@@~,9n̼'G6 RM]8\@rM?~фFuɿW^7|4aÍFeZZ[PDy{*DO8DMefQSDB]fx"Qz?O}RX+I1SpsO!j>R  ~"D9j8 4ڸvI%::oKOʷ=}9]/u]; =ڲem~zo+ۡvx'iS}ld=G?f0 8jXi@'T@b}n BYYIB /vqԸS9nf@1οXr%VTSأb xgLye$5IwOcw~gu0ϒii2r1ip1dpv͂\}㨉d=xg5T:jc#jc>NDɼQZ&B~֔[=giDDhT]yl`6TծuC& 930 ~<ߖFSrZ;/@g.fcN-܇B4Ҳ $}ZHm|#=?,RPlxKr!E:5CШ†>5ݓdR+]m'~,aT#zV}J7~=9DZH{r`Ժ[!'iGݛ:Ӑ;YboE4JmG %lQCS䨱؎!s2vN(#j4h:ĕ&PR698gtA+eZءI4m,8HSvBA'h PQiy.a l ¬k~k䲮xrJCC8@H:Y;l(ieUX4JZK=%>&By+7eٺ?(r=}Dv 0=+HXTg#݌ZWE3|oZ$HȮz|uI*+UM9:o3#+;hڱCC}VxUWi:S:XGVjEl>_QrQnhHN<9y̢7̔'mO(dʫޮ!fFhaamQyfS[a[]ٕU%[uo6$!k,|>CXZ,H+ۻ*Ji]?Mͪ=~R{}I3ՁJթv OҾsJ{T;䥃!IIi=F;D;0fo5=2w 9dl2̇|3} n'b9bDFhkV(Q]5E:o&&p vggiXޓJXɉPI5X8i[Wti SPCNqQL}v-Wȇ͝1uAWu1rh 4<>%gK<`ȲlѱGވf6msr(6΃rdIwBω*Ǝrِ{RJX|`?Z#F;<3JeSNzԆӈ1t]z7;Σ669GwF^voY>VkjCFonn6>hҲ3(#'A1k,)bQ˳n:ЍHAa9 #O)M*0+φ]hGo"#EB* ti4&IBK鋴bľwޱ{zǾe5$Y oih"nѹ#:S}79d:VkZg9~ EP>C_4_=I{u^yyۅx2a~>ݣ{u4$JX*s>WTmw L~˳|lӀh9L gj[nQvYiBUMɐ\h`>lmou[G H4Ԧ iݦ1юM]S^yAB[#RJE{Jm:6҄,C-EIg:=+L=GU~=zչzΩ>zV{{[򗠭d&@Q):F4}B#ހڒ < 2 !f=7Q QmeBRUDCŝD]Ii{4C)*G|/+QKc\`H_I^wDPZVfdhYKa'Qk!_r4ld4Qrެs^j6sO+etȼ҆Z7KFuFhkQ`M($`$l!q02ѠW#)_\y*?DUDl ~ʫN$=DP>^qwboC.]Kʹ3O&g>i;rZꃣvW,"oٷhN(Gt"[G8Tvj(~_BS=[e+jZ1lX@>D5^uVI6SfI 󷦍k])kcq!r*cZHZ7MjF8:VD-/&)d#IPXkij(gRR'~~qt_c'}Bۉⳁ h3P1ELs0"|JA6SL3:,GM6iYew3ʼn.roC{h+j8}{l'l"^4SՎ@Rԯr8KݤsW֔(.cƌ1zZHX[4 {+TGэz4WsΕ3))B @)Јe6/^% 1HY%#ed0,ۈ * Mh*LDpE:6\,L qld2T(2dQxA&]~ >o <_jrAS@;ivwbB58'!g~LfdI}q,{" 7'Ms&Wgb2Bpq8OiSaڱmk8 |_;sfI'O͛7,SNil<3ӧNGIIV-_i˧ 2>Dn't?_*a7<~Q1s]̧}JyU7뷂>-Ls.dz CjNűaQ eɿsO? -BFM5xh)7VoDN)nق%o#G t"ҤmL] CYc78O ]e_F5,#gF']1S 8ݬvf S4݁@YE 4RO9D{q{ǔSQRFsSp(L=s1:eD7+W,gR2x:l晍ه! Q u6D,EF~Bi%^3N=ER~ "hnm5Jan 9P,}Xg 0l i5rBnź54(WBԮXQ܌PE9'w<&N&cڌNjJpUog_G;l9|p3ʀvxY@p1cݲ%ȧfO禾9uKWqsYpR(%CW4j$ڴѬ~n^>RQ̴_FRIuRmoS$4 VTuF,C`O~:ꏬ0(unuU.B454aVbWWeo(僎{0)Hs9[RD!9=Wt-84`^r%'v(MFmtSS=u4oy#3zf޼#<7E?yuyJZ:XꡏC=Ȋ+L[r>'e+>84_Y-:+?r@ּJɳQ j0hfz EMQdрhC$$9 mA^nUc TF9Ўڷ?e ޯ_S_1yz|j]EaOۧ25hQהz]hIާ.%G1 k)T^@BB ,ll͋' }*'?v6'_Ti."aj /Ԋ~p5?C27snf;ed+ 6rʔ|A>؃M{ Rckm@`;-m P ,Ǧ \^<ygΡFD:y ~ve8QeV>\Skאi bt; lmAkcŘ1 ')ޟ&`(#FÉ'Ϋ}_K8CLoE-&o}Թ=12#Yo~k4>x>wpwҨA^6a/N1u348;|ԒDV;FE9fg=+)2M;ipmL 9'Bw.P*=`dϱ лIJIZ*~qwU@:*p&Q#P9wQg)ׇQHN*RbzCO͎fCwHCLfFX)ZjkEFzN*[6nXoPiHTIS'Nonյhۂ.11&JT'KUޗHG̙m:z:3GL6zȇ,&C!]xW;,qAN !~1%wś=Jy]mKjDF,H*HHf*UMdgsPw6jBMo/;4Swdl?rv\^'*ǎ}mw5jHmaQmj/Ju-bӕMkvYѸWF,Mp{O< \ǛOK!/Ɵz, G"_Sf>1lf}#H @C؍1g`qG)ZGF;C#SQנRTΞa8aaY@Ŵ8矇m57#2LF`x'n;CW6OiQmU?޿YUo]es}\N 55ãvz]<  9h(}Qf@vصB^WГ4d0D",=EC rTS95)<5f$kIs]wxGH,S d?zGqSՅxǟt<>_2fϝ5טt성:}:B!t&M/_ĄIPT$Yo}kp $>9#5gv? 6c՚5{cA_kNg"0_zϿ"z!ɤ0`G幃۰_ڍxW_2?ƼAণLAock}$EѲX 5}Iۏuvة=I1x5B LݲZ#<5ȀK`<\[_]w~O X4a+1mmҹ4)ӧ`Ȱa6r"Kz.I~>sY_E(K+JQZ^飥e_0|A>X{±qᦛoM 830򰱥wwO~?8 }wv/qoo-n1)9|bn#EזA/[ꌙ;2? VL_ j n/7/=^pZS J>{]+\K/}\}cƏ3xRl7mʚj fz({56i#>xP3CTb4:;P=p6RCc[Bi('x"=\oe_nFQkyn6ޞx)\bvgqʩ'a┉:r{~ǭʟ^+|MҢ2v nF>2Z^S^[G5yWj~?Ѫ6幑#*G*rSF@8@W(]1Iէ>,D25Mu;Գ`زm+>Xsqg?Ï:БNM/]|cIfZޑG3|9GQi 0L>هE-7tpuKtGcK)[[t)8;V^7ޚw<(*7z'݃^~eKihQR{G[ocO>G~|٥(<8oz)7b+>]<؃!BL ?p,Ig T GұAQTl?Ƕ4rZQ} (J-,i9Y϶O5U rty?E(WD)5}Tj?׮f.vhFEZgR dbgG`98+0`X|cDuE`G %ej31}S)'e8s㏅g+TRF|^}98($׆DDldy$ڕMn:qN;_?0ѮO_' z7UUfm`Mw65k4 % hpQ Aɨ鷔]1=Ȯ@h vv4CߌPd8mTBUw4^A8ہm M[L/DCG;tS/]5>3`y o3NE9dS(meiȨbeX_G?n:Xqɛ PqZ<;f^Ah|E!!F`=|kTMAwOR٦{5-OR; wͽ@m~`y?Qѫ^}]PۆcF5sf$[~IGO`_Z67{E_ g~ }^z 6TNw&ifSNiSO*#;4@~ï V2TfcUx Ε>K HjhR)ޢ5d=Jj*M}HD@ތHWҚ]O%` _l=Bݣ`? d ֔7ZhF NJDNN(ٍ4D) 6|Bk]ߋ / (SkoW+Ï;]s)7] =-ݝ4˥(+6z:u&\_O1E|dF$#X?4< (w6ʏt%[)m憭F )nJCbuc[s#ZEnilj7μ)Z1%xidEsePjkp+{Vp|h;GoS.%8qqq!0m)YQ{^Թy8ʐ}O$嚾Q4Xyѿ,c#U935|TC+*{#i5tfy鼂~6ryL /`YZ'N/tEP,+)i03?~B\ÍЊ'| ,}a7ހo;+V +~Ce i⬀Q5acO˟,x}}_^s1=F\<(@!꡾Znh;M5ŏv`U޿S9WP0h4i˖-ذqYbaܸq=5}i`[͙H9fTmm)@]>@&bYc6rZ5ZX>RQ&8ՙkh!ھӨYb(ignuF0hP2g6{q5W¯|/i9SgL[gx̂=Z{|m:Ob;o㊫O ,||WQ-/+*eT덟4k77_Uۻ:QR^?|sq6_ĮZXoQ܋5W⎿iz7ͻ1u nv| 7;;bkRto$_%0IZ@`HCab؀7 a9tףbWj&QmAP#Ӕ`wA|m\Xsu ?FDk3I1}=WЋЏ7ʢK𵋿_KU~l6m1:JйsڛoM|3ZWK.ڻt"ڮfj@;|Q8Y5_neU4:@_,YX|lؼɼŠ/3_W/^}E߸lnf'`wmQ} 9SzD+6CD>Cv3=}Evto=~@}S#Icrasx.5o|ig| v?E' fEQO\z jA:ru֌DxEF߸٤̞ke}̂r6ATV՘-^ʸ%fa؊JG#3,>zfdVmV SVM> z*.B\y8= ؄'މ߅Ej`9A$%,m^T`za/R[YK4ho'Q͊v;@Uv p; #52hW^ h܌9S3OW]ctoe9gI-.mHA6:%l'o//!ŋp7\tEo"\s#T_,2mc*W{J* ^Ɖi3g"$###,0Z 2y_;t펻6~z ,$ \AkN6>5USN>>B^l4;\& EcIrUQRvg-vQ(EڊS"[Ҥ?'涧vrXgє}Iu= THWҔ%{hw}zi9oE=CP zExJGT @5hO[0C4צM#Ǡ/<"|bs9m&*\1y+1vXPU^d{=[1a$cIT֠e+(iysZzڻLKPA:Z;(Ǭ꼞735ϿK|ɔY;!CiQ)0֮ZKC>?šQ!<'?o[l%nb޹}HR&զ{%P4JhNE6`~?7jj՗Ŝ Sа(XU;諝Qd|]E9UKm]7f[j*;b.ؙ341dC?K-E[sOr6NiКm۲ЋhǞĉǝ&#Eu.,YaV}4'Ԩ[HCݣ<_'>eEsC3J%8o%߿~ɖSfiE%Əٳfc}o/z WԬZ1?T.2tE#=yFVHf{<+b0XAmbhюBh<Vv"He\{Dw['=gwv#@|vw޿߃M6/3~m:Ao>%OHIK7_}!(F&1+ ﹟WkgSdh@<ݔc8?r\yOq.}4 ^s_75g>AO=2g<;|$>vY8SpbۋC"K"˲p=qhv9fiUqḳ@4i^4OqRKX2p'ϱ>ר{=9Vn[֛i}ȶ9Piz]Q_;Mux L7sKϽX$*L6o&֙5gHbο2`xFʠ-V>6l#O5^{fb9@.H)XF7EaJ)،1knZh} 5FyU6ʝ(ϫ/~[0g!:u2Z[rYp,i<أX|)+Ԉ!Æ0K[Q#FgFf1 lټDžAj(l4* Rx^rnIƱ| Pl:R˸_ -W E E<({hj^Qt#574""OM#B}!-` $@|l}VF5Є~n;冷!.=>zu굟Kx9~_E'Iz]qi2ʎ- 'R<}D*`AoţF_g-"NB(++ޡ,8z*5cI8imDt3;5`yQVwA2G0DT^fRp9t`,k er*0fsi|8q0!ՎqGiY1u@N#F3+tbܢuخ%-ԍ0VZaW7\wݯbRa% |xWp]wֿ?581nĈزe3yd7i#؞{J?>hEXCk3zM*7QgluCZFA{dGÀ6 F6eX)T9s9{_)i}/1*ah[ZTĔ28mً Sd=>M5CֱBءzHabbPRћOG:ƥK0q`ԯ_ڍ025L} >^&/cqq$ o"iBnjA5bx3}̻1T-o'  q'ȡX;,+j&wgδ=avǮw@_@TWv #v՚4SiCz #fGGӝaȑqQ*T5B R$.r͊rԄBOiG@js;D.:HIDATҨ3iڎN'k]۸io{Q4 WLEK;w;BULS,K~P*QOg{E]px( ()u|DSG _x:DYJ*dz<>چV 5_;8qg>k_qB{4WBLcݓs_? hhP1R_+B]$^~-:p:(m1.[m-Q9i'@ mQ\C7; )]zօ0ylM==dyٯ0"1T򽓬mf;婰edilhhy.h5}(!)߽tM D1,H10-`Iu/C[GMc9(."_diFݕy^rl@y=rć-V3_N8\ <%|Bv/=I'ں0k8pmwW ?u4zRS >y:EyOxìOϿN9L=շbxo,"ut؎&d,5 /C3EG'ARډKKy\|C.G+bʄ6A/iZ2FS"//ʾ`ƉE"@`،9Cxk_Sf]iN=ugLJ{Gbؓwטu+:@w ? 1a&bbOva׈oO=H8k7_n=oCF `h;z߸ _K'.h1w6vc؈-&Mgw[Hg)y]ǙBBL7uDKO]L|EEU1ڶ3=ľPI勶B.'m UZ\ƹhSjT@03 d/>RTN>X.u P2MMWTȎԇ}ٔI%I4J[8?(\V9ot^_q3%x}Ȫo:^$f戧1V4Q./S'Ro {lN,T=fRg|ԛ[Ĉ}翃!E.tKQ :P\reױf<wʑ@W'XKb9',z}8qDs/9Sp}XmM`cV6m@>+ѾtjfM _5[Ѷqq ).gW\J#ђhM#P5s &VS@E;@N4j dw5w)fW%KJ0`@hTѴFo2PQH* {ːPҕkC*E!æEnl+c/M dVr7Qw:.h*$Ht.rdJѱt@Xm3d劵fZ1ځG9W(☣O@C]6n؂z WJgB9^7C%D/>r&O.t~z5fHrM u/.*7CU/ !v9}q6tn6 {y A}С`&xVa!7T2w?GFvG1jtvDIA䩔~/QNI8 .iF@s){=w~b&@8W "fƑ#f՗%)B #toiq Z.M,k-%EWe?BC*9t.'7ƛ<P^'?\?1lm݄AU8~9_V2 48#}c=f JYfEY!Ҳ0|EBa6Sֻ)-u|W]}9N?DsY?C}C=j7/a^]:Fl:PRtGsTq8cO|@/gy Q^s3waNI~NAf sBt$rڻnx viPi(Qeb/Ǽ |SAIq: )--'V*oL5{j}[P[.S戡KtOOMar$&&1L:ǘN!/*KNxJQ^͓ AzGF:mdc誝Yvo_ѾWEG.Mvhm[F!EHMrPMFq(]7լ}P'm<)+^~o xʟ_ іz,x9 Eyo4ڈ+TID6Zg*xvf>pD4úwiK#X r*aC1lX67 qEӲ̟O۽qdF38Ø%<m*4u)dH Z!v/wnlT%.ŦulW6#gR9nkuH ){nz6vhksOËmmhoĖ P_׀o.2_[:pǺUL-,+y,Kg6stMZ^\+bզ[[Fxr<fD+c[mC #\Jq&,[FyϤ >gۖzlXS k7 lWzޅة?DݜSg{L>S şbqeq2Q||6+˦~N  8կ/4kG̈́1p꭛iXIuӦš3'a!ظ~(۰mzĺ[q@6Ӎn=ԮbJbQjoB,BJcqF<=>u٘6y7_ĚKPSY+^֫)E4=Xg]g)궮D\-SH,8(LyCy [7" o+>Nêm҂Khgd]mϔ_uhxbS}d !$,da_ JZ Hvg̴{~M9+B]Qkxfl',Z\< c \"S~+M!wҕlsge+uLK\1_@ҕ _YcvR4 e9" ׵Կ^IfMN]оA83U!e+hցfTTTl7-C6$UhĆM1.tkDe!tnkŖoK#'ߥGFhhiG;>hi¤b;VIV+ImEyr)#}O f_Ԁۍb#CYqqDېlDX!VJ* }4JB{G&kڀz)+cmM u+=A i [h'fݺ|fFi0DJۄ'b~˥e}@Z0ร: Y֭۶Cb=LqSmXj37R.\tF>h7m9h x<ŋ|D\mu^>9k.Erh~ 裏Ƶ%Bn:5T4 Q #UnfjQYz~WyR*U.-,Jsw]ST's梈[!io"UZ\TyJ"hvʉ͞_}`122AV>WGhjذaUEa̙o5Ot{m~$CW24GyTN#XnSS)Wtt򕗗T4ڼ?9ΐUcuR13F !xO͔{_`ahM1?Ǐ7[A{j ^xӦMÊ+0k,L<'3Hz_D;YFPbcF%i܂ L 'u2&1>ׇ\N4G$nmچpU)`WN : ЇjO4)V_[?a[=fNnAJŷKS*_UG=';V'>|\\ߋOT_8GoGl=#=6ҳȐ!F_n9OѻM =Eҝ6 3[Q#;#/,Zm_eG_ARۉ.-dy>)dO6(S<%'қvaJ#X7|'p>Wջ?Ё+*he)XK{_‘SE911G 52۫u7"ncneιK3NBO &LkەFpEǞ_j u7QN|qe[` xCkkD*B2#OԨe%>&54S)E5IbL6Rri ׅpЇf*,FfQQ#Ty Xw'$5'XUQJ\ [2ƬiJD =8dG}PXh,iKPpu+1qdĺXbmiB[s7yHX[ m׵91lh T1<)^hjL_ǒYvN#~yQ|g%X_wg kkN qIfħ>!0&>E1Ha*ꂤ|i3Rclm\rY7X/f?2U;f}?zr KQXMN~9Gl}qxF_jÆ 淼?ʨFd]\hDQA'EP zt:̼X*RDH Ǻ:ة* E'_c' .*1WE?-b__&Sw7?b.$mӨ]EŞ"A6n*Mț5K\Ȧ; DMC-4m$C$+۩Is.9YZZ'Sbu T9oG!fU])ճ_ez-^zyOޱ6w}}/2!> ˿ۨ|N͗di! 3R./q@&jl'0|GwP~P'1OyLdAO\kڄxW&)O"@My &`EC3cE҉jeY!|VL=O~T4Eюy{R,Wޅt,msǑig>t7cO7ڛPcSh.4|T*qo6g]Qsxг\pB1BK*ug4HvpRIsYtS1NZN"ψGģ\Ui{A:#!5C̹4*A,[yۛMo) gT~_x#My^ =%)Yf}*\B<gMy;D^O!,2='uS𠼬yjE6v(-ن KQA+9xΙNτB~7y={ ؗWEa O:^z]EB8@M6o\nCy` | L!, {Ao'T!|.62, k(S^ݯ:g)wi<8~ʯ2Ug^:L[M^{蜮ozǾ}_b_e+c_gG'wD.|Ay}8@<#cF$*ia9r>(Zz>Xn޴c۵ c>ȡIӣNN \f;DEIY\ sMkK4Q xok߃,]H;Pf*7왐gU*@a%1@=y-ՠ:]CIXMQ̮~U,0r F{D"1}<~J쨑V+!325Nϱ=6jHΫ|{W9pcݣ穞O(*=lXeS)ih:%ѳ}- oaO)|JR}Ij3S_hݔaC􉇱Q?$8^KooO(/c9|ܱX[CB$%zU5<}ĉ朼jE몇b\ w5\P^iчȘlz(Q4cѝԳE3v CL:5Y+hN|uOk)sYHtYZ tiv9hH/6O;LF:: fdo2?4J͗EMe*@ixy@]wlIh`DCzhS^GeL5ҌPv+^F(}b >_tݲy?u'A#.#߃I?(*?a zSXBC!cәhʯ|k 6~PiV$ӥW$lчKQ9:V^cgtzFAs 5f6L-A"4|V2}i ]l6B_I=Ǟ) v|OGM uQVH"_%wԧ,S[rLS*N; _ Uޜ^pSuGԧo5lzOSjJ'mH*<(x(KZSgI6k0䅎VlY>k7~ڛQZUVkh/4 G ɺviͧc`KQDCXcUA3}Y^M#l EmٓI/GkS"[ Os4Iy'v5[^(馛FI:F8I6i) &%I4̙?OlRIĩ?Y2eڽC Ύ*N7elj Xu4L}4Z[P>d:e4&Rc((5AմVֹuae]wZlP- L Xw2mሆ|2jom3Gm lCtxfU*=z*R-TF] wv`0Ajm~O lQtWUTevR$߁>*O>Admиs*Ld׮wOﺦ w}O)||NA 44ҍk*O|]% ڀa_:l7UZ򺻻h@jkFR2442`PّP򵃤Q|" eSESy֠7D>y7 ӀΉ/٠ZG$ζ wV},\ȭu[w&{|& +#= w+QKq8[Q>h !@w$Cݴ\JuNO I7=ݿ9U0[躭ݩppҚjo1_EXv_g{waJU>~z|IQ7;fD{7!S=U?.рvJU_&bޕ~ Ci*w2<깻kޡJ‡]o'|_9p\%:([ ڴk|CYm]Sy4|痿@5 רQd;>؟f΄ i x f;*ҧ֨y7~ٶuGkftܬQP^NkTy}=t<]5ZqcSEA{;qh*/4 _}/>>+i&bQG7W\Sc֌x'k͕R)1V3DK4`@څ1x+Kw(OSx)#&\^U` 1>7^Uǔ<+ GMyר6~k{CKV.>s%_6L2(* p*Dӟt*Q灋Jh ťEhnDU{j/!Xs9 1ެԡ%dI|oS9 y"Wz2pwzN:y2t^N4"j_;"\-,vhP}aΙg`mp{XbA僧ڎ˗GOJ.еˇ O!T-0YxPAp2846;Gβ-UF~qdy|:%ֳŴij#>Sc}(ތ.!ԐCXu+ձA=|fr(ձ;y7VysԖ#/l6=_7zvTv" ?un/ޙz.B 2\+}v?n=+~K'u}ODڻ=iC҃z^o:_v{{_,R꼨QoW/Txc+qgU/SF]W?$[_)s4b?D9N@m>d:~t he{Gߡx1`ĈmExkHk'Bi:h,&<( ;kUs;jtW`0#j]!2EFk12ȃ~l|gz~fy:{Dl8E.Fd);f~WA?5k7m1cдgLgMU&uŏ07~Gz0l"]hrgюjh*$ЕJ>P!k~=wMrg;xrv>]ױ<*ϜMzO۟cγ\yx*@gEi`^ _@s=9DrچJpG@"/ /KPKr.* P`j~Y3 orvGדc X:JCA93y exH {m`yL=x28FY:P9j4ѰJr=ޞ[{4H03A7rB;EZyA/JJk| VO/7M3I;ڢ{?S-ᝡg Juz/~96יX+yS͟\Ti\ױc]\`$l4޺w4_3Inꠡqv('-Pi)DD!s2~%|fO*T}cLq?tU_>\o|z6?2˩X~}}7g|9ok 8ί6mϯgxq!};__};ǻKw:s}}z*nGӾ.nIM>ԢI _Y~W=\Mg:NG=ǻ`;1z[_>O8E4DPf& F Y3-)-RiJv;[WyOє,s8|Dӕ 剺fߞ[u]l/r"4w#!;˒/뜧'ǝ`IK$(*(QP?P g@QD@DE a䙞9}_>w; zU9NsnݺM)[8J`jPXv;ߖZ$J1?@# ).?M9ˣ,ɳ8Cޭ[㢋65XpoC>vPebo7|]?o6Ύ͗\b?km#n>vI76"?gמoW^b.J#nq4@wTDm: NmlXʎ8>Ͻ>|{6QXUq<7(.6,'|9>as o3FWbY99x>˧7y_j߾}aEǷ~4rH8PTQ^2aDS8ˆ5l4oxfcUF5۷b+XIz,iUŭj,kzFy).S@Ow7n'Sij2CJqHq ZkMͧv|rqYWT<ڤN"D[( ngb!\pvJpֵڏHӧ' l9j `$+x5.[+Kei9-Eƚ.~WyxN' 6\Jfec3W٬]([^J] 6L#+Q)Ԕ'A[%P"O5.,q5 Ot-ӯtaA(4I5Y>qoO\Ul0esaaşjGp;HpW~Ex*Z%f/lF24[QLQSxq%DAEcUG +G.t eKޞ.`~a"ZGBe,+l\+KQ$h}Y]=œUK6^*mdn֦%o\)/y`뼒P-kᵭ\>yU~PEPB~,++ŚW_TQpr1aWp;:SVO? %W8MNky@<+\!irެVzQ?z}]Gy:ʟh[i^ 6q`+{OeO9b;.#˫6j&iؔ\xU@@L̃L.~s#zp טGK@~y>|#fVp ^|rHx=YO/8uqV<VH'4?[uF>hdyI)Y{ߠ%/[[v;Uǽ6ŏ}8َ-}z/Фnw1-}O_sLj-΃HȒ/GN>Q|"9|Ǜ876)ۜT:m)lΨAJd\zno+N% j Bə TVB"8sv_ɧj!ʸF]#߮p#DyN! lh̙`;~&x-QxG l33 I;Ϋx?.ib䇭4t: U4M]h y\ y+`8y9.+@J%eDkFȱoLD"%QRx %)xksJa|{Ӟd/}KExE} LjM%㳁LJuf2xi̫+JV|8>z?Cy^ oKណ}LxBd=a R1.y8T?m}l`υm6^m<ӹLspHׅV~oZlۦ)z?~&n 2IxGu(B.XC3*ȷqxHb8  ~֌ÉbE; ?Ԏz\)(xЮc_Mᕠ'^e=ؒ@T & pۿw6kMLɱ@a3Wf=~^?W G]W ]n 3xP#}WeC9ڡ} M{k/CX)C mP2}R~vNM;ȣRjpU4q=~tR41iiaFI4k_5Ņh&Xӵ;y^M:gƭMz(ؔ(u{%sVoG?ڶov<uW|Ֆ`NNYxOx+rӯ>qֿaKv4ͿgYj%&57ugd5A4x_>1:2ꏢ%&߷$xYOx]wgY(Up`}sJ^^J{guv_gZY{=ϳ<7ض{o?`W =ut_|~C+*r:. ww?>s]7!Ć7f!TXa N 5bfت=^?fVVBMIxh|7*AkMIú fȺ(x $ 5 9i5 S^tI{2IM"$.z•nMic3m{[)h$L/*Ў.‚iPAz-C^'X J3=8^K󗆘`\!T)L}bhwFjӿ~qφ ??N>"lOLj`XHJY [HDjxW%W;Kf!6S6qF4&uZ=jBM3ejT/?)贮K.;OX'D]E^h(HJ4ɶK5)9abE9ojDеwcgMV CWUR|ቅ0~NӸƥWG!߲oRj\\NkXF'hD@?\,~jܱP+[)ɡ 購bv-673D5ƀT@a?jEMW gЬֲ8+t.zaϖ X;3Om+T>gkJZ_N=CKX +9Z%k'|VMk,}UEf|Z/[ 65m\-tۡ¼U+M Hj:\?AYm_em҅WB͖lX›jm 5Gzf5,'[P>jOǻ* %jKj(\-`P{')v.m~]/=k=:mISՖ>ϳ=ֱg=~Ϟ.{>`vl?hi)>dzS_ӏԔmK {/>KjC{o6dN|:,pGFޟꪫ}:P&^uz^f7xcXm&|P?&%E( ڰu6sF .r ߙnX^Nbҧ'g@!B>)|"jty;q4 |ᇑ NQc{LiǏ81b0TLZmA*Ga>i}-2CR^4_׋OL,WcʁIĤ0 `ui~q%)BVߥGz~^-9tC>~_Ec=c5!T57IK6MX9yˊAdpIs>@ ]9E|rt{DgKaI/wȴW=^E,2YJuK+f5ds[LLZd ?r/԰D;-hl~6l]--z;tV絜h|4t'%I_ÃN;ؐ|{S~yZ2z&Ĥ8ߎ㎘4' >q1 ;懪DLC_I+RQx&}8D7QlZGP:I}6戧uū~/GL b`&b᤬ײbLOWQH>iW_Y]rWUә/Aл1gݯ 4ȧK~s[.+9J.׾0Vح>!&DZeciOׂO=')ܥ1V?ׅX%'Q(Ft%NK3 ޜM覦5MggMM)Naa=ɫ-+C2`3i7mG[kX:T\?L1laӱl8L=թq*^驻upBܒ^~ϓjzSY,Ni_~__jhW\b׾u+/xn{_b߲=[o}S8c/naǽW<1>~ z,=vpzp]qU>~o$`Zr? 53nڰ3|!-Hw9*!pH#N<V7Za_iW6CUA!&M+K q4,ZJ=Z0:rqMb^~;{>r/QzI(Sɉ~7[2<tJƓʰPS_^19:p u&iwI/''KGcBBB QpXReAv. j*mUWڳzndűbȿ~ל_Ņ"'qP~xZ^l ;j~׽Z3Ilo ')[f'I|1E5^+13m0''>O\&nL| 4Y}pQJ9uՐ'Z,?;+W%Njj|A ;Nױh67.?&O&8ʇb/3bnuR9{4Mmbv:;1j~Jr~Т a~|վ8z˵Kkգ 'N~/3}|-]>5_/s>6+hntU&~ l[YK= z6-bqĆ.Ǽ~vYE O/@I6XP8޽{m|̔if,O[PXI*de)\sjV9z^_ Z4N1& ۧPr"DU` äHUq^Q82I@ATbeu5g/J;G] //|^t#M>1~5N?"~֕yl`N.B_ptr|rTo9G'Vva,^=1G~  wI)D6)\p>?pO=‡hx-[bᕣUBUN7<UrBMXШ #o~y>W ϴZ}gX ;(C /uv%\T4;\O~0nYR&RZܬф\zcDwv#KdB0 SBd ݆@[48Wg۹DR8(dbO/wid?#K%y/ԅ^~{]"ϯP^UZW>;J>gxr1Vҫ'^}K_ .q3G4['Y _1QiׄFģ/Nk ,X^~MBos8䈅<1ϨOm`,1|:^ga]sz/i[wW{n:J/6@[1+qH&i[^<}#cDՋ*'{~Ί_{JɲK~6+H|OQHpv`9ykleg>)K/b ;YXg=홿dO؞K.[~{^j[c=2{/>bߺ>o{osׂzmSI;ؿ}607m-} zi{7hey:bGM֮WY 5E>P-v}wYM# }8mK\x 5/D̹5#N]wOx݉ylirCDMv;*rD,XJH yR)+ >lmt$'/tXjPWx @:^ЅY M ŋ4e0TdMd|VLCKkO_)^>gxx& 41zĎ;ܥ@KP;Qw899bp|/$00+<À3 ~ MX6|.8g(R6/EU'K--'7ÎLR^('6 ڂV,U+bKZ\`MT^ |7PքDn5SJs&RqL929F5% c&vlZr|!8lﳹ 26Z!p b'KyU/k lމKXqoL&D9%ɪdM|FV5jj6\.DiڃEQr ?m]_xiftB1fI(M,Y Fiz].=E 9x1y]wW,ysne\qVv;T\`]tcU}^od/]S>TĕΦî!h v ˩\hmvnN[dЗ!-ͭV-ׂ,sZy͙R8M6Wye-Ubv%T) *$9?HÄ3RMe[eO|xF4"v1.$++#`l֜ #u~*1.YO~C00ׄ#~Q _Ίx3։~bw[^p?_~o])v%WMMIVT$Rch(߮`AɊ$TUr/F),=,N$rW7Ǒ[AǗ՘OE3AUes fͥSIUYyһ}m-j>(Z( S"M0dת iT};Xn|T*:3m+RS3v__5no}o?>[W7n|z}o7چz}6پDoѾg\{}%/|/mp`9M%qKr5he4\4akq$[TQ:wEZ| hFCwݛ\,6jBQd:tMOȾ؎mۭR*M%wr;cvVoXթV'v`dg1iR*lx3NjEmD4i#)uh'qOvpy_G|r JP<N*Ac6!oim_̘@`X DsLNX[ں>[[X~ՠ3u X~`SCaftn6鵙9ֶ˵پGm-Ec*C9lN!a36ffOcX:ڃ3Ƹ™j(U$PLyW (C^b,2^4YXd$Lu ='PXkEG ҝ<xPKס_ʚ]Q'9 CZ9"LNes>Gɺx~Er?m!Jw(?LCB_хo/xlr-_kXt q 1b D&m$ǘOO$iZr6>=mt&ffDm.z Mrvrl&ewe/SMrJg kMf<K@C\[{UtAԴb̊L~jFrԔttٱamw J*|h\sx mfQML^s1[a]=$ČlIX^`QN1_ _Ppi.$ΦE.X\Dfn{ 1" #)nqIO&aKyM=y|XGdY<-NO&pksQWb,^,Tt#j*\шӚ3RƖr:͗Kz=W)[ZB4 F~*T=j>WR:5_kW^.Y`mܗ8~Stj6 12m㗂42V <GWHspUv/@dGkṔ·yE> @c.\ԣ?w|8J*Ici]W\2`*V=ٿbz׾b>~PגS8'ܺg]vr Ӧvbrܦ%=6%9,-i-6S/ZgRV2ֽaRM?Ik9I9(7Z{** E\Dܒ9٬n 䩱q An"c!X9 'Fw"'s= %;zaAv|8wkuWb5fkC8Y,ؘ.gunhTRֺNO[Bdx823my騡v{lGm*[y=7ab&%}>;hYbA %}ٕWن-[WOnfT|T;[lq{oMY9܄es-"-v(&!*'DǔrNDc! ^h )gQa}>ܦ?E>۹` ˅hd>@>Hq3aG[ sJϦ'^z\K^znV|K_2Kȫ\#|jR=;21j'榭$G6uZ6lτSX\md&>8΍%z^^Z@W+0^?t<<.'eϵ 0P3uŸjTMs/x,.8ݻ ,7p\QGqr1 H{cQgXngL}c<\>~ 86m lc*K|@_OW$zgSW,bA3S*POIQ 6Etɦ/҄nԨ5_:pG@AUKid!e$V&-b c:{~OW6oz-#-L=]6 9;9=%lvw򸕒qڼ-l;Jq)TuXSYs742|]U8DZscR(c_`e93Պ8ڙ8 ƫOr~|Ql3^\^\(>UMNww>ּH!`.7n#+/6>a~Ȟs]=}aB8U.ѩIu[{7=`-}ֿiv֬w%ۻlt$YbU{6 ƀ2 g vjjlFs6laL.<4ݻlNt); {ݷi ٰ; udvަ4m6&B%,g/Ok_3D_ܮ`{ t*zùlXa9}~s1gOO3A/9_$6[_LD|2 p$]6Y.,-ȠŰ|qލ`Iݝ ϵܽ3T\"wp֖ts]<4 cQWANV{3? =k,줙\CIsQ&y_C a*r0bᆯi8, EdV_@!ȣnTfh'6 b,|^[eKx7~`y֯nMr*g;5oym;<2j\ ^ho>ozǸ}~[kկ?~۟KLci{b~{/z^~T{}+lǥHk<)'?28cSVMâ+gE}^s^;a.9Y{o=?>I+ ,4vq"oRs=Dy࿗8_ù&O"+5.$Eyʏ77㸙29hcs|>^}xxGo{}s_ٯ?v|z*^tk_ko|uw.`S\c){h;.ʲȹioz׻~{g63v2{;m6idjYy];D`.k[?`}KO>O=`7N E;c/}իUox U5XҶn&4h&&i~rsס\>˃؟ =Dj|v\s\1c ,JTRDE3I Aw1f_ZW8,t+X__+~[+n6_eV+5xsg>X#(Sq{9K>C,ל6]4b!|̉uh y?99iG 0lqưCʔa.vP4wѐu;CX N7Y>vZFP9w=mossl;p}߲ {_lxE\eٟ9Mr'r?ɿȰ5>W^mbN׼浶{‹g[p>ώ?noxa؝6V)بUl>:6o҄MMأ3+lRz6#Sݞa[Z֍}r]9?־m?MLN_a\0FXavppML2=Ct{u>(HFm/z|8wCBm&k+J4]K%f=]vbjҾy f׾i~/}f{o[>٧^B{dwN*}szi1˫{埾[߰?Wݱ/},kmm߾&_~ݝfJ:~<ֹn:dbvrԶax>Ogv}^?gu{d_ַ{}{߳(yu۾gwp/۔?}V*o\zZ.cs#l.ƾ-6W)کtq^J4ђSSֻq]>+}i3?ZzlVg>_ gۺ8 #bv@&\y#H/pE;ψ)Zt*{.](*I\{gAvߴW;d__o6sE75/_}뮽6Jw^wl꯬"ٷqԧؘ'.*O]tؓl~>:gcc`WWgyϛ>+Xh'Yw}} wO~Yb_ҿ;{WJҫ8 {S1χ"MA.\C]z9?Bw&]aLJWaQzN^ X<#F8YɪVE]%kujZJ Ҝ)aKN|60sQ]U 54  ?F2.|iÆ a .% M+ai,ʐ" @i!|2 pC "޼ ߼6,jIqϖ/ ߒ/HaMv:gsR\^~o~׮{g/>&@6 6tLN5_ |ʌ`9u9Uou-7ّ-IC OZ%' d~.K4\('Or;ٴkں;mxbL^i7mȫ/=WE/{o7Ica'NY6|zp%ՖlEծo^kܕk\r󣼐 *9A6&^-E^(6] ծruu!g19^zy`.9v-Y+,B#dy?]gy:k\8rV~dlZ9s 8C.-|p4SO5Oe~=O$jl͖l8'GO 跮=]Wd;%a;9>঍v n ZL҉F,]K5gK.Vf{inKq :}WۏӵVXN:۰VXΏӅd΃|& F2P|K jDryfR3giy9))|xF(5%؝v@#%k_=+ԧ|4KoӱF!oSѝcv+5++ԜJjeHw%m26y-hnMjZAaQFjݺ}[+]Zծ}\X2e{TR~p_(d2'1$|yt_cQ3GGG-J4Թ%mZ T&C;v@`7@] @y{r:V7gbZ(xPy{{}}ﳯIK'%;\,z-W'z-WZ\r-3z-W\^Q^(o%ʜ6#wb ;WkvsW ؞bR~/dPzXI윍8a]qI1>g&]4>2*Xζɹw{ы^`-= ǏY\VK%635)61=a'npæ>ik7yپͯ[Ggf%et*lXc@Ԇ$z5-^߼\\r-3z-W'z-WrՍ[Dc=ЭnH.؝ Qw5`4fbhrP07x,`{V\`EBB]e5{$f9xVns 7>q}ab:H&c!f9[Bʂ.=vB[W/g%"91_. V56?ŗ-,Ygے媵JCb ͋TWn2Y.J}RR=r1E]`XsX6k1ͻ%;59iUj%b*xN(! ,7͕c-'#LO,˰<6>6ʰ8b N $(rDC8(2WP^Ɖv·s3$el"v;?m=嗞imnf}o՗]f syiRҝk _B3du}_kk6S{UhAv×n69m/a!?DvkKEԜ=G>]c>ʄPgJk:c{oZ{3~7#``VM VX·aDO.{^w 7_r}ҵ\r-3z-W\߱I d V4wiX.oiXuOt">2,n3Q\7: Wn8&#H8lGzM?e+.ۣ3ֿkovXezkv%۵o}%Ect˒˙Ykŧ]Lw]{:$~Ϸ^roWjhNŧ<һ\s;yȨ=]s]tf|97v2+{4yޮUv16͖eJ~L6t5Kb !3q~SbT?mc Y} gj?!Ώ"ݿ³{t<#6hr gagy\W*!?K[iAW-ĤC1ykgwU4%V^ӥsd7બhh>sE_R՚u-hn!#-Ǭ39K9k,OXȗ,5[bݺs5 \^jk$J++;.w_k\\mbwtzEc-N[&nk8NyqfaqwW!S6 2;CY^AaśQaSSSaæMI/A:l)KxUjKMĭpjn/ZZoƑύÝ_0 tW{U%aH^$t*WJ6_|ѮWK/==Pnc˿Ic{n'<'>Ɏ~>qkiYG2mϯXqzz9nzK vg|3o'#v+MLۣh{?ݲM8hҿȡ#l_zv>w}l?624$gsMڷu>rЇӞ‹믷?{,V.}/^=6dzSxrZ ]?{-3zo?ѡ|zP199f[6G=깖?q۸iR 8G&FFV)z-W\^չ+8p 7ݞ###6~{&3Zb cV-Z<t-Hx2'7~A;$]΢,<\;_u4z_ #(⍨nsr [Z[Ybj}svCb_㧬<;kCGأ({nxғ>OZo|˖97fַ5l?/?s?XRwjTG>:ma}_Oh'ڥi;$[}n ⬼g=tK>..X'{P(,oOZ2RijR:ҹRXZO8lKP#lQX@$?;ΊMMY 4ƍw6>6t I>^)_˾agJgOwPcl9L8_f-6#;ڜo- MP*}."{ c/٩'ٔ~_kOptdg;:lv]~-{ Xx*mM˖PR.䭢qH%_&GX d5{+wφa5ɩ1MccftJnMXJҬf;UZʋe|MH2 7x=A Ζ?[4/a^iш[f7>]ir[.J&}u﵁GFc;Bc+]NOrp=/JMKTժ $WHmmj"eb-gm|޾u]J=OXZt׊|:Ѹ͙<`^[a|!f7ݼ϶lnzա$s< icP]|`4|ӟeel~a}*r>A>jss8׍ÄvcGP.ltr 5dS1k󅚲 +m2jߋ^jbJXU` gkhpXc c5]U,XmN%ݤOMچ~uwbzzziة:9UqjK{d]5vtnҊvɸ.'rbl.ڴƏJdd֒Rj"jZ͠QXk@enT֠Y:8i3J.JȱC֚mY9tx811iJzz U1g=7ge+%kmX BmJ*{ܜ z˂OqT?,`aRbM۽Ps6Owφ3[)KVZ)77ۼos%j̙t{[+C#zu0nA>&M"9%ќBŎ:d˛Žfz +O_X?] a-W gBKw5&txy۠z؎G=jv!ˤs?8B وlqpP::n/sҞZLUm8˝>8$%Wo[n{ڔl2D^ /05mvnr:36i&l.?c= L<-&IfepfvѶ=V֞nRfy nN;mozrR ]61>erz9 c]btrrR-asXq￵==~ỹZiE#xLWPe}˶fAу;pBΖ(-^ 5Gm۶d^ ;ll "Mykl[=pu!bdx+O|!nML暲6%1~v뗎$8/_MN 5ex-ג=˟Woc2ʃ2I 4iIr=?bjlUTCs|bRKkxAt ص6*ݵ%׮Ind2qʹRqӤR =Q&tkccvʱkŠX! L{&|Uפ[~&@)XY:Nک\`6;|~G4fWC<Ѥ _1o1YM5|Zw5}O==~{64dLjjEq2g'*|%afJ&",԰'|np{!{`sEx&M}#jbkZ1MZY0S?2-6PZJBm?;gm[.yX1){Iv#s#է<#>jjrkM[lvb5ud^<ܱbbV+98Xz5wjvm}֝Linѩv~ x֒J=xWcv+.ˁ3EtYWXzvvI>~*Kgg˯.%6 5! (^)K[+`OGy=o*xø>7^җLG>NB_ 5(hh׮]~sk"ݞm|Θ8hj3T화x}w^ii+%N[]V ki*3鈳 kA_ː~lCuէT6BL"5Uuw勒ζaiv>5\G&#Tsqw"9U ƷUlXL)rD,?t򘆰٥vفMX^2]ĭTkXZ`[WX0\KљQu<<ߙ2@ a2HO `:a7*VjEsol'~x>m 9-qBR>)UlC_xX GRZPU&mpv[ ָU@} C ܕW^iup&.x5Ԍgtj2_' QUKd %4ܱgfr,oeZYMr~gُs=52"IC!IٺdY&h d[6;H]/´mv.K,tONg)9kmsoLv*{ BGfb=669.-n ؆C+e> 5<$Lɟ}vX^:aр^(c +8RɘUJŰ5dFjelOnݰaCxgyb/lrk-H]pKĤ gDEۛx+G rll֜WVUֲ_[j`TgIjy֒OteVZ"+u#acoi鳹͡$cXNY_k%I;>;llD` pℵ&w\ǩ8OW7i4WPogR~i֭UMZI]H%VFj,a&OH>ؕI?{u3_˛5'v"O[ 5Vv걓fVܞXQ@aP?uؖd 3vO1Ue1:mwklvx$2=>fYMx 䓆O3)!GE\f +a(>X冑A< >@Y `ŸM7yVgOY,q.ILJ':ssv pic@=x\kl@p\Giו xB|קu'sq@{L,x<|+`{Ɠ\?|!âW= u(6OLVakG%@U`50VHsgm K&rm Mڛj4Q~siry.= ^_4ROm-˧#σ!OCo~|d$/G ~+ 8 %p9o_W_u69!L[E440Ρw=H hW`+|m{B=~Gi^=[WC\@9ڤm !; Ti?@7p}x@2ݔGI܇6~+ < ,d!*EL|`XB6^DrSl pnGLĂsLyهR`9|q^5I^o_שּׂ3;#<oI}Cߔ L >GOrp%_]V!P|'|O370=8sQy~Cs>S|Is>QQ6}jc<|]Xqd'Oӽ?W|99fRۘD$]ݔ}FEc%!#blrM"ۛxZ<^OlwhSrj͹xE o| B>ïS~w!aR ڇfC8/'&MtT.!DG][.1whop_OLJz\{A)ϸV?@?EO?9w_Qy>Ggڅ-bu . ~_LVR]`V|X[Ka&glNzl#kӄ)) >7_[ڿ<@y(ioN:\ 48^*?hZ܇.Gj >NK qn&|B;.TJ^TdrtOG{8[lljZVK{|*cxÇ>s͖km gIo@ {\ #\|`C̑v9FGGfn.;ڻC;^?5dr۷c?RTͣe@aaDQBe% ^o[*5;%e:m~zyPAhR"Pt0^"-'C^(W(!SB> `Q5IVX7:IJBh@ѝ ɂi%FP#L|< W<BuuC~EZ+[s%}* θ\ʟ]I^#A[|aA7 ZS~t2!}wBOb3NgC?_*]dv{?:C}4'!~xAI\' \x1iW@r]YC/r?&tSzNgYabbŤSB1NgfB~}?3Qo\ڇOQ#tp t!Gг f| >GWW_zCҌ+iPv?dgOtS'st}ࡧi>i:~_\Q8_O=bM9o}n/= }]4rO|w޿{3v4|9 <^ŊG8 {.B7ps8Ѕ?O~KiNba74|Cy[/|⇽/!?å.-*7_/ڿETnA ~޿_#y?4/ɵ2Iʝv~˛Dly& ݋nJt F?sN2LP|ʐF<;L{F>.l{BB!6->yz8~q) _>i KpiIS4G<9Ќ $^C9yLA[K'M~ix.>t4X@Qhx (MD;G[?Q܇NqE# ~si9:n^O% 0G)S4xE_6Yx[ޟ#շ-P9o6A4!w^ٸWqH# 5A^P@$,CW!d+1:àrrSō>z%C䊞rP6Kpd EnQZ1OXt}8AY&Xdj,0U_mޘc <HwCݐ@OICO #sv 88q|Xh T_P 2zE9IvKLy)E>|p~?wi}rӞPvio8\v?&x褜3/8vSy+QHQ>*)Gy]giJ9>>>+/8=a4$x,w8D +NQ:&gw/16;4*Z[lfk  D`0Xa0*7< `[&ԣ)ާ-w,톊@=.!D;q08@~GY7fa %ip&F4[zr/g򢆝vݸRu.<wXȧ8sx*J9.4<hiS<.8M}< LxL7'~)rNTj =r8d ?z4qNTю 8O9ҌG쇏_#QF#{7gE{@>q?vr<p|7bEfsc~1w;~Liwu~>qt|}G>i`@<|.t~GoQ= _|r ~oBnh9t)O|S>Pqy.C7}Ҏp__-iWtr81%^@>K=ڡ?/qhpH{4pi>{;4\?4~ 8ӐyAk[.X*ypSoy/KQ}EߢI"]w=@k*O!v=̪mۉE }i`a+7p&e6>QIRz!s[DF"v Nhmp܎Sm'yi{Q s)tQ\)Ce(K9m~4O.ivŏ|6XA \h20G`uiꑦ:Q@R@;iQ8/)lye˺i~Gr X4hH7p'OISߌO-CԤzy c7)A ieʂK\TRP8Eħ2nd<+}Y))mNlNɱuXZ|_Ñ(P @9YYOMTK:594CiboU@G=ܥMSd;;ݤſ|4ݝ.<vg\VI6O /w)~ ~# sr>OM ?C_nh; >px}b#Q|wRR< ~t'pg)G(G?OLy?;NG:~Gw~.i3V_[g{_En۔R? I,iO_6̕N%5d{tnX2aݘTyr 1D3vvF=``d0nIS]p1BAp*8.& t3ܞGqԣ4F_v.=JP@pݤsh3  #?}KG.}DΨ(~I^o H;(v4=膯8nxx!^C}@l\/R|6^'K#&M~x %@6DKrzt}\3 ÛRi >Q<ڥmQn) # LDž:MO/n|?`9~l\QC=p-.Q.<#>ԡi8~Noµ)fmp~p/0/#ǔ!M[O{ tҎGܠ6I'?R6ix?G ]? ^,`|5|:[uh4pIs:~}!84/zыNXT+ݠC 7`a lkK@82Y)Q|]509sWbYTŲ+o!d\FJX Z1)B'HN `VAyXREL&IpIu>VQզZMxf+ ._ H5n2JrSL+ɹtQ/lE55NWR__H5 Ԥ5eQu%ݜrh#kC§brD  ]5*<_6/e=~lL6>fYs U5nȁ_%}K| #.BUzԧ~.>O/9%d U"çRLi)-+_\G9G.%GNwѰH7堛zep򔣿 x.ǡ?ԟ?E/IM[*o!O/ʱn/\"Mz y)~f4|O 6 |41I;~E~|[_ϔX'ZX̓àڏo?ᷔK;3N%^i7t' L+գ~!pZ7UnSu F -0[1bNeQUt+!(~TAU #<14:y1Bt~ԡ!L Fs@Dʸ3Fiozp-lmpPǝwtZA|+=bܢH3\﻾vƸA z 'ㆴ;ƇƐq?vho8^L;Ƴoʣx EOzzI;+ו)@O%[>tA'Ao^j w譆kԧzCaIӀ+/hcQ=_4>/~8ݤ8O;p=4z Љ\G~!G= r% @򀽢@{#t?iqv 7hv9I#o8/|9-'G=|cxpg?$5 ?y 0~U~Rvkimi)(:~p ?ʓ}.~~:^y|U4[6ouօxz /{{g0F(M5gCzjf4р[1)iMBT&'G}VDU0 IgYbŐ,d&Gr0THő-ld#pHee)r[*)|>[>[ْI2559\eh_H/|O~s s|HC/D60( yEpO186ibp lh 1i1Q}rC_wX|d<_}![=8t|^E_"'͸38q}zܨb93>}|)v}|?wCws-GOK9K|Sn/ >Nї7;篬GGW3B++7WK\pX ~h8O.>%v|Cܧ9~hOMSpN ?49K~Po Y:~tgg% ||A_~8iOO_ A{س(g8ޟO=/p= >^>п~0tEikP Ft|wo"Q0%{łƌҼa<@Wh&tt:H~B~|#r sM=ZpxN;ܦ|We}'>v'h.hi 1vC;\:~yYqi%a)u Qwas82m:\.GQӧw~/G w].2E\wP/m.44п]igiC@/Pށ7|p((bpGg@\ h$64^Au:i&e:/pɏ\/٧,8sѮ/uQC p |||/pLj8՚ W\q}7,1ܳDP$B|QdOH1!|2bƧ)3#`+z6 IݠIi[V+`IA(t +A (iあǀaph|NÕ!Bu8c }1ce@!n>0z?r-Sz4a >`~R .CM;Oz|ʓ87(Aiԧ]b%bA;0Ec@;>.ph|C7I?M{w>8_ڿ<ڡNr#MywqhvHsπi p?^.@G= !_?Q/. \8ޏ#~˟ K O=aN)Ψ1vVKq5k,Ip+ J@\tZRiÁ!@ềA7ǰU{ɤ'Uޝ`X0A.m.p00V;v4pO=`8~Cb6:%o;}ڦpIS?-p MYߴE= *xHyo;,=򛶀|Ky|'?  sq.\ƻ+q@~<#>GL份`|0|BDc|/J i#\4x?'<(O{Ĵ8Df&xNԧ}ϴOHCi(O>1sx#?}4`==>Np/z3ɇŇznIz.ioE_O!?DOypv(]\BP/_ڿvAE|vh|Gy{=bo:_  G>:[#QE?GtSG=D?K;_'|6{M=&}$Mn~Nn; tS2G(~zyGyʐř< }Q.0"m#p(lh"&p|$Leme/σ0@[\; w}:v??rK?`P/ڟOEb(缡,pഓ\TIp:QVǏtuM6u簁Ii'X<.ʓL広rC ȁ׽uo_P.tJH9PCovCđ#G ԋ.ȞΨs0ezv* +QD!27ip Դv[O'gFȈ+=W@o27osڜ^hr|kaY,"A$+\!.#ym/l|lcgOeSiUM~x%F'ƭ/X%gL㓌|5dçg΀ߩ p|vmΊrRɐLSL7;k_ǜ8\V.>Ͷצ_|ҷ-əijt,H 3.tu@WO 6=W_0>5isC'O@?G;Ĵ6&ܟ/}Ym!;Nz AJ35>a|j|8% wM?i &MK G~olx$_]3$1??ڃ]AT41tO/[[gG'W!7|4 t/OhopC>|_bͭ-?v7*S(KpiC??G|+66 ~R>w#nK>rrmdSЉ^ tKRȡ <WYd}e~èw\ בٰaB#7z rx!cg+Q dtzBJ7I<=Wo}E1\v)f|`^AKE guKQ=Di/vᢇ;?~dH㿐.G'8뤡>E_~ }??P#MU/^n_.B' >oʹ.oG ~H]ȟE'C 7.'4>o>v:c992ނ52^I>ISgwnI>r ?b.+|$|F71tR!M}4f\я_޿w8X?.#>~t >|eX(h#A_ ;:ߔ!TV6ꤱ^>phgb<`=4{pp0pHM`61u˸pFp^e}ڡ ߼qԩ O= :A2Ic& izw! ;h p}uC{N7uȣ2|IC4叾_r k_~6Ƀg@ ~68O}  z G=Ҽ}x>޿QxA?H/F(C i}Gy ЄHi` py>q ܇2}y:bRuXw 0 B 8bHaRtv_OVm;蘝=i A@#tӭ7  x9XC13'-;vؼ [6uC;Ǐӓ@3le[+Z5ߒ9N)S'N|9o۴e֡âl-"q\pjFdƘ4N@fm(C2 ;l鰁uuǭIxQC蘲]ygESKR|mnMu![wzbI~kld*V4|/J/G e5A{'dK%8ɂdf1˩FdžXH)! tZo rbkcǏrҒmݰ%Lw|fšY۵+QmB{-_kkip^_OOibSYOYDn&ڏ-[GOww&9ã#vj>nwmۡߌF!]%9ɱSYFr֩O‚+pk )900HD& A4i}п<ʦtΕmw5CހnJَ];5|s˦Fn'Mwuwvyu9A9ߑ@ )Pe< Yj|)oC993rxغ}tX;;s Xq65/SoàMS'%f6n CwQgՇ2$(l¨WIlu`ذ#A\1<+q`)sĉ y¹X`tУ|7LAN]`>娃FC[t;Qe۶m . tp \*c BF k >~Pw^pq0Z8R|O_#F8_'a肟Mp:C [n :y'Ʌn``'y&~p}h'5oZ4iK%y6lL^>f|s**Վ;72ŸB/yP¸C0~7ovya/E Eo}<'p۾[^@&禬% qx\.mgjP.4;>Is8\G_jjCϣcҤ=AaOc0}d 4S㲝m~ㆠ_;{</= '8=}~zz>#-۶~@d[֯"p(U~AoCt^:Qv8%C$~uw`׉cG$;Zcݻ :T6 nl48$sxTg]}/`O1X?冇r,z[5q?zH{"/7LJՄѥ^|H%ҁ&r \~_~~qTdI6>y*qAQ8;|H۹}`!țewqڽ{O{9ǀ{|\I|vtpl_G>۷txM*~]C0^\;1%O Lh9(yx`|{? tv > Jc ϳ=_Eg]dd]}cI>:݋}!l$!X6[}ܳg). {~c1"1QLcϱBl-Cvp| \dG?xl&y.hށ?7ye>صkWK;Qѯ/ r D[O>3y_QxO|%.G?p >Euh^_\|;PzM;}M?@˥^4x#"x\}`SB??|0 y[+s?d4[)urĐ%I9"swD$wa18,/OX0K/Gn:;ЁMȪpL@p$sNBΓ> N#'gofFLtJFӪA}L5^a$G‹spi„s|wx6M4ciZmC'CC,.].=r‘7x Hɷú;W[Od씜\&}2,cC\O2p0< 'L X 9$>d [5nդ]0`0(~ ;+a|b(1?ѕqgcI1ܹ!`Xp9r'-?w0񶸇HxH} C 0MGup0p 8_)~gLGGnx?^HxJ=>-{o 9~/<.?鏬RFƾOOq֯؋BMAnFOrS |lS =>2w oe+)c YR4`oy\kF}{υuB}E^;d1 ?&"a׎lس]w|J3y쐎bN=C1=$n,Ҵ~S}O/?z[cԓQ0;<>jejsbiS=?_LM'_Zr{&^8egC?;%+y8;)L2݄'wɽ ÏANeO!Xx'm/9nvBt+[;/1~ctm G/r ~UMp7 'Qq_^E?0wF__ |п16@/)K 2:cϘ۠wt*ױ+&<3l;b-ES]ms䕶Cegn/&#`Rl/`'HaPav.t㿸??l)e`CZ\_I2}& ж?8r󶽯o@B#/~QyFy a:i\m;> A'A rԡ H"!wdiW71m<~ޖ{?)S4<-bdyb2CǾ} , /M7 9G;.]Nr/>K߰EXL%tS :1zmxa\ƎOc"a]Ȁ$D 珎&M,<Fg&䈌-_q9jTg'&mIJuNZd4 'DYth3Rq03]RNɞK.OO F"CϤY~CP<Y;̬ _~cdG;x"I~tLx:I1P|, ^:4AGgL*pyi|`O60xAN)S|bCؤ |~'r8I: ;ߨBœC*V ~6So=&=]SIp>| qQB9|g >/L>d'8S&y<>LxWc ?e\/y߉F O ~>>p\/e}Ǐd"p c{3v\&' >b؂>)݆YvБ ? z]aE)\t Fm&}] u1:Fc1f?*.pХ. -V`aЃz 0Nal =}t 8DMwpЙУ= i3i.|ct z%h|l}EEC-8 D].x\h@Sܡ6.sap(CmIcR_\q2eGX~8ic|43N r]~xzL>8;!8w N=<?vL04Cqb^;:kǮ ~9,:T{@=|.x* \&n>d?=Nzb?hEvS]ނ?+3W~nj64 N"6_~5'hP[Ћ#ߠ=w8;qDIB|MȮ oqyJݯ?8.ȮNYѵ^Jԟ(?0r[۶| :J_F5ؙĂ;;o0>+1؍?WNBE w]FBAп?@, ==Xŏ/c_+Vo v=|V_ȡ>A'~4c|h0~7rcO)g|?z =*1n?&^];vL[t8p@/ԏL ٹ>,vd FcrEqzypg ~en/(aH [3l@e@~?l4z뭡 mw`~چg/j{_ڀ.{+ix~q{4(> | ],$b|\{iG[\?%{ \C>SfL Lgn": A'psx ڦ_%t$[+(E( \]Ay 2 Ls|p 2 aPtT#Hr@`  Αf٤ n٤f̎)=;=n[5)hդeZcf4įߤ5:PdY'#N -EV)q)*OdwU&»\3L6'FܭdZ}{>]jM:"(%%Nд۶ErGNXEmmޱ:zуV.l`:[VOlW]lEikb#_jvf2|E{;c)زiCx'y|t8LNtlӎm.>9r'Mez§OسZ:[nuaRZN^{lN/ p$)[ 4 S \#VEtt\'m!s|vZ-;v${+8'$R?o{pr$ǻw:?bSA鰍۷Z5V ~C? voikjgt䔵u9ᕹ#x]eC߃8K]c󀕊WF4gC0~ͩF5wvJDO[H17zCcbDsƎJ6^**ڲkGg- [7yR;-=3te}| )giW?ϐG gm\F?S=ZPlݽ+>ݸmSİ| [oN'K˟rTzW_wm+ 좜`/~|?# s@iA~zy[x!Ǯڙ5Ƕ 4T>~r۱7aX]%s?.z7$vzNzxG z PָB'ѿLJ #:x`_E'ƙ -E;Oس s-/q?,&9q ?-~)ʥDpaWp/_"'?1/1>nOy bZnW3xC3oo ?<"i2W:}pȉc!z~n`&?@'r M[C38A't!c\PN0wĔd'e ]@ Cdy\r,hNpa HC"',646:;iir76-Ǵ( C Yl/ԁb2uv:ޟ5ni&X`qAgE AA‘F (yJAO(/++''<ع;* K#gKAO0hr6KNy?uJe`%|23saш'+.ء[nww)7YsN!.MzxG>n7rK0֭rs1Mn1f}RZC=$;g\itI`z7Q<))r>9emYT-a#'mjW,ڬGwm|9}묥YQF[-l9udms ̩f ^qI H"ɅW:O?N?tT2z\|Or[ښof=J5)`MKN6.r\Ze;.ܭnŬ\U۬$wM^o82x¯C*|:ϰ7`lߐ2CntI9m֬_ހ:ɉxBl0N?"9&lݼs>6n&^y;yx\ lUs&R99gHJ@ZvN<}m7 >?+E䈯 oSܺYi p'D=q)~)2ם9/3>33%9\-߿>Lb:;|E?>СV|O_4^;$z8%|poYAFGlB M + 'g>{&KsSH'_\x ?|78ݼb!:ʥ56 W&ټf4Ern'5G52_!vN7ݲ ~N]2]! Es[l[nɊ§EzCV7w\dg];:6i A7_>߾؟vPiפ~d'k}֠Wǥ rΝh[1-3n/sg˟A?U,|y- :9J?iٕ&GWӪvNWbZ6_BX=)Z\xaЯ̇+>z 6aн䣯^JkӱLmĮ|*66W!:?>aOg&!50Q]}l 8/6i%c_Ş_n7Ŗ}YHb Li~_=WuMy&]q=0;u9 :u;q<_m:ܥ-xbs @'r]k$/h t<|%x}0 o@[Ѝo=r\cO.E}{"p{X` ߔ .h /vǸd,:ù5r (QC+>7j`*4 C `W(C@Hf%;ϖN 8 8B0rRʗ.,:*RF)i1+0xp`r cE Zx|e@Ah@4u:fǬMzGp`dCYn 12Xچ|>(e`ta;1O la^F"'8L3"l&CDB (~I q%tp9~UvOd< (ڢ SA`a׀TSJ!$ȹ ppH:b`/p:IqJ>lc$*m^4 + 94^QY]G\ա tce 1ї'h?bϣx dIh51a?Q ! M ~e 82 ~3E4 7>iZ0??rimK>xݡm2F_N-;~.r 謫Mdb< ,r!G]f{??i˜A&i~@5C:{N/2!oEw8'xpo74ÁnjEw8E[d[p ]h.ƙd z84y>t'{‡pvQ=:79\q~ ~OeRpctih%t}+9I;;ӎgOeL#]A?f\S&tu >qA55Ӽ^Ǖ@:W3Ƣz A'<<Mc8A*}~/?[$}v= et2|ucf1eۻAmU8 _zGCCal[^l:0:77lɥ_~d~:{.1RyWcРCY/'~F|.J8wsPn?l!_蘫Wt}>J9@Yg؏^;ע?q͛+x?\*b}r o Xw|U b&*o-M/~ge$%;&?CgCڦyzo8`ĊsƘ;-:(Sn OZb]$!QNn| ]r/o2/r'[~=}mtbG?qF,y o oz/2w@><\Gti =}E'YC}?~d&]Bٸ[UF73w C> ]C[调y:/$t]lA>z%nC3Vf?|؇|֐YgLduF>o }>!>||@G{)[?wTD|?Yԑok%|,mjߡ@_EE^z 8Y(O5#lG]R0^}}w[~$u^_}7eqx3krP·K^?|05&芏5T5>NVGgثָWO A^tsl(]7zs D)<2/be;m|KiW̓$vοV/,nou8:|)ui,3Wܩ8f‸C{kaY[W,&i3|g>;8=tA.6'n;yj×ݸׇE`~\,iGc}dt#DHzы<,e{ӘOϷп>go׾B3o>9&䫊\+Dii.uvbuGW)Un}}:]WީWe?c{jlgx|-q>PNxmcKۇ&e^GgX#3^[!.!à v&[A)cϏNnp(AcFGq |tk)2]BG-!_/y|v-uc!A>KىqS WL5*Ą#p "0A1v*İiwIP* h[WMmJrNjs~77#s](>ho\=\/vq:A,e2yxxӫMoNcoW?rQ%ry;7C<)#'Iݏ>Wg7PWzxߵNFE{仨 DƼx4gok!ϼwIDATl@[ơ e#ᷳ7?\`|gyߍq䦏~j8wRZe0כOK3W<@wZT_ѹϳ'F/u#b'WxǶFgz2ls PҗMAȱr>H#q}^mw؏^UIYN'oaIFzU˗u@aΫ9\5 4ڵ(%^Tg:޽Mgɛ!Fu-O2a#y_y+1;q.zef:q]{`{}; {ۏ4ړ"_|}8qԼ)C{E_^/Yk3Qr{7=}Lg7vդND#Oy!?F䷥|+t/GS;gG\oKoMY+=3,= SZ_\uO>^9P1i]?\iG'rVH^io ̓|!q>۪yfkWUfĿӡ?=+˷ͤz]*;xBY.Ie⼘^ {19qr:cKJ[rC|q.tSGBx._,i`|]9gr7C.zq_>ơv#qʑWvځ9RG1 }|]_";^*%]ЀAuG\/~O԰È?8S1>gEb 蟸ϧu )w[7Gv+AD?{L)>^g?ԣ i5ź^}$1=$\_ sxύ\;߱G֟|LجcCm=8=ijZ?_ឋBoA9wF^rHal=z}:9x5AÔOL^5GB_qtt{SH|Y&|?k[_;#/s" Oչ_=~O|k{>jasyǴ]WzyI\@8vS9U[=>_53$=@|I =1}+Hs[ R_5<>5K'{{x kkВvb:Ry_ĀاWoo!v,y@!s@=gv[2)IENDB`hip-rocm-6.4.3/docs/data/understand/programming_model/000077500000000000000000000000001503277241100227565ustar00rootroot00000000000000hip-rocm-6.4.3/docs/data/understand/programming_model/cdna2_gcd.png000066400000000000000000002636421503277241100253050ustar00rootroot00000000000000PNG  IHDR61wsRGBgAMA a pHYsodciTXtSnipMetadata{"clipPoints":[{"x":0,"y":0},{"x":822,"y":0},{"x":822,"y":1073},{"x":0,"y":1073}]}p6IDATx^ \UE_!n(*R, .ibi IknKO>e>-*eK {* B!).;sE@M@=o=3szf93g """""2b֘vx lhMR"""""2z l1!"""""W7mZjZl -QSDDDDDDW qV4"""""2 l1!""""""""""2z l1!""""""""""2z l1!""""""""""2z l1!""""""""""2z l1!""""""""""2z l1!""""""""""2z l1!""""""""""2z l1!"""""#/[7yd/_GMUyyy233SN _DݏmX~Pe=_h;52sTZ_`u= j4iZݻg={ֹĤDܼySMݝ 83#/WSDV*7k.>!^;\WSD>歛SSJ*pnᤦ*6F lxR@K6-]1B"""""2z l1!""""""""""2z l1!""""""""""2zf՟o`x_\aƍشY%;}VāpDB)\WCJtx i2r ?Λ/6(}۾0ۢ JҎ,ܥyWN)gө@oi~[;_tį>~S3J{|>FxMT6%'S`_x䮟ϑqLޤ?ȶH)?=i#7V{x l|ͅoؠWsɺ}8&n3l6> KmWFhswc5Ўw sòmq$|2ϲ# ̞Uwz^PϢRQr5m,(!xp5~|rQMj̜O`g'50 MzT}TT¹7\XSEtֽq>_(s3~: OM&Lv٣8O 7k"HGES_7;­#иd,[<-H$W CF@êѸ8MPK~l:&^U1cP\C ȯd{Rȑ8!\ЧOO8٘+RFN,.ʫi!fc݇AkxcpﳮcospzsvW0)[Yrz^*s}UuOPeʅ(yEESh]*M&xȍÎM!Ƿn?MtcvvⳒ(Cõ~E 4^1yt=c3+y\V|]6ژ,/yhLs/lX6+o@\6Br3 B"eNb̻{p!C>m`{IKzk'vS؈X(/[ oUDUڡsa'_հj} ]F(/7z%Uɥl-ꬍh1WX 9Tk7îykpfc`)|g;všgjw y7X\;vMf~}Qhv/vzv}4l +"pPԆ-{"!#н ,t.n-{`%gYcmR[QX͚e8ztl֜=m\x#Z<U.; o;tQ_5C5ݿ7^[Z])U3Zw?Ox^|?\&-۰i4G?qN ̢v)%=ߊޜZw5ŻȠؾo &MݵcU=RA ;#^g;"#֜ع_~P_n F/{:^͝Ld@P/zS>Ĵ#ϗp-b ~<vz ,? _ЃˉKⷬ^xiNī:=V'K5+pXy)!s:Sp@Ɂ@NO-R2s:Q}>,o< / >O?`s;[.{}.P' m+~lr5c#v,wY>@;X*H]!U9 lϹ:.Bd{;W-?A1ݿw>;/\3˪GvzEd3v".߂b Bp^?? ;"6}gcCq) RS= e~ފm'#9Y9, T:PtϘqDegڷWﻗٳmbD{-x-VP`$Ytظ6X7@^+YXqV:8vX*_wf|+\lU,IZ{\{c[^_-3ܕtDT<_|BIoWW#ѓ[m3|QHP 5_~Ko,m'qX^ym̗{`E'a]/8pV׎Q=knME0DSτ)ߺ6EF5+lD{vlOEdD^+3梿lʗ [OյEɸ"ڔc{&<c2*լu(^g3h|/p""Lepk]l-Þ%uLlʰNߞdt9'#/5Ÿo7T78*h>;tl*=F>P5+sUUOɀ'& s,ivVvz*7͞8|Qxfp=D˒U5EmQa7잘E1s?GE~Gj O-un%G?MT5s d_t>)n-ȣ0+V5l!u?T<]?ܞ} [WҾ­S"vQJH݅+3MotĮn"5j\7VMO',wj[*sK;ݗR?x/KȿgTUx;zs N)=}n%+_g"~bhDW +_`okOQaJQV[H̯cb;_Zeu(;23qo  LWM.YkyEfV3NZwUa[AybNmpJd^~W@RٰDNfTg|e{ pg~ + ƤA43".+=9 WT Z"=6*Wg6UsuV}NjѸrP=F9 CqHq[ wcHI#e;6c 0{G_+-7&a_DRϱO=Ҙ4hD z/*cs2&@ ,UCCG䷟OГm+VN +c!PHOӕYZl:C6(7uzR9A'D!FSS^e<%jꨩtd(_Bff96v𺼬uc,!/uit!3bZyU0ڱXQA WDVȼThn~Qf+xc巄a7!xII^;Ϣh7rCC[4%^,|%N&%9ިXlǴZ2\ Uy6d^Y+\}wgB/4Spr",-E-]vV&ʷJ55ZJ9'Ce!vbVuHtbf9F Xz>HKNc6{?CO\v}0=rSqZC囊9xudl(m銒 [_8?qC-]^\р7 жƳf# "1? v#1rQCka\~xiIp@CGYQ]7G9_nh#G>;m\XɃaėE=:wmqn §W ~VamS?Wo  ׎v5T}ųEf1󱵘o`َiOvn7@Wof0o{kE#Ex+D~Y$ԅeY/aKgR>WѾ}NQEu;=?#usmyΫt_:e wQ n28Y;>DyvL NĈV>FLi}Yr;vY;I}xXUѼYs5uwe݆IfHxg)]<]5k>*zk?#UBws}  !Mo'ԼrqndƭtEQ Q۹qj7fh!K\a_fFƒT#o޺ظ;ASQJ8hvjdd稩B;f`S=x *Fp'u\zP;\bװ4Ct'E:|gj`S~ F-o1TTrű9}Np-nϕ+61P4n +ӹЃA p}_ j\>1r ;L'? 5q lFOus4'c)De~ˮ{ *g!X l1!""""""""""2z l1!"""""#/[7yd/_fD3ڵj{w'W&rnznݺ_2=.''7oRSD33j֨.z8wKM~HS?'߿vjdd稩B;6Cш1!""""""""""2z l1!""""""""""2z l=Ro}GBuTu= .]RSyŪ{DDDD QM歛HLLTSI~3L_5Uhb'$)ԦUkuNGQAȓxז.jt2SSI~p(=6DDDDDdc`CDDDDDF =6DDDDDdc`CDdR0h^4G՜onj70j^?YٟzDI PʏO=>== c|qGc`CDdR˸|9]M*}=;\[ۢ4HS"?'etDvF77usMUb\?D{#Mϴ븇Ȉ1!"2a+"`k0|4 / E&[H ,<㰮aVp[#L)7 =,qo~M"ظ||+3}Qߝ |8|CXxouN6Y8Fȉ7 xY6h$8k"O[vcpԬe[:[9?0!"2a+"ǰraM"PeDut#N#&?&`_Wlԫ~ݓq9j=VѻbSxZ|1\(?-Q2?*ωh 2njȶWpJq`6E!onÁ_a۹9UgN 1͉EVU+,j> c`CD~ƈ2pMkt-4muv͔ CbUy223\rt[fUZNk'ѩHip;2Үӓqa;+3ʦo˱3ywGE :^><1MH7sIJ²~B U3s*S<6?_wc`CDf0W6hձx gbon>R^^AɿǦQf\ܾdc;y)a`CDDS]a/Ol!'N.hk>pB&N,| /v]7D= l= eO刯C^晶h,'ع,v]֓wO1DDʔ l*٥w]ϽXe&""2 l5t9y~.V*}Aex/\J<Wbjl=1x$l=^w}yKt< 3#0> GM_o`^hY_Rɺ5eڴj3t l9cV0˼7¿E}KsJfU\d^ և(FUo_Q%owݓ!^ngQRMW>.A6 r>}?Oy*~};$zAwVcn!"$2Cшܘ?5? g}Qb`CDD妪cx107"""""""2z<"RAEjt>J:((iGhhTw2QMPV->,v' `_@N@tvH1)g l Ud`H+d #O(4i[% V=i d*~c(/Lp""""" @6.ۘ8Qn>tQr2H?]F!cqRMm> D~@Bx$i"UvhڵP[n6xyļotgUY5M"}ǻxg=z[GLKuQveX1gDo²e&z`{0գ lۢڶp- ow):R2)RAXJmzD\EŶ;~y͹5H)I3J-5V!?3/O=.*F6| F-{ ".g勉ȷQsBr[ɹ拰m y%@DZHή@\q\*8ithk6F X t}r$i؂#_ 9w1{ tɠҥd̚ fd`#'6!5Ki珁Mc`S&::FMVCl4i[Jؔm-.=~G`?KiE7;'{lٍ4$%%鶴zyK*qIl_RA^+K&.R21J̯_Ŷ;7&.4PdJ6F ҝNv%qLDHֶlsE`,ӿP ]Zb5M#u rv@zhH-R䗾gL-pn Wۢ?vg Hi V]ն϶-$,,*_Q# 3|ÈBܢ0ZNqt{1~Wp!*kG xu5~Vۢ5g7Xko떾eF1 ]זnz<Z֯*YO0ڴj3c5Qٿ7oDl\_vv~QNQSʣX4MzԴ@[>>='4.%)''@F:AAA>iτ ~1)g l UT`CDT lJq""""" +6PebָeW6t?CE^Sfff)9(Xlrr24ǡh匁>JZ9֝E þFa,އCZ )ȵL=-ɾ(6eM9c`c".Щ=2'~,Y|dd g4iǨQ^ l*!"""""` lT0k;\]]tP}Dz )14Tn"<׎3=r n_Ua@qX̤w>TB"oAE!gaG~[aRNq}0!ROz7`6uE?xuG*ng"%1Td2'Óu=j$"1%U!㲨UF?mx١f M!R (2 |##Tۢ,o[nvHcIG7 xh5wC'rҌSC:ú5n +|p<ݚmCsa Ԛ6mQs6`DT26DDDDDdc`CDDDDDF =6D-+bv&URAZA&Hj&έ#( 8+W0 *xwT&j?ZP}8`fֶy-5s0?ZPpx`V26DU?|0#LGuWgE9 8]؇30㾀Wԩ`Ǟeg>gom @e}?Q`5ow4r7l񶇈xȤX:F`r&msonm|F>˱<`U -c`C˄HI>ub1,AEY4;ה]ɱyI ۥ7M.61P R~=lhQ/cfw*;60:6M5PScֈ8O I^=.<5=C7ն(@D٘1Hp\g; 1X=U"b`CuzL^Y"25S끃)T/ +ة퍃ɪ^]I&ﱰSlM)IWPl:nyDDDDDT0)Meظ^/ cCDDDDTI=Ro}GBuTu= jJů{``Rjh|?ү5BUȲӦUkuNGQk֨&y&bְSrvv"-߿?|||@.hPff&ヨSkHLJT84@:w!(e~a 777WCCwۛ@d=(si}6999R [8?2U-]`ff*W##;GMة5{ǰ{b=0E(;++1PHOfYFFb.EMc`S*2Iƶ۱xoʜjri~^GgұH{26DD%8 lrVO7D3]1tht{-+6TRWذj"WR[1)gz&64te}],}&x+c٥>Ҟr;22xR5fSeEօ`89ݹ,2Ud`[):+j:_hu_Y5EZ!I?Ӥnndhl`oo٣G ?i@DNbb[`KOc1"#HS"""""Mnz#b֬۾ AdRn >lذ^?"BH"*]w"=☰ jLJv9`Cϥ# " a"/4RQ΅#$- ǹڝ y i8_b&MTŷ;Q0Q#4b衖f~o!h]=O _C3|Aܓ^mնX85Pk,ʴueA[x`hՔp]]PSnܷ/uk̊dj22pU<ԪiKfeԩjbeAWY.k-bQ氬jߊGh,=j$ޙ'vC}p6l"lԣIMQ6`)xm3HDDDDTM-EkeO ^H0)FnL|гcxޠEDDDD&Ξĉ琒ɳ0C.~ǁI9 DU.B1pOƞS0ŗO0ƹ;$b)Gг2.r 2]N^XK+X2Դ!rPViƼwB]Wlo:$=0uS`EW LMId PCa<Gc?`=-4-4y/JF۷QW $raXw=Kt/B(2ΘgujzԢfGeq.\'81LU98gekG!^ јu8%zEs1tO&z`V u0:,i0f)QGȲ{ZVA<[8[]{# 5(W,FQQ<"?\s[{ ݒFO?iŶn?x@chy6셖먩#zTy8GĢdqG`9V6Z{ww:XF 86qT[7׷_ciE@@<Mvu@hh(,-tw5$&%* ĉW;Ы_3wޞȴ$88Gc,?%K I;???8999K;)NJ*pnNJG׭ \%޵ *ȥW##;GMة5ܩ1/QK!Q9v3 |7nX-b1!""""Ta͸RFh%6|.ARE*P4///5EZ ! nnnJ#((b(IKQV-hr8&Ce{dC`fxas{'O>E(["P46Pe l=y211-i(uPE6&3SNpLZ#rwPe#Ҧ%i65~K^zdyb`S*29iw5z⅗!j<0Y9?^&ĺqsǪ91ŞxqD>[DDDDDe!~潂M)>Xym5ƈWlcl]Yv-shhXUwdYWl|}}=9=!%my.]JVS%NN^OpH9,VgA$5{l2v zqvslDPrVmR"qxVlؼYȵۿӑ"O"rV,#u6I;d #ǵ*iy&?!;kXulE2ukd$ܒ"%!'7i6%XW1b&a`S*2>8o*i-67w@&Uq+,Re4W tj@Ʉ~`&, t8./Y4M1j&L@`+Wq/5)dŘjp{lLHکGtヅa{?5Ҿ"""":qY1`U2zM샧ۢ`zHR nA loam <BvKŶ;UdP.Eo󘆽j)M2m>r%5L/H|q{m;h#'/#HL$&(E2!˓σu`:|5D? qYԏ?@e# նh Pv&y) _>Fϑ?mQ-dTlS\_EFw>} 7+_}FT!k#688? +C&"(/: nhZNq`(]cXz \!wwguptkEmN9!->ixjS5wkvKZaNc)۴)n tz jr6EDDDD`!57cS6Z^[e?bb 6wagۉL%:ǝ(ېb ) Rd }!$zQYe{k::pޒ0)Q&o،tvx{:Y'>1vB [[exKui}MZ;S85ġd2lfi ;ª3ar3*PٰqGl @eG# pmhjlmGR3[5G.`U00uzѺpz݁MҐvY<<훫#= :qM9LU?|0#LGuWgE9 8]؇30㾀Wԩ`Ǟeg>gom @e}?Q`5ow4r7l񶇈xȤX:F`r&msonm|F>˱<`U08V=ah]"JL:CE1):mď=6[Ci"a ;}zb^/Yf3h)w))84;Ǹ"^ذ];q|$]b3 #)v0fvgMc+щq퍬;N`$YE;5f(d~c“Yc ;D{_mBplnIY u}־㸐c\E-!p'C׉: i<Q<6%2GZ-!s{lfĭڋLQu*Edj,`e;X9Sn_f V*VS;+ÓU2LNa{sgcaeN!5gucʢt'60w[aF6n x ?c1[2νGz<Z֯*YOHPSV NJ;87DtyhӪww#(5kԀcGe~ܼuqq~}kk)E9;;a׮P5EZ *頠@`o%Mѿ?ҲSkHLJT84@:w!Wݴ,g}x{{ɉw5iIxx0_I ̚姤I;|}}>M)X9Mq ''UTs '5tP"71;6aSjF5wi?{\@F:IM6rVqEptWL3񿪣n}K,1!"*IE6DD%1&.+jRs_2ؔ!f0NcPCDDDDZwmĦE8p>C=R }&o_x=YM4xML\Ń޾`Qrrr iSITEڥvHGM%E=-Q߾AF(PCV*.=6NNsٓ*y5_/ﳨ*y_ac#cyxxc#'Q nL;2cP\lܶB|f`S*.=6d`vF2~`#I;:TYd`Z'G62/493&[u;'O(d4Dgd+Υ=6DDDDTd0shlLzIsVP>6[[)#ȴ@ڙ}ذani7D0ET(Ez$B1a4sQKG6*E~D^h(%*+ GH~[sDvD^AE&FWI=UNzT8&L2j>Ë&X0y 7"Z.lƎUؔƦ={֭qk-o}ܽE5 ;StG*RvaDi2QlQu`̝ӼUDM%JB6{yG/oTۢ_aKhw"DM3h$nj[SA閊iwRvN}bQ#Ȩw@_q)2Yߏ0R{GV81b`S >Sޔb1F=LDf,Z᧯_m&|C-' 'Bж%z fj9Q:'am+p,k$oYi/ʂhn9b˪ExLXM,Ɖ ԃ(6z썞.`ۇ#^dUP.Mg:Pji]d Ժ?ݒ/YAxO8",IAG(6%S**vmZkءSHtAN9kQQ lJ@ј>SaxTn#"""" S+[5ME1)Q Ԕ5KD%hi"""""ؔOyfLa^`,Z"S񨹲6QN^1s[Z א c\Wn/5]Q XMU[ w.[IOCyyjZOZUAI~ӳTA6F&Qs9D$vKk0얮+u<61)˳tx7hxB{$LH|.W ذkO0: G.yHuO'gkG|4p@]a~˟:[-u@p|*n3 >lo:$=0uS`EW >LEId PCa<Gc?`=-0y^T6y81)UU4|fy~ z.JD42ΘgujzԢfGeq.\'81LU98gekG!^Yјu8%zEs1tO&z`V u0:,i0f)QGȲ{ZVA<[8[]{# 5(W,FQQ<"?\s[{ ݒ /㏬+y2.]{z(yd/_GMUY׳ʃ+Yń0M#p4VeMݝ8<֬QMqMxom ;[;e(gg'DGǨ)Ҋ[y,&psPXZ9kHLJT8:wȡWF)g =iIpp0 ǬY~J:4t0_Iv~~~prrVs #vNS1A*UI-9T:cG./ǒ~=P磒kKʡQS&vj+6w4X5ۡCє[c["""""ܡ1-Cöp#=>h<&!icz4QVm޳{&9ְV|V[u-Æ)"TvLv:]MVĠ_C9 -<Xfu5DDDDui[!}X9vs!bsu =ySVI48Q^iǦʾ^u`eGcpH~?9$q|=>>>&W_jR1դ RNq}1t3Ʌ^Ay1T"){ >?# )'0i4#zᛘN]Ճ?lrP41 ;[|Sj[Z HÈ/mQ-iQ.2#u%?SQ l8Df;vBu5 V*HV$DG͞F{; 5neQyJ@tۣ Vk$E!ѱSaGd!"vK&.%Qə"Lq`zאqlAģ :LE1!"""" ~[C^ / 1wiFb]ر Qe E:Hϔȹ?n#;n)QIUU@i;l^9_:F{c\~$ l*V ۂ mĞAE1!4v7,d#]&> ǐ?a "Em#Ʉ4qnKs#=2@l8KgÆ5@ק@e ]E ;*xq~kWPkV܎ &\`0.DQ:v]}QgݸkV`-9>RQ l$^t7W ^@F0(寡w}\Ħ!|Wcp ? յ#Ũu(c> 5Fl諾#@egGlcϲv䕟w𔲶xS*L17^3+^9 e lT6gaW|Jz$`VYbǾs RC1#6E$ 7fJ# E|J~Y wE_G*;.cDR$l@tdPx+&u*&g7-'m%:&1!"""""#/[7yd/_GMUY׳LSVս;qFyY8*歛S[[N/ Aj"4t<"<<^^4iQBaiYK)t5$&%* n;k_Z{ֿ?&-NLL4+i6ao%M7KԜB爥'l rrrPJ80ϡLkKʡQS&vj2ͨQ^i{A 2A__$'')ҒD dd3~O';c`Sؔ36**!"*IE6DD%a`S-=6DDDDDdxŦWl 푗gc9 H==CyņmvEiabS811T{-H[bbbЯ_q ybGN kxxx{; !"y2;k퐟vH{l*rPE61jB2~`#I;:(Mel %88G62/493.e`Sx Qc`CF,? 'f} "dH[KC8&褚&K'փ>t$!s.K?$><2cSTz IC4,maPbڝ1Fi"E4]B=CnO\GUQt,[ #ظl~dxv,;ADeXV~1ՃKǎϢ`馶Ek -)v~y34x ,JiE=DV"tҝNF&W"jv1!vcl6~^ۈIZNiҜ>#t@l A#V?g:x:qWdvoLhĤA`DT26D\䊇*f4iVnN6`(GzHrTJv.U۹nޱ&""""""""""2z lZPW[uIsxS.qw=LGQɴyzql/F95؝g w납'0v(%* OcDZH(%q'ƌɩ]m.۳Sq5d 45cVLzI>3&cޡ^SŹ8i0-1!Rؠ7 CzqO2g#^}E~o25.I}յ#zS*ߔ[SlPl==yRIe.v 6,d{#K`ӢgeC.U7 Lmq"xQ@H|r m" `~AZmib`Sؔ36*2QSL'֡6&2 Ӕ lӤ l*!2f7Ґn]Bz.N%qL!dj~Izi"})]N$I)Q`~+ݹ4wɠ"S;j]Wi "E6?[V'^۳Q..LBa2 vi{4-x;z ϣ}ȉeLm `X V*+[ܠ:>E=ۡŶ;{0U 6h$dGb~O[ضꪶEx7dTlS\_E1 l_F|d"yrҌCЍX[-~$pUX^nEmQdvLb Ԛ3 _N(hnd l\ҤYICCVAmKI5%{"""""2z l1!*mDZV1WӤ U,0 " *`UrRr; 4i£;U!/WQ*1!;9k`pF]/ )6/2i~!믮1S7$(.7VQ6`J佶 V*F|)O7DY[u+fGep|3l;mu&y:v,,ESھ[fMt]5|:"ĖZB]ԛou摽в~5Uyd]B|i>զUkuNGQk֨&y&bְSrvvBtt" Drr2|||Mvu@hh(,-k9^$95-ֹ#//F)gBpp0&5 &x6爥'l rrrPJ8pRsKe\[LMUmFFkhbּbCDDDDDƏ =E*PYiѣᰴ4&#_Ivͪ4C=`ooD+`k&8bP46Pe l|}}=Қɤ. >iClKjɩ NPPOU}v lrPE6DD%$ l' """""`bS U+6rL+iǜ_EC@HJ"ذ-.W!﷑ِ6 ǡh匁<@i%mQ[Ir;iAև}j"&&F0"XG_$#cS1ؔ36*2#I?ӤeNqV4'K tjSi2){dž1!ReoapuumCtRXLb VdBRqZ\;$#Kt_n_7h(%*#>x:-z$솯d@iFYy --(5H)~'=GďC]n AHLۺ#3?ni2˓σu`:|5p)H,KKDe! նh Pv&y) _>Fϑ?mQ-tҝˢC"b`C$E4WG mPI3N E` \Wֺ+ruwguptkEm΅5PkC^EڀQc`CDDDDDF =6DDDDDdIh(_:KkEؙT5H=sqh&j { ".gvG˲x`LȵG.^ƝUtUhAY\[Ql ;n)gbjlHIV83\Q<3b.hw}cz;>&#aC:=# !JB xMe{&-"h'Qc=?ƪ1;97[|)g %26D L؉S ~ z2tyXEN~MIE ^ذ];q|$de,V +e_DbqI%^NClodq&)5.cֈ8O I^=&v %B躥yHz;EѢ:+1!Wݺ`jJh X٩V'zevVRC vj{sG=+3d[@lwvKe`DL"""""2zԛou摽в~5Uyd]B|B2MmZVtfplߏn"6.Nٯom ;[;e(gg'XZZ)/QV0~eff"<<\k9^ĤDeCԭs}G^^"RKk<<ܑ:A5O ݥK';I?G,휦8gc*U[:s(Sfffjrh;52sTZ3*c`̲.hWqAT:]l(_q11TQ QI*:!"*gl !"""""+6Pedž >>~PP tcI{*=6CLL"-qwwG@|e?Ҧ BbS811TMt4O&F2FmF?MALVF8LK2~c(/Lp(Qc`CTÆ uH!/t(uG)#* ɤdCxZ6 \:E0AU DŽUN6υ#$- ǹtQmw. L4Pd2nh=I=U Nq}0!Rb˛p|+wn~EGDQbxyMݑ]%jLFv?[QvKC,: y?+D !@e }X#zRҐ$tV߁. l瓩h]-w|¢t=H)1a/X;z/@E7̎8&ʚ\O@qkq4bXt&as왃naaȲG Qfu6"Ÿ ecc T632e{#`uX;YaSe9cM&ymƅ vh4kOŜ{^Z;V"z6셖%zԔijӪww#(5kԀcGe~ܼuqq~}kk)E9;;!::FMV"99>>ŦI;: 44wszīrUQ~iY''g5 4t04iǨQ^0[InjN!si}6999R [8?2U-]`ff*W##;GMة5c`CDDDDDFC*:M^%mP49CIv̟J1MA)}m?- m_Y8p($5$c<>O$I!߿? m_-Ҧ~+M%T"WlU0^*__uݽ`ȇ.%myBff"-`8&((H'Cc+6eخ0*f=ȱ޺{ͺc۵Gawxyy>9z4\y'I;D&w_ZV lr$;I?ӤeNa1F?T" l!"""""` lT0k;\]]tP}Dz )14Tn"<׎3=ɈÒA"]䗾W Z,JHa|7o!I%;+4Pdqy@ltKŴ;qKc|D .6D_Iϑ#lۂwЦ(/#HL$&⏛jLF7cx`]=ؾ3_G FFJ"o!R2E)QYH7bg-Z;/;,ݹ?D^AE&ᗏs"`j[m ]tgs;5HIG7 xh5wC'rҌSC:ú5n +|p<ݚmCsa Ԛ6mQs6`DT26DDDDDdc`CDDDDDF =6D-+bv&URAZA&HjF&hj8X6DerѤqgl]g%om n .v"%%ż^ge8S<_SRphfwQB&ǦE'!6lvN4I9YpբJپc\xRIeǦW&YwIJ ˘5"eqBW pń)Hе7r;p6n;feNpcfwJm lU.X/++ZDVvj=pI^PQ +'j=۝R~5-ԛou摽в~5U{Lݻgǚ5j?n޺ظ8e5lH+GooohͭBCCaiYK)t5$&%* n;dk_Z{ QH3qh8fSҡJ~ӝg!>!A/휦8gc*U{w<'xmFFv*4Sk lPE6v)Ҋ@DV?̀(%M!O&*K`#Onh dbbb 4iJPc`c**'M^^^ tia6Fy!99YMWO#dc`] lLXE6DD%$ l#WQWlbb=y/C#9HcCT"ذ-.[%!IԮ"^E3a9yеF8߿`\{=6JC޸-kxI H{233>(49y' əԜB l =k ddpI;*tϥMJΜY"&x30cCDDDDD& QH;6mO#Ⱦ&ҡJHD8&삚&~!j=sD:4U!*TV*;H?($E ,ݹ0j@ɸ3ۢ&MT%;UDH-o}ܽE5 ;StG*RvaDi2QlQu`̝EY/xMs@e#Q=Ѽ7m֯0gQmw"DM3h$nj[SAvKŶ;UDHJތE+6k-ބza_[ڶDWL-'*_G8$cb-z%e Ԛ- 2%o]Y-- VM+]4+tN-TD+ *u^mJKN$'=1MNbL. Mz3JDDDDE͔7cc͟&cE"""""z8"Qs<9oV5ddi)+CX679U,KM볬m\ˀaUXYUʆ9*XܕZPWC`(X;!He{u<"hH^`U>CCFaiH`Z`@L^?uZtŀT4 ،O&W_ -w[;Wg}A[auOE lΘgujzԢfGeq.\'81[t,g9A0u0dYۣ(:Gb\s1n1DV*V u0:,i0f)QGȲ{Z1t&<[6BmvBU;4bNu}V=g/N+j v=Ro}GBRg咓1j49pB*UTNGQk֨&S)agkhNAAHNNoi7 \^ĤDe8s}z%Jk???8999ŦI;F„ ޢMrSs e]B|B_9Mq乥<ǔ_<^C*ז.033SSC MԚWl1!"""""ǡhPeH+3y_(ZPP2=9 -<% 11TQ QI*2!"* *TB񊍜^_߿/W]>X' xx{O@ff"-yzyR}ҞYEMPrPENH+dcgg/N&z4 T" l!"""""` lT{|hڵk6&- !ҝ?h?:cܢtdGb'Fˋhw"-oldG-volڝ-xSu6h4bTw8ڪ@l>Pbڝh7D .6DR|8$i#~FʟSnO`j9iF71ig ^hh,|cv Rն(5X&{?_Vۢ ??["*")!@ǎP]͂  @B[Y0ET)`(ae5 qQFGtTYQc`CDDDDDF =6DDDDDdIM ;jӑ.mFWD`͆cH۰"ʑdB8%ֹl8]g+`Z%7.U'E)QYhgWQÎ @l| kV܎54i !pA$tjtW r 6m? k"Oi"ɢ>] `PQ;>"Gk]U_c8?79㿁gӶvD}EYɫqSxukJ<Nw+'w=9cxhMsYnt9R6yO{ ]>^3)j=[Jtݒ#/KA^ =6DDDDDíDڃ{l"qz ݳGM_o`^hY颬zcOiK5t_5Uhb lK ƴsW15K#AL@&88X vHlIMrr"-K̟/7- y>=+O/-LIGE6 lY lbsN¼f}ԫYKoWݯ1!"*IE6DD%1܊7xg|>EW4KF4V3+6@7jUJ^ +U"6)<Rv-V=""""2}+p =ܺѱa Wk~[i~ib[ޥ mX x`6La/o~_sh~^<]|bA|ozQ1nmo^qIMVYq!j'~Z}1}P_-ꮆh<逑_] !Xa~>lK{ DTZPo겫bui""""cЫ/bgpM=D\.hD-\Za\fvC}p6zh5кz釗5]k%l|{}𼳍2$zX у*AC`|{ؒUNokn?m̨f /mM9+&.؁s 1nh{o]~t؊lW%"zPvce lʮm'"W.lUSw*f T"2}K>pڏh"ؔ l{*V%+TRpzh)^QSūe4F?c" M<2{#/u\d^IxA#"ؔ lbyFx<6DdQe`-_N-*<7Q/`^i377%(hh2ت6/k=)~x*h l|2UM/L_*j_.ދK"^xm'f]\E m}"ioEdڂ^ <^koX}552gDžbĕy| aǐx-}c mҹGI_h׺E"?ǫ^ٌ%Ω阛mew? 6Yg񫉘+ȱf!`M"P.GgS>IJ7aV?N-86*dvk[ \-`ՕP.d+F^N#I9N#&?]QeחW!{ q)yнQ_ǂ;gWEOf}t WlJy dœ_aGll\!F̜ N~:3~&B 1W8H/K?{HL_7?ǢM~=VAFب--ʆsRS 4%ڢ7x8q]!BoVޔІ*jL`)v]nac{l1d@k+6~:~Yi%7Sf`=A"3w$^4pdDZh؟We̼<%~Z¹eK4(n\̒nO^ E E,Xw}otY͒."^T}_E^|c0۶4|ݛp8Y<6?s'v\>+MjG]]tkƻPYzT4?4`58vlдlu2iƳ1 ΢ؑjcrAC\d8[O<3 U'2Wcry Da"]IG~x]~dp~Q8oHJlSz5 _d7¶)3㎩&͍Z#V~n*ڢvt4}4=◒ޏz'يLJob__zd?]Ҙ^H= "2^9螥CzI1$K& j~V:=5m'VzpMqxv q=6]`/G]mhfNss\3 GPbT_AΕ'7/a_␒y[ kQUR0T1GInd q%5ſ\%8o# mޛCߐ( 22ٻ*2 E ASq%K4M%\qOJMJ+fhi^ HJ "Ι{{;w9 39~iXAy▏Wo,iJ:ꩂzcl nCX*nͫq#[ J05Aŏ?s`},=_+3!tu{rh-ֽ"TϦHき%fzٖV3eѣ52%1[8+. "ӣv!|EC9%ldj0l|nЪ_ '}ѻ8,U=?|1W4$"SW o=| ߂ ٟQGWT{I_/k˳OT4*g<1.\u NRcCXGmGEi(oJpҬ~5X?Up,&&)6 \"4JOlSM-T@3;ߔHضɊGœLKî,Oވq%j2G_wQ@#G ^WWbuֺ51Ud*~v/?~.8x 48J~Y}z?z/fb9G=Kj sFOQXZ3oi ;ߏ1 TGtE<' ˆ9GQFlw|큟x}_B|"O>tLj7gmT!_c1eoe}mn/@A|7i:>Sa7UL$pb>q=,M6FXP1_|AE_5K+@w`YvN>@R p+0{67HvTIU1ϓPJw!Nx decY Ք/k']WrU`J7r!;;}NeAտ.G|[R5k9E#v˖d2Y,n9EYj)cG- =xIlD**o>TRp-Gf݌6ȼ|ۦp9r{F3嫍^mo]9v@洛c6JxyNLL['훎!GPwRRN٨mhYzJ 9z#ܠw18~ /x @LŎO:cj6TMmg6m( {V9'䃁 =֕)Anūv?iAђ] g]b>b:Z0URPOLs X>t0^l6LGLJ>|PsazƄo%ճL= G[mڊ,_AܔOkYVeJxTc z˗h {%ζOWcb`}L?2=K@c.јw^P&,zADDDDDdd,\7G?=|3񑛱Zg>jn?\4+F[ΝD0%u<0jB{ WeV0z~<(&@Sy4N2ΞڃAd,nfŨK ;{.b}gk!s-W)E~@y^M*SDDDDbJTQ<y0%)ljsOo? 6EP=wB k18-='6r1%OV?qؔ?J"""GdkcxX7kL諅A_F2qSZ./3 W\AJy{T}5=*PUy"lhY[=qV4""""ʗۻXfM<[u2 l+d -k{hdpV4""""zXYbBs!h~ '㢘~܀͊16DDDdnLb -B۫cq 9!""""L"""""2y l1!"""""L"""""2y l1!"""""L"""""2y l1!"""""L"""""2y l1!"""""L"""""2y l1!"""""L"""""2y l1!"""""L"""""2yO<征Mme*9޽2e8t2' ñ0n߹3g鳵Au2U0qm)1{Pi7yP+9[2cl|bCDTNim`%#׮={Wَ Yz8}ާmÎro~`c AȈY?]OYXd?oPmѽR,ql~}yc`sތ{hHe15|EY4^T~R_#{to{['%]Q˞m|p}iD/ۯ:x^=L4R/򍟲+9U5Tyh,7. yo#NˋʾϢ*}+'G;-5]_ w^0Q``CD80o/00mV;HzW[2Q[!m`Ȃs2#B~KgNr`MUU{V8.C"1!"zL2bɛp-_|48U.#T{]r\櫊?kD7±fx袷 [B""*T lHݴԄ]N(e19~-X7$^:#ה/+QO\ލ[t*`/P$.?~C˟3Ո< w݁h#߰-i:tr) t{;QACyمj)ctVPN!"BD,Mn ~GҹC؟+,[$]ڌ/ti\ zڡLJcB3ukZ jX"ftX,.R,^;e VO)\!˅<_:Fez[LV5e&aGY?sZ|qUE""h:~.?WQhZɧa޳H9{]~,u8|)XߵX7_#\Yصe!*Nl83!Nl8356DDDDDdı+&~C0y:X_W46& lNI)ST)6tìdff1'6i7sL&|.P>!"""2'6Ol6DDDDDdc`CDDDDD& <6DDDDDdc`CDDDDD& <6DDDDDdc`CDDDDD& <6DDDDDdc`CDDDDD& <6DDDDDdc`CDDDDD& <6DDDDDdc`CDDDDD& <6DDDDDd=qtͽ9 y=06U8TCg """"ta%t¸I096 =Gy(=6U5 !ڹpz{V]-[NȈ^]@x}wAC2UrLC2%>/1PXM&&˽8V(_u)CR^NGݻ(]48?/)S6^.2Sl(,8,fEJV!%L۪1:L'Φi6 TC%xZB&)6#g|GF͞f V%!""""g_.`qn =L Em۹ur,p;g쌎mڠM; m6IcR!w~ ĬW۫e>=Fe!DDDDDF!fٵE&@\!nO|1eJuw,V"&<m6`”޸2n\oYX[A΅U~\-.,K+Kܺr щ """""c̊7R!yk۷VčS`~kelފ[c5DہEU8s~[oJCܑ X8A9hw甗 W],1L-%3E"""""I7+=Z鞉`|M? ) wbNl~/[At>BY;x}o6UcS 5 V#Y_x5턾 ^[d,+U3Xa1!"""*>%QAտ7 zM1(&xdb WbV;qY""z45jJ?w&S2EDhlmlP/J o(ح˯<b`:O%i9xm쮰8b5؂IWv-]BAKkOm8)!E\3J j t}fGہͭT*/U^mu()i7uy3<ѥko-72z%bCn|*Z/L̅+n 8>DہMh3_̚/狥+4q* V7]Cf^Q*P{NB -#n/G dr+0Eٟ<҈?qc}ae_;#C#kݏ&vm؀Rh0 x71rCwljމ-[0&ӕZo`잨6f Š5̰@yۧad$|<O/EuAxW Ϫu<߸+紺,e?jZ2͕q̛'><6v-?gu/c7^H˫-R.0 S6\Am1dXWJ{E{qY'FLϫ:im|؝}G)V);JMCғջWKõ R=+ՠ1x+Jގ3Z+o|)'-;aؠ&(%>ӱ|Ctjq&U]k!L-N;=RrS2{,pi\X<~S|R&lϖJ po呜cÊh^K9 |<2lVWd(mȶyz)>t^)Gקp>J+`hCya&#v]ׇwBG^ ^y~?Nrd={Wl:i5vl}a߉Zmv`S:8jߙemMAR #dZgs8+cҌضJ"GŪñ`"B8W]T@JMUU{f緖RY8xuQxN>|ॱ6D||4Tg՝ؐs]Q[] t2p)yD!&m%JGDD Ƀ'om\ ]E~miRSꀪ |4FwlF%5jWySpčAM%[(<q/C A}^W{C!),Rj~iXAy▏Wo,>鵎z!6P=)7E0[DjjcLM}@##z(vDt=jN3wqXY{[_1r4Zp=\"T o=|:,g\7@66Ϩ@y1^G"8{8TigX?N{/*bWF")H$&| F$dVDn_Q`|1u;2?eJ~Vϣ{c•X-٠|jXG| Q6xZëc_G5)u_1Ή?@,H>[q5nhh\! 8 U޵DLCj`XJXZ5X5gtl86'p 4($y="ydѻ7*ۈq%j2G_aa;?5Dž@#G ^AxJL5ZZw&"LůNV?&`9'E/b&cчҥuŹxG|ADV(KyDWZ#x seayw}Ii]%Tͷ-RysLv#I|Fe>Sf|_=5=f̵U~` }cq!׿>_E]ߟtl56 \(Bi7K5Po]._a ۞4-ٕ̬0Ѫ|֕)IN/#e+[^%$ױyy]Z84+@M1(F4J nolO>%oB᧐rkYƟ:6]3LwfKa|3dJw{Nx>'6DdĆJ_n06- -xaOl=+'ؼIoؼF'3""""Ƅ,ol1u86np߶m $09#xEunrdWѹ,UD͝;wp)sTQᰵ>&|L=+j5DIcS[y\Sk~p4ُB lRyӖ XrvIX|trmAclN}>#`kfrF9 I[ߧF{\Ol{/_A'"zPwvDܹ ㉍cZٺdȸr\xbsǮAy,}~zZ6~li9dut ºLV wV4߰ ?.ݍi>X['˚\,5p mq!F`_3"6kDSlwƸ5qO3z1ގ a/lvG<ѭ%>7i}ڥ- DbW4t]±{|8Qbba"X5 $""""w+U]YkXZ ar Gu+#f̗AM3g LԘ*6w"%`,~4}aKwOf{<4-](D!SW{68=xyغu@1olt*{p!ӛm6fKQn©p|;b=L!""""M״-n]֥SOeK5m,cz/92ș!7'7`ᤙ' m62^CŘfʶ>iؚ6`οd뜙+:.m`(}jt~%L۞&M~Ґ>j:((Pق Ҩhe3)HKRSSsP@<5Ki|M0>cܠ/qXЫulb?ܫ)eY?pWRh"n4i[sb2D6~~~yޱ%$`F?M1dƌ6;~nXVP~LXkVc,XmBZhA iPcex]Ly  ۾׋m;.$#]ɿC"6TrL(.4Qڢu2 lP%/QB l$c \ֲ>.& _%g˞Y,[\G}7 ߀ݻw+f|3k-.)e5yJ9^^)D,={V[S ;}>R2+1Qx|BE8q!~W;Y:|D拁 *KGvM1ضMLE Jm{CUؿn4q]m]9sO~^0d9QQW0[`rm[u-;RRR2'`Ek߲"-ZStDt?6D8;}]}88 XrҊԿ!BZI1qV[TnM)PU""""""2y l1!"""""HEiK i}V)Hi!-`m ._ED)3)ϥb%M휜[_CH3tE]P8gCO"Q $Bud na5-^;#^)kulbP,S8/'zDv3zJzY Uz8R2':sۢek &o m-/~e?XʹHcԗ^(S?uZ;:G)e8uNJju1ulXw |vrPأRfv"`TS.Ǩ51MB`h)mλ2K7s^ZX#=0=wAs<[*]D:6+Ԁc뿈eW{q|pRHx}wAC[dIe<5iXDIBp?wnYݲn66nW] QQ2eғqZғ`[Zb-S6\sxMv5GHHr Ū5 D3OϞ󃓓TkoPUl#5v)J1"iSϞT=}i5D] PI{OS&'6]ъC9y@``LV zu{b[M ˗`E%aw19|q"Yi1XτG=[ˊMb`S *F tq!+MQRbn-/8<< ڔ" l = l=pwCJu]V 6[_f(VY|GAϡFUY*٢FE8(Vҹ~G*yR‘~j15s@լz,>G# Dv(Ӓv'ʿrJ .6DBfLA -?bBKYN`$ltk85e9Qъ‚ag8(ۢ35?E$ lR瑏Q "2hѢ,XZ:;AZq>*W9@9kk䤈yDE*Uȩ`m5ϞB:ZED76DDDDDdc`CDDDDD& C*UIu-sL "N=ZpKf!="Ѵ%"Fr.ՈTr[6U$3Rǹpw,~:g4km l[Ut֥UX nRJTUGSo!Y4>AWWAWoҪ5knhns%Bz(~sTӖmXXM"0֯ڶOKŧB bz'lr]Wu"*jQ ;qYu?Uz-SIc3tSQc F"Ms ;hֳekY ;c^XZ3{K<WYexfZUǚ/7 UEUk8@D3w 1?b'cgLz*3`zH<.W>oƵ9W`at?5K ͓Xu8I2)g3b!=>y*+ͷ3Ѽg ???89̧LC~~4DݻwQti87pT5J9ߕc[5,UOǮNA(co bB5eaˎ!6k !V5j+/KePteG(QDP#Tm5Π,1yP]U~Zbd=PԈ"KGtF,11 l1!"""""16&8؈~-zu{16/ǣgOO5M=Č3۬ԶGMPPZH[|}}shW~clؘ l {5"2bvHlEM||L4o}E:&3! l+(/允6pV4"""""2k|bc뉍L$1g=򏎎b7 ]*'6 RjjLv(k\hD{Df[,hfdQ1!e Cy)]R&ʸz#=&P` A^=_ Dx&"""""L"""""2y lQEyIIK֥Uu=bqJү\B2̆U%kF dZ_U{ rB:\|V*Fjj*/^SHTȼT$MW"#%;ʿ *i"+F q0Vl#any_kE_@з|K u@^b}ǡ0y7PGt{eŸ`UCIY7jыhaë6h.Kq P!2+]Fc{m@v[4TӒp ~ _j;g/M<ÇU *|30@aTj)ʜ,ovW@RBe Cr.xBoN9Ǝ0ݕo`{L v͚@.vLhƉF>^Z7'_;@ 09 :bTo#fuiWa ?еu6,I%D([94n^@M`SN*kF!sei]n[mkrS*gmڡqN%!*$pCmhXVEd~ ڛ\Kkve)"b`CDDDDD& 'lr]VQLC2e4j, v"Z|y8qT;q ؠ]uu?7gg'899i|||@.hPtt4`eUQ~bb5Pß;233)u?ӳ'RSSa%sH+0O oooEqnM1kcNGݻ(]4]̈FeMlB1d1)b l g`-S!6BVͭy l[KK1a6Yv,9!2eےn]Fr.JOe嘬Cܤ#ٿ{~+Iɻ"ƨu0~mwn!Iɻl@9QYrNK;ɗcA] lT855BW=^w7+E{|K_. 1qLH܌wP (ǒ 뗾gwRJT87{ùF=xEETLT4Pd#1m^j d9rUjv1!ao(>S[Tv ?BЭXy.ZW-f8_cGA*mQy57f:E%1!pIyU.M832X%">^Tg*m bZ-Dc`CDDDDD& <6D( KC?2-2M,=)Vӑ)W e,VLI~AWYĢ%y%% j!*6Dsslli N΄Ḙ=:YFa;o>,;e7ݗhڦ#,#W}g׎8y4ɨ_m't>כRm:X"rrZOd^kgvRњ587olOFlgN@=- QCΨo~,;OKe lT1yRR 8q]).K5 +2Ēߣ|gc{ʵ#zcxTʚ~5EղBi[僦/&zd~8>퍨}>4)>زӚE@|6ojv,,յ7b{Н%o"s0R{ _Kpi쉧?7ip4,S%G4Ĝ7Ț4j, v"Z|y8qT;qYu9;;!**ZH+Wooo5wͭ9BBB`eUQ~bԴ@ R㔺_{A9~j:$d0OMvxz_I1kcNGݻ(]48_C+׆.(UL MBJkhl|bCDDDDD Aǔ>J7ߔ9}c|w4D~,}#n_%g 1>`UBxߏ톖YmQnl{\n*y} (20gE.p=d1v"6D_E|vlФRt/^A=ݑ{H_eFґ10bZ{Wn؄TT+J T8tdw?3mњP!v6R (2 //mv)ihc\E1 lpM^}c(;8AlYYNq`]vu@7s,'*Z'ppw:\D-rhf.ZIxo iwkL"""""2y l1!"""""HCM4+ dOh:2FU{  =ugGNUH3b3*P {{Q*X\-#eG Kc 47vv5R=#5GBK*1!{-pr|+8\fy z޷]PY>\4%-ENkG8vGR>~PP X4(55aaaᄁq Ū5jJ?wdff"S~~홧gODGGj!!zQ5b~4DݻwQti87pӿ2W ]PT)*[2cl lJؤ="Y2Ŷk>6E lR܁ 1 l "PQRRذj"ʒW[1)b l q %1bo/!))cl;"%Z#7}cl|||}Qt l "Pq6QQ2EZ!A?Ҥnn͕ɐ^ 0FeM&@!&0)pg"""""2y lB}X~nI싡J:uG#zQɬ'_@vYoG؅d#Bt_P%/$R)%*,JmYm0\HNϣݹP%/Ġ"q+ 'zlO&)g*NPFi"U"6t'X{7v-S,])\/ؙ;R 8RlG}7 ߠ7Ykq 9 ^~鑋ɻRSP7ȶhט˥<ڝH,V&4Pd7cd:dlv#pB%#NʹjR#  W$5yamħd9iFh8f..eyԓDEw~s 6KulᬁZyV$-+ۢE?OKDyc`C$R.Mw2P"*4QJ j]7%L"""""2y l1!r73]ge k@JL i)J5*Y4 Җ@=#9PT)VEUTVP`fLX*7or*>[v?nG<оW[XnA'K\ AIZǏ[|{c}|Ų-zw_O^~xrkoĶ RCLq<-1!R9c̖_fTuDv_,e;̊8Dž0%?)J__GZ#gu]?ĔM>>>}urL89[gA$rM`W"PqN5hC2_c@o>Fa!ױȈq5YֈIy"%Cdl6Mc`c8.Щ=".&4iGIY3|@FAiҎ!C0f7b16DDDDDDŌ _WW>Aǔ>J7ߔ9}c|w4D~,}bTn_%g 1>`UBxߏ톖YmQnl{\n*y} (20gE.p=d1v"6D_E|vlФRt/^A=ݑ{H_eFґ10bZ{Wn؄TT+J T8tdw?3mњP!v6R (2 //mv)ihc\E1 lpM^}c(;8AlYYNq`]vu@7s,'*Z'ppw:\D-rhf.ZIxo iwkL"""""2y l1!"""""HCM4+ dOh:2FU{  =ugGNUH3b3*P {{Q*X\-#eG Kc 47vv5R=#5GBK*1!{-pr|+8\fy z޷]PY>\4%-ENkG8vGRąא16XNRӤb\؈~#"ww16b5!mmg,a`S163]Yi7%bV4VcąlxxA`#fI#3#1)&cCDDDDDTe~:ݶn)CtN%R%G"D9&LYIOߎ HG2N(\J^HRJTXv! ۳ڢaGsJ^AEfVN@LRT۝S!1J .6DDl GObn[XR^^3Aw*a&{yaqLH?nAWvo7sr#+yw)D!;~ /omі1Ky;XM6h,$nFu FąPOKFڝs"Fi"!~Hk[-ڈO;rҌq]m]'ˉlb"YY&~Hz [VdE6~ HHIubk]4+drETi]d Ժo(*mOKDM>Niίż#!sa`at+!;e9g#$``7ņa?nT];g9=v l Te,a] WȲFE, W"SKS~ָ4RkTfǢ%yt+T(!gdQ*qD*)z*V M 12;OY<JnJKE] l :l@ { Ӷؼr!֕i}/>rR֢ !`P/=6е|uoY?p@^ma}&~˟[,ѶWp|*nQ'O7j?n;W[Kl퍉?']}3gIDAT˶A~=z9Mb25POK]&~.F25(FDZ&I"uz܊mo'ձoev`2qWUrˣ=j"+eq!L; l; JYS.Ǩ51xZ"-{+ l m+Tɑv3 1TѺRV")^M5{;qR}P<88sokcvܜ-S꫷;M!!!7pP.*?Ct㔺_{A32- FxxOS!!Լyjӳ',sr_#wMcLhܽ{Ks'?k(sJUHI+S9ƶj'6)X=wk7$cc`Dl!܀rm.<?vES*v|SvĔ=CbVRuQH+ѳAW4݀GtC +]DOZ #=X!2 @WKX?,,6}9x^sԱVv-t&ic;F5o=OtI7O78 |WA!1v@+.hF"VM2d,`s:oU-"}||tPP`-c w`#ְ ,4F2bLMֺ5bܧ@>f ?9Iٯu=\P\lfCLJ:. ӭ3Щ"pN;I;J-G+ӤhH=a#HPc;41o qL-:6IBnw l{b`J$%DQ,  [xh&}+0g-.ȣI vTnJ淕tk,1#74H89Ԩ*A%[J? Bk嘷@%b j怪YmQUX@fTZ4PdgbG8eEaqZ2;W r-u7߂E[<3xƦ}O/(2]u;EfLA -?bBKYN`$ltk85e9Qъ‚ag8(ۢ35?E$ lR瑏ӒV8ۗkzZlul!ۂjݓ\ܧ(QRV"aŰ|?tEV^z+6-eP9)tQJl;g=OVB;5j4IN U!t'lr]жLi7sL;8{jv,/' ZT@}1dS*4M5{;qR}P<88sV,=ؠ]uu?7gg'DEEiEPP k4M!!!(sr\qq~ R㔺_{~~~prmi- م`3&2 cx+mɡ51Qq].] dn _"ɤ>ۃ}GJN[2cl|bS ݌ATm+#.G;EDDDDTHn¾i -O l>+:wň Tn<Y 3؊˃ Em \"l!xB''P+Z>x}Zpo\V4RvE ) C/!j{L&ꟽ=G5ihw ]H[$kq/}0wexS&Oi8z>v\"؈>M;vd.&H{`룎"iM ut PI{|||3Fg'M|DoQ2϶ {Ue'6Yc-H{ ;iWǎrPq>a[]mhD{D$k^Ol8&/fbJbiKtt4z.X K1qظwT.pg*9D[$.fOSӢҭgĺ5c=9Ɔclrc`S;Zl82inEص6\S{D #6BV,)1C#kmq6\S[׼ب,mϔ"16f 6aV--wDP'QclZ= _Pc)C"ê+f풋#6@<ȭ3tn=B/* lZ3c4t\> _Yc$3t_ %ovpx]߬O%C7s{L9uf~.끲M!iH}rLR#\80;wE޽.ƪ^ K?>zС*$+-B*6,\˿*y_=dVn-jQIqiy;񫒷!*UlDkm`aB#uiНowR6*_A.ڄkea|1E>|w<ՆSS+^-ŔOfY8~YcDn>.›=zCd9iFƕHr~S}ꁲ9L9r+ mQ0AVݽ һb췲ۢA%1q}krg7Э.sI)%c䣙ߠb16N զ-Ə}Ȧz^zt)K]4+n:P)6d@%l.{-ӒVU oUe;sa/36QxOhBX=gW"""""wE/dc3|fXKegS&qX>WvC~ """"V _n`|܊aM^)[g}+sz]MyQ᳀UukEq0)PGLٓMݖ BmYJfbETQ^RҒui}U`X\.3+bVfǪ5p#i2v5?.C'.DMLA*@W﯁ZJ'XS)#RXViK9-ʥX@i\\}ЯmnsIsyx^ǰ~l"^j7@߮ &܀.xɱUضa/]&˽8V(_uqm9066nW] QQ2en!d8~pC\_hWoXVvz,kJO'pG®q 4m 19AYhܢ j[Enn+Oo@l\_áT~sGff&"8מwD``yt$_8ГVAzfXVƮ Z4 s~j:$d0OM[I8y rNKzʨݺ9NXfӳ',sr_#wMcLhܽ{Ks'?kpy{Q8} z=Q6t)q46 )we*V&oغlg]c `Ӹ]z=f5aY[ 5Zfi]n j+pDPCֵ!zfXfAA㶲(Ǡ&|=3tBya`S.!"""!_͂߾D\[vB0ǃAnj+8&_n˔XOmJ'sJ#55={z 4 dLtt4Jʊ8h.=y(|>aQO$Zh]{sV>ݳa`=8$-lגDGG=q!Ȥ'&cBq6zHڤ_y^.qN2v,;qtFڄ4Ep}_jQ "Vp' 8qqjzY]* Q^3!"ʋY6zk=; ːXFq@;v{w6Vdk'R!_#66uC!CR:v_u_k6Z\q`W"V|,: 1S/1y]!2EZ!!bBEeVC!+ t!#'Ȉ+Z3m"dN6M+&tRrƱ] ;p6gE)Ҋ@&w`Ë qsk^bV'lҤ1 l ؘ 8 e] j_-:խ$$w麤*=c!s˲o%)Ji1I\ lc:U猶;]6hȜ펬 Y{펱s0ɇc߲k׮jm_" S^]#{xwR..}DA%4x[n.}*U/X$nszhl:5C7mw`נ"y`רlQpU8%ۢ15PkMoh#>t>- OKZQuG־vUth5b`scgO;g>VyalN2a ޵ҥIxRfDIj>VAmKHj%V& 6)9: ץ' G{Aa`sRx)(W )2%g6eff!Gٗd}j߂5\ϥX318N#A"""""P_g,|XzA y01 _O݄[0ct8ćb(zPU*Dq]~!"ec`sDl}]ŒGpR3 qcqZ*}2'1yRR%kG5N\W{㻃K0"sR{ Ê7mj2/Ǟrޘ>727bz)e@%8]o*Ppo7` hoD)ǥ)eM->(Ȧy >hj2#?Îe[w9qZBe44Lw"L-(M\طE׳>>>FӤnn+2'7;p*ܑ?Ng=''%!!yFӤCxaoM95b~4DݻwQti87pӿ*G{`zۣpmRJTt*Nƶj'6s@/bZe[jՔx}A # {UDDDDD+?[$^lBRbQ<\*]ѦO)Ҋ0XYYtEݑzTӤ~~KLWaoo/sH n]5DMv8'WTĄF-bi fx5h lJ=ҚݔI] u}؈˗e);NPPOetQIKK};Q16+!"Kq6DDy1gET2xadiDDDDDwaHħ^GE]:I C =ʃ)7>)JѧIcz/. Myg('6lKCY*x1ΆIt6-,>ە XXd #BwXqaW"PqN @F Vb|P@u'mD}xcl;*uLVDGGFdMb#D{dcl QlYwAmW.ϣ}R{Գ. lCpNYiҎ@l8+ƈYqSE?ڔ" r6> 5Lϯc!""""GT_ s|VlX< ?;KYLa`C$Ǭ;E@1`7e.B2Mf$n-e=pmnmGJ [^g0()eQ8S;HHo+%dvvܨ8 %׎؉#ǩ .ñJ)xdZ%F0^TR%Qg*Qwqj ˰J%'8DVA3d1;kovttRة<aZ{H+g^M9)."sc 8TE^Yuk>ai경U7dzll"""""2 l=g6 eHe<5iXDIBp?wnٳ꾭 UWssvvLxy yX4(55aaaᄁq Ū5jJ?wdff"S~~홻{Gdzj;OSCBv6i1&t4޽ҥKù͟5rmRJTt*ߕc[5f`S&55E_̲.hF(F`.EX{1)b l W`CDla`SL-"""""2y|bS16M^^^UNSxzDttLt16MApss|bS11TMT/&F2b~`&psk\LFLppA`&2 cx3)&FDDDDDTe~:ݶn)CtN%R%G"D9&LYIOߎ HW/*HTS!1`U“ a؞mÅdmw."T 1hlJYm:?hw4 *Gؽ)E.dLJ؅^^X)d6OãoՃݛͬE.]0 ;'+cXp'o -5f@N$+y (2 1Qx|BE8q!ihc\E1 lMX" ossĶh#> I3B1wu( F,'*Z#c^d[4g g Ԛ "5oY-)xZ""!%וuiҬԿQAWtU5PRE<-=06DDDDDdc`CDDDDD& ,bR\aHIi!-EɱF%+&aQȼdZU%kF  T8,VLS"(/)iz&!Ey>[v?nGR֢X/q T8Э Oho:=~w@O-mѫz2:sۢek NK{՝~E-l u_OE lTWUrˣ=j"+eq!L; [Ul亊i֖jJ91T<J`c QQ2"""""*j:LGaVRj^{_c3ctCT!aڣܠS_,(Z 7 oY;w^kl !#'Lx(,ݰ`55 Q晴$?{A`3e58Rv ԸQD$~;>XEEw6`7E5C"MÌ@ucy^SGQ`Cmw#cX%ܿGc59l˜Zv bΜ+0g|M؍^o/[+sgW.q1)j*QEƗދ {sђi׭\PblNPT#l^hVc=aX*xNUUAT{1ûkpcDw__Jשz1Szd÷v;t288@]=rE?`CDDDDD`CDDDDD`CDDDDD`CDDDDD`C$7Gkp)p~cy ؁膮Tcxa{:-c;DrX<;rʝkvy4͛R?B?v@R<<&wS么j5"y?9?L/մ`8?LZu|fM#o|L&wx/.p{8<{mܙ1ڶo;s2/SS*B_s;|#%}"Դ($6ch^<<k @&1t[΁c)oiZ5~3j; n 6D5h{ߦ |'QM q6_MkɒΞhao g=8j8TWc:)D`CDDDDD5@&S^3m<^#5-'OC5SnݍЏnо/+Wpqմ)Z4ou֭7X {`ܸqzxΜ9HII?x~z}6DDDDDDU%6PUŁ"8uпxEDT7J±*Z%cU6c)U1"""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2:M̽f%x$CGjZ*"N4jݺ}% ?`nF֕t^zڹ1xWүPczb$gdCy`S7Q12[aU4"""""2="""""Ey1111194mT#=:˵1T}dfeŋP+Y\|GD$wmhrsg45)V,?ۆ} J\OYu:gn[!>3U ٶ-_w u;BQO؉KbgzIćcuбW+6DTu*^vv6.$&C5T':BZʇ%6DD5y-[G1h)XgVbPl>Բ˰92͘(vIO ^O/4c{6lǮP;tcB$옇fHlRMDD&j%6DT~Q2="co.ُfHܱ /].>/GB+Q8S[C!K;g5XR:V1 чPzb1iOD!QDFkJ kHW$o:hVϲďմg1z݁. /X!ܴ !{ONNh阻;RCcݶwm?/W!vn!) oGE8p*e?㠞<Ku v|z.1W?n8OE. A؉xeDj;qB ~ 0#j܀W7b/Kx70XڇeKi/5'xuL<E!,zl?~Tw)VN NDDdr 6DDG*7xh]օۡ 0{}_ o߫[bMT{g(hOAe=DmFww -9ΖG8ӏᩝ*E@[T$BC>AN=:I /BsR(5 l6f$""* UD;,gP&kjlPAeR8^^pTk+9?'pkGn$YHI)5""2""~S= 2; Vs >ݍhve#B.бsb^0n<3ێưW?e0MvވȬ42o&:ԴTDvd݉k&cݥ:6ۓ/=yxKk8rRmMwg8u ͱ9{uB`pW. 4g467[kqrpp@ʖ_ǍI^ yM,FrF1g 6 Y_^ ?‚g Zce`êhDDTi.+ob!"`CDD4#*    {N>m L];w1JvCݺԱ1TLDD[tU4džj4"""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2:M̽f%x$CGNN_1J+1*.` /33YLTҞx|QE(H(x~?MjZ*"N4J'?_8yQyuh߾b|B1DT29ɹ4/^ę3QٕS 6FDDDDD`CDDDDD`CDDDDD`CDDDDD`CDDDDD`CDDDDD`CDDDDD`CDDDDD`CDDDDD`CDDDDD`:cF˜١ƈd!b՛x^ ??EL)J=njJQW>b'uN3+f[aӊK7#? Sly]Hѯ2n(v˘^#?O\a ES}!6+1v#c5Mx]1 >`rKLxl9lg_W;/TH5M%"R1+0{jJk.{HKP& -ǘ(vۉXC0^v퇾..!rV*>*9i z?J3qI'I/_N&.^~ٿBQS`ao|߶ESc,o$_ò產 $zb/EWtjyl؍8c6)9b<:bx=Yi[ϢIezY\ӤLSll$V.oƘQ[b,<;2[Y łSYpuYW—0wR̟:O4Sz:c2jɘ7aO ecTW&ݓKm/OMY"c< $q ॏCTgSyBJ~d⽐x=Dh*Ϸ+{][ȶނOF*&5_o!E@L+'1ar5CCg5lX8RĤoqH8Ʀb8 4+ 2F Nc\6X<k4<_umQ PSڃsƸ& ;ƪE m~Tg`ٞ_H]mY]Il~A)u5fHO`K>.7˯R1or.Db쏰1n{a$:p>^^2˚q;ozy6>ޠ^s؃)W_7_Rm¯jj@WQȈ9 g},jա_[_a <_u̽?l~c̮Ħ2U:2G& ;ƪ_?usuAޢ/ڃ~6o"-{R`Svx_SRpٽAA-[~e£jӊ{ѲG>j=k z*pD"L{V|_U~0:]'G!xCd8)ZxeNY=^|ރhn" L= YSaZ!oZ[>n{g|;kn#CHMk@Xy /X {)fo#HNMӏVc`N;CНjCmz;1.{7{X8g/XSV-EWL@_cXcUH ¯NN1>%~@[M<wUyXmU첽 ;gW1F+S]Cھx&XiUV "m՗T1N8rpv*wwS'v"Et 7â |FcEC}y#J~};[bnӾyTWw^ج9p{B0ݘl_cu?i-?eB`𪂿kqo>dgqGccdXe1V;U9LU~Aހf-~րvK 2_ȆuX(&,T}=k2?jR=Yt_M =u[Ɯf!Cn a}J` [ԗ/AУo6DbѸCcP>dM:{Bm8d[՜*c<ƨT9ۤ'k@rxmx,m>17ڀqptԏq[}CC՗G <\.ex3\GS5X$fΓIq2cg_MW%NV˞>c\/2R8;//+۞³u67U1VHxuI~zZ~M+P9{882L˹w]B1L?q<zUyr8'_ *BvYsD hy#4ѯv]yۃMѴ<^U6TcAZ.꽟#k -(҇ފ;g)-Db18䅠?%}F?N)jG/uѽL] x>xX1]B1^(ju? /=2D8xl˪O#՗b\1l6ƗM]4z;eab|srXcs1FS3ONsYcwO@y]rK7˥՘"ەAOEm?xT707lMhyi2e5/#UoU.5-'_v/!N.qnOOuѠܝq). Ҭ'\Rp>2m^e3Ky$^ I:NGYێQضGeƷup5 _gc= [pIT6!/[p}Y)AeS;o/9ڐGL/Vjy]@bVs,@8X. )QcvMsj#zlO1F /{%g,ck7vHQۖM<,sl~}69LcyqUqT{S}q0X~ڷ1Ts1p>!N Yw>>u 8՛<@eSsNUb$gdCy`S`{]yxTf74T3GOO3}yH7,T+>U8'{cЪD1QY0111111i2e5/#^23 m83JܥYQY\]~ =?X䌂3QS\aU4"""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2="""""2:M̽fxwzCDDDDDD7֬i ?{ $ذ*             KGQN!˰Oc]án]=N8""O""*’"|ӿu31S{nE^:\S^^LDDtl\Œ_5V$ȿ~[0Ms}|}_nni2wI 75  Kԣ5ȰSLf5Tc4eTA `,IDDT~ 6DDt]zmKhҍaaqjpS8"$%%*B9;ZR_)yALJ. =S'PU΄Mtw+݇t6e 4jꯃFѮqC4iP_mA˙Y8K):: ԶaVY|C4Ơ}k1^2sW܍"==q'ꢭXwx^F8q Soc19Eu{;rw>V233띁x,ںFھ爈+ 6FD&=bb ގu FFbt wP\ĺL87`cbx뮛uHNߨx~Px6\3aDB:ez&*%5 j=>8 »E6Cm?_? nzO /55a1u&VHO]H6Y9WqWXpsM]]Ш LuhFFvXzH5T FhhqF6^F8znP8zQmP.\6DD`CD&ႁ}{TݹK,BT:^01P^YYH˿?9YYhD:_FOWPqtձߋ*<4ʅ8}1Y_s%Ru4#0~poxH !a8Ctܜa 3_zKo<;^GLLebԂ11rR嘲&Î!6% j^g 7vt05~YN,X\cѰMU$y"|mW X.e£==<0-^ta~9c""`!"l TvԢVl;z!aSWb5hgwװdh㈸p I陸L=ڦµ{ *|HU4h,fܠxwW݊Z=vDŨl5۱x.JFrFn~:$HT{N#6W%U:B|)VJrx`P TeWR;.˗J5FEBC6>ܩX0̂Lq\ + [w /UZ.}IB&a4p@xV˒30pe)uҳ:;#Ugecc&`T@shnk#:S0p֥8r ΄_6asd42tIQS'YH֯p҄4+Mڠy8{* ynPc%ӌ^""c!"sq˜;nՇo|C~,:aX,fCJ? hK>2,߂q:kbfLxqp/4iLJpF}3c2*99kuTCW?Ss{o};`BNc Wx%mIPyn`w<ګn]cIi)ڼ4*ФuU,>//!>p'p\rGDD`CD&SPР+gV˰x$]v6$=/ F ]ulx,;dHJj$TH?줯k5J!CH5qJ߆57oY_#듒Ner!樂 7'7):Ñy&F! Q>M>TV4_IXZ*\ 6jFQ65O?5='߼j26XT~ 쒴 "L yMS O)cW_|8a=ǘl.#y CU*86*2;p/^Mu1 ߇ץ#j$8H{L>PW3\4,GM4߉W`ƆPff+XD$iÉ3z>)%-ɲ}Yjxͽ85s'*t;ౡ߷Lwjv^ 67jߗPr[zw37䶯pa\0Ivv%]*b!"HŊ߷r2F/74[ꕯYztB-ayU:gH>)fu#˷viqxE] #CUxn`}\]4e­}У P"!Ch^‘4,; ~DH_}4n~flGrwc`^U}qpO5IJ dXm'@%7s/.TPeݍ9˰UsNN j[ h\UͧU؃Qm`CDpa1WFny ip- \A>s9 9W=jOJ$*0H@[" ul/ΗcFu G_/#$ >r5ҔT1t2^l&ȂN^xyHonh!0$lKn*7%* H=*9cxj`Suօ DC~kfI%cb!"sڋϢ#ڱ6G5W`cLIΐ HUGN݇ :s!慄d%/PJV>ÝGOMFn rrBV& Y[ٶI)zz28;%4IR$KZM<7FEKw٦Źnԙpr?tτ]YֵEGLMFIg9kK`j2"2o7GTyByhj}Øvpy,eeb]"&YdJPPD7\d)f2&㣝0k^lp8(@$tjtJ)Yv\)1;cӼbbz=9C:@I쑦۪# UpqR:N*vӊWZ1  F.跿1# SU7m)F9Yɺq~Xz ǍoK??^ol Iwar 6Dd"٘+Ʀyv:_ՠƈh]KB?st%4d0eM.z!dX#ȯ写jRj&K)"<Գ:>=^j9Y|\K}Gx!%YOVt?ޘ${M6ךÍ}{_ǵ]h1$ZHKuCpTaZ3{q93[_/DI2W /}+d܏t6i8@bgݿ!CQ>6 B.OJfnޣ[WRAG'pR"_w *!hoH\ysmfeF ]rm-:5\ZY:ζҥE'L-]G."pF~ͦq@Gh۬Vڈ!"2ew\ [ce [e'/;t]UCJ\>5tSnU3 %iݹmwFޢ 2d5˽ƺz,+ H銬_wspZSFx ]#J FJ G47=k{̺6׫ǝLL‚=-U s*aoި3O?uF{cENGE}96]K[!ƆO7l|iy ѯ?UF:"J`CD_+:>;\<>q@FJj|anwc}Ni}jn$#`@:H@1'dn6Z@# Fi @iEMBT_f>bfDvYƞݽ޺fkP")xG8cuW s"11Aƾenԙ{ΖM#8)Fs {VAyu(yn5@vz i0 m!sEώHHƏ"t#RK5swŽ*Լ}`}OcʧFbXhפ599To)P#F|2^N摆ک0h.xg|=X=z75{tȵ8rkjRZcݘ{y"(Ǎ:3ݚ(]}G$.uk1dZ A>>e'э`CDcqW NVb2E Ln&e-껠trSN/:fv4>nn,%#SWI@Cg5D`j%x>ERMzeT`So58 T9Q!bMs"= a]@ͱXu J*݋f.J_XeiD>Y:Sq)3o\?'ɾ7G""42>$$hH&aAƈmhTFE=KrMrz&RdlrLJ`E#}!| ޞ#d]Ro/~vG!GϪidݕUPCDD2~`w""*^$!C7T ))Kuڙ<ʲ"wW]m[:Y>c 8p#UܜЪ;Z7r׭>ffkG_ԥC̴I FDD`CDD$Hu4N? "UdXˆ5ȣH`7wcݤк9Žb۩s:H9pq9++w=:ɣlHm[X[T2DDT1&˝fƘu,!% :oVAޮUHH9g 0yAL&W׃~=:""""""^ODDDDDDs`DDDDDD'"""""8(NDDDDDD!0p"""""" Q B`DDDDDD'"""""tnA=8Y[|6k*w9ưy[hѴ%~bp;^\P~\Nc8RePyEk<=4Z'׺0Ϟ8*{1pZdK}" UlSb"L$(ܒ" qة9qbpXhE:S \ _S֊RTǿCRzcR%QeOiBH7{?UV&Qu2a8aU'#EF&[0=Mƛ7{IrQh5O7BW?{_6c"i{&qe`dZk)FMVGqʺq~"vcFIf؝˰¯NQ3\zYapZ1eô3MD0íŏ~{dФrr4ϯhpS/HG)LJ*+*J%y:4'lpWQknjm4Y;=. b݂;chftm~zyvVyVZQ.Ɏ-(9s:.Z-5 j'Tkۯ?|sy ;y(ҧї_>|w[M+0mFddaޯA{ЩBYfd?7Dy.8To@w|y{@ q0 15 ‘,g ףyx vwtF?7AWNK)+nœ#]CƧ7 a+T+qV\V<Â6Sγ!E8;ހܕHC߄Yld+7K.e{܀(ŷWz׵w\T`JAŞ'ph-8j>TJD?=N{789mPӊ5ߍ!E% ^-?F>xWbN#) kq,:y3Ex=B.{ճ\#ڂESOCUJ]SmԌe}~F;.@˨<y38b 8aT_ڮ1L#^(B kۮͿ^CBq \nyOͼ~ 0;>1ѱv1S9u=a n^Q395_zC^])}J}^jE3.4LL6-սa`I+ OU Q Q.*֌N\iCmqwO>+C΍U=uV (*4't{1;=d&Xe|r S^9HC&{PҋA4ɴبw[Ь=+9#kFM*M榋KT)OE\oF\XnjA4:^_k}"huD V^&jTC?F:u NL5U2wB6;ͯv<.'^?:w =mrJUmnσ#0"-UX k~[04ua0|tY, \!ܾs>)z u^vYYtʊtC=|5s}ɣ'm-O,=%6n ]xsU1Ǐ|EC)]P,Ə.~~vj- qW7*0*q`]9$GMV{~6ʷ(\P"qA*DS7ٸ'1;,ۏӮbt mCDZ^ݗRԫ8^=E[܉r-)M^Ρa Cvu!{{zY}OW*Ɛה6xݣ⸬Ŏge~j߃kxL_EAXhhs꽿SoQ/ryX_GڣQw[]f/[ '5cW*Z_y]5Ђ=r%`eQٽ%mL9s8ޭTϒЧx+xŅ +ǁOp7x{Ka&sKO&bX)lcj_esr/TD#,tr27[obQ~glZ]CNt mohk"-CZx{ GElh3Q./y-jkfFonv:P>U(՜yۍՎo3d+l)A\߶8cuuhߺV׊~-b=uk}mV[>x U}OyK5eSvnix oæF[gBOl7q]9>6hKv(1Ќ;ch[#5h.}RQLULc^,-\qe:%ˊ<9'suh5Y!l~Ma݆HvHW0bTX~n-B*L@ycK؋\5y!Ǟͫi8YaBJF~ ;]˴Ig̅̂YNPb bby$r^&Ut38aE]vใ*$6.#R`Coflrz{<31iqA Tʛʝ~` δ|LwOMX-lM23#_(vUľ8Y:7F\ǹ~=FT>7#;)zQDC~Ρd?yhD3ɿ{J3LeLBvֆ Ʃ j.{޿Ԋ<49(5X2rY _*"""""z0-r9Y;ojj;_[CZYsWqKӅkpY4=?;gS}~ԟԷE*؅[JΚiC#떦+gpffxߗϟć״?, ;WNB&=OȁS-@x4w|'?=v2s]pAMGP8R={ΈR\902 #j, Anj7&7bV5Tp*Ȣ І~ߙ+x6 65Uq`Om(ORyDDDDDl-۞[O=*+UQoÕ3t\c ?+W|+Q)fśO >f`[QSM[_."5T03Q8 gjF0jjjP3Ibń瑇kJrȁS/FGѥm=.˥"&2db&9~m5v"IXwg&\ {^"$Q~Jgo|6C_wx~=6J́L ~Crso@(7NBJ繹oلP>6_}DDDDD܂zHEg(?99Gwqk؊䬵XڄFLUCZg{on=GSEn+FT +3 d;jG`3zw~nTQyKoڨrh/<}\R8QNhjllŠ=^JyV=ݝ*\Kțo~/(,y0MgϠKΊJlUܗ`͉T΃x$*%pa8r}}rj@x?no"e*C$ɹ_|ģ;#w^dmYYn h8-ڃthCsJq""""""Z NDDDDDD!0p"""""" 8qXD񫶶JrhhllŠ\Co Tœ? 6mDI x#9nhė^WS8^,~))) eeU/WxQ9OWZZ*V^r(|IlظתS8`4N-_p8989Q S S⊓jՖh$s!e]./0L*h:.`=/lV^II*'| NNyRթBEݙ#,hCHlgX]gmkЮ6-\HXH}^:TB@4?՛ltwdûUȸΟQ T*Bu׀T"BuWE*Z*T\}=#lJ>׬.=Sw`:t ">W`x4}[u}S/JEh!f5yJD}-Q5}+Ss:#&*]گq}SȸΉqH"`}S( ܣЗU;Z~U4Dԗ9IwaعՑ]9Rq_:#TdW.{@"tG"sc@g[tzWUFbb" 8͏8? |ѧ_V8~ϿRqtǞSȸO ݑgT*2';|\"xF#?puwB'Nu69D)Ϝf ð.?gkO~/TdsTdT/| cOTd%OZyCIE-p2ʍBB~umǞU9K E )w{ \ #o+@1J7->/^> ODW_l1"vm6GU/t(oc4N=NDDDDDD1(NDDDDDD!0p"""""" "2ݪERMbRϿB`e-ճs7/vYF}Q5t-+O(-Z-jr ǃTڷb{D]vz![( 3_҅<Dmpv6F;Z6Ⱦ9r웉b"*pLvV,Lau±XvyD=;7y±+PhG17YesB5KW;l7R(ͥeS[CM ('_+!рϭNB Z/v^ Rvbqz6:)Ha X8PvE=1^t?:qr^Ukl{6(ׁ +6(ПY?t{eюLKJ)E5rr'cb)CYy[o j 3h 雉b"?$F#eMKT֘ mqˆTe_NVX_6aeTyMI^He#_~RAX_N. ,K- .-D_v!6mpfXaDaqNOݟb֎6mdX=K-a<1Lj`tV=CD:9SkV upH=CD (,N4o~(3; _S|a$wgA'ݭ9'ܨVQyc\N.^'?!Pp'?QbHNMŋ'זTK_6l,c"Z. hiy-aɓT*PNq1y--({=gN3h>;;YQ)*<˫h?Ŋo\43'W)I#GǑǕ+W*:) X*m0iRv zNI<\i֙Lt:a0T==N)AN\fϟ4i0BlTL bזr򋘘Gr~f ֦` >~uEXza^g_= ʲ.y) YV.u|v_6X? N!;9??FѦrq}Cn'}nR,uڂһ^܏:7fo3Rmv.]͈ב~5'^/P{ ':򟐒{wƌ4÷"cU r#4( `zjv(KtkV?_/e0 &ucKD= )<<&&&2pzH"pZbjߔKMMQo )` XO{'B|--хzT.ɲii}_J ?WzR [[/юe۝fvF\o/:nYE:VBbpHi1E שRFFzDZA_{K쟩a{cxף*屦m*U)&䭅.5M刃Se"?h6 7E7{ʜaMnkܣЗnxrJE}6( U8m ;fבٰ֢~%ꤾTٺP$1vށ/ }~W_GT#ܾ}WfLWWS/qQq#vP\я:rcwR2Ͻ=&|enc;!h_Qdg.VˊB\Nz0}ZP60`=P65';`=^[䀲ɹ>i}ٹ (kJYO[7fٿ1#g=6'9 tY YkR}ӧY>yĤ eWh{=}RoZ,AXNoᕖry V/D_6z!:'O|D &~VD瓗V@8!Sbf"o6@ΗK6d{S6l{%eAcm/6(?οI"{=YV⛗X"ɼ4`H.xy ZVDNkyazf|b V/r _,a~uJp_]o6;-fYvɛoz+ԋ0fSDK)'"""""Q B!T"b59/GRMtMJ5I ~_U)3HH{;Jy~eHeO ݑgTJ)M ZIW)O*})v%3i8؇ƀiYNf<݆ٛe٬*5k8-ٛUr\ }mLԬB8nTw*w3ӭZdhp~K!7)6߲_A*1Wٴ]_daxV6z!4zqS{J<"㲨^KJHT_$=>ƚu%oLoi~aש>]&0XH w{ڠMq 1n빿س*'%'XՆ^ߎ-pY,0lms6Xs(.`7g)}@l}^SfgO^kggc&ѶR۠m]g;7Dq>"ܾYX6N1N1?ΪL0p ,p Ws ?p`SN 8+X`SNZPr`'8k)\ i i֭`SN 8+Xh땴z8E?p`SNb4?NzDDDDDD1(NDDDDDD!0p"""""" QU/8^bV=m* Str0L*ł)#aL#1ifck\.8]N^YVvu?Xg4D]YHXujAiT ՊQ#Qp80*݆SJEfk p.NiGጪN˲gz}HlcC)Nk :}km;Z@zE S ieVGΪg՛#_&8^,'"""Z 1p#'"""""^q^qX\qJJJBaa?JDK iiR9D80V)O}P:Sl#-^~"+WC N)++;vlW)"Z.Ν;}QV^r`XpbJѼ^z]%HbL0p=ihh(onF'"""N8- b/ NC̏CIN=Ѕ^{W&&'t?8}qrgfkKpȇkm!eAՋC^q +NPeSbrW^>W)"Z.>|8R9D0}S NP="""""`DDDDDD'"""""xS ؋=N;7MD>yK̴_8͏C, b/V@ !bWbWb/Vӑ;s:ct m:rXhЙ0^OS ^q- bDDs8-O1p'"""""88=T*:)HLLT)"""ZJQd\N'&U*~^GS(1hDDDDDD (NDDDDDD!0p"""""" QϪ'gԻ^]RDDDDDD;;9ÆCB`DDDDDD'"""""8h^X[вſIENDB`hip-rocm-6.4.3/docs/data/understand/programming_model/memory_hierarchy.drawio000066400000000000000000001071211503277241100275350ustar00rootroot00000000000000 hip-rocm-6.4.3/docs/data/understand/programming_model/memory_hierarchy.svg000066400000000000000000001033121503277241100270450ustar00rootroot00000000000000Grid
Block
Block
%3CmxGraphModel%3E%3Croot%3E%3CmxCell%20id%3D%220%22%2F%3E%3CmxCell%20id%3D%221%22%20parent%3D%220%22%2F%3E%3CmxCell%20id%3D%222%22%20value%3D%22%26lt%3Bfont%20face%3D%26quot%3BKlavika%26quot%3B%20style%3D%26quot%3Bfont-size%3A%2017px%3B%26quot%3B%26gt%3BCluster%20shared%26lt%3B%2Ffont%26gt%3B%22%20style%3D%22text%3Bhtml%3D1%3BstrokeColor%3Dnone%3BfillColor%3Dnone%3Balign%3Dcenter%3BverticalAlign%3Dmiddle%3BwhiteSpace%3Dwrap%3Brounded%3D0%3BfontSize%3D17%3BfontColor%3D%23FFFFFF%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%221007.5%22%20y%3D%22150%22%20width%3D%22115%22%20height%3D%2230%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3C%2Froot%3E%3C%2FmxGraphModel%3E
%3CmxGraphModel%3E...
Warp
Warp
Warp
Warp
Local
Local
Shared
Shared
Block
Block
Warp
Warp
Warp
Warp
Local
Local
Shared
Shared
Global
Global
%3CmxGraphModel%3E%3Croot%3E%3CmxCell%20id%3D%220%22%2F%3E%3CmxCell%20id%3D%221%22%20parent%3D%220%22%2F%3E%3CmxCell%20id%3D%222%22%20value%3D%22%26lt%3Bfont%20face%3D%26quot%3BKlavika%26quot%3B%20style%3D%26quot%3Bfont-size%3A%2017px%3B%26quot%3B%26gt%3BCluster%20shared%26lt%3B%2Ffont%26gt%3B%22%20style%3D%22text%3Bhtml%3D1%3BstrokeColor%3Dnone%3BfillColor%3Dnone%3Balign%3Dcenter%3BverticalAlign%3Dmiddle%3BwhiteSpace%3Dwrap%3Brounded%3D0%3BfontSize%3D17%3BfontColor%3D%23FFFFFF%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%221007.5%22%20y%3D%22150%22%20width%3D%22115%22%20height%3D%2230%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3C%2Froot%3E%3C%2FmxGraphModel%3E
%3CmxGraphModel...
Constant
Constant
Texture
Texture
Surface
Surface
Text is not SVG - cannot display
hip-rocm-6.4.3/docs/data/understand/programming_model/rdna3_cu.png000066400000000000000000016032341503277241100251730ustar00rootroot00000000000000PNG  IHDRjTsRGBgAMA a pHYsodciTXtSnipMetadata{"clipPoints":[{"x":0,"y":0},{"x":1130,"y":0},{"x":1130,"y":285},{"x":0,"y":285}]}!V6IDATx^U)oҪKVqXt0l ?BK I Pӌ;cbMB3`7ٸȲ^h>o1ݕʝ}~=[m`ppp32 Flnb+vpt:{}}emv^~Fmsss`:6cwHXYY;}« wO*]I;v,W_r^t'OЦ->eYsR]soɫ:x&&&Z+\;%p)oOEsg:E\ϔDNceXǒS3s?TKγIy~Ѧ?KQަKm+3j]?~:*+ wnq.-- vJb@Qd/?IY| ;t/Jn;2?W/SJe3ů_ CxOk+KՎn˾a(W#kU}?`~#lOF~gJmJ:;/Jk \ujjd X}%/mdzÓ2/,Ux.~;`gK%χ\8 %=Mlǜ:vFF*{PS" !ASզJ6Hk+UNx pHU^^[ow7AQ'oO`;_ ?~xu92T_vTtV=<8`NNNƾ}b޽M ~ϔ ߙr%i:|&gK;Ϗm*{鷛ugғ\6Rm0O}4U[4;sQJ%pT*汞ȣJr뷹QճGMu*>$6h4W*<>:<~r\ku.j_?)MW:pii;O<~鑝jF̩SڜpQb×*TfGr驟J1N=Z[cH}5?ǎkhvv9W|$e6f/n  /0&n`B*袋;wЌE3>?䣬v|yաd/LWoՁ\J*צ١\QXG9.:?OxuڢM>.;ك2Xצd2tK/mrK7=觟>K.;]J.4i/d/rnh_EhSCx@~dN }4_h_m>p:,^p-}|CЕm(d2ק>tKC6dM mhQ>}!2fGp[pɘ^ʦ2 ڕ.p\Cwn\ve~.*ڊO<Е$>@z/hF6~EWڔ;|n}С6*NwxѾT?ص672!7yI/<_pF^}lKp zC3y]20G." c}ڀ vp+WLo+ x+Z'?mb v]_mC(d.\|#=#\IOQ}H9:PNWwɏ`Cڰ~_i'*>'8\,S_ڗA_ zɌ#;O4h.p+_pB;e'xsYlnI6%Ge[ޢmY+;֯Od[C J/Mы'yt sxlEYP_Op6'C +;UD62z?~Z6@:-9Y|\mx_ՁQy`ӿ)>xTNf~ .z\m=دD@z@;K+I`C\^t+tsg䉦_ـTq@YѢ\Ќe49O8ЋO|SWci9XxKp~K~0||} I!?} \tL}`Ors% p>I{||zؖ:]W|8eh. ٠w;}-pA=d ~}œ6~ >,P6 6^?A_+9_6Jӗ/\|Xg!+G 0#a렱2Rk3!u]wzH`dx I"8bѣMA ` @u]mh '<Ťߘ*UGxh$<8n)Wh8} a^s5M{o=\}M. ~un. .|5 O[R9KkYi7E9Kx3N]b|]%c0c$Hl*I~36F6'1O|_)=IOj`x.GpŃ\2E2x(dx'(9HF3;#CvK<)Oio  Σb>3}…ORC Tх^˖N}exy1ghF>_b[d/&[ъ>uxȅY^B6oOO}SOO"$\q1x%/0C ɦ_dAxt,j<{䧎49] ًc`^ȜGVYN|A?X~7{Z?I;pT{r%/Ћ>OOrW=sO~CQ45_ԡ~6 [mW{>L7eVx;S2!7|.2)|3=5돫yKFydZO 2V\dAhGb޲믿PC7K|S6hfᛌN{S^?ءq\>EY\,/x-CTGy:e`YܵO/ȏM9yNkf/ڐ~s5N+Ρ>llᓝ8 dN- sUvNQWc4{cObyor+up9Fݐ6h#cy|MH`GÇ_ >/6!%ă6ld''8OE>L/2?4\xDpp)9ql0`ϒ o2^om`Ie2>FLܵaԕ-ɏ~is} }9fmL%/*P \KW`'S@Ɖvp*G6-<ژt^2Kr[M7x7zLmQOOl ~࠭/%s>vGdM=kn+Ӂ89 }/q4 bnpՕE?}_6ɇ ,C6-ʲfcx! 7=E/ڰk<$ ͟!XDKct>em6+{% l [+Nъ(Yf}uڰD84`cdN莜*8䇆A]{C% $/_OՇIJL";uܢG&s2`d/}dQ6Ȃ̲?0Vv$z!c9AtzЦ>pȇlJ~9;qMwdO2 x'ov iÏɓ~VWړ6\;4[vс \膻l]ɏεD~\0F]{3p)d>p!Y6`zE;F>>v oodnF̟jRGzA}ŷ~8/:(Z,.FWC̎*!x6N?l_,ykJ~%/#?|ClVz'mfxG;~ыьO_vBg|q>VGp|+mN;hFR-oCK슭nl>zȀOMlmb# coGhц蘼ْXS2ghB?mYzk7z\t& 5?[(Ó:4O>Z4*Co)ϻݓ9Ѝ[<+?[\`lnjK^_6ǮԑSd\zeUF yrExOlMl=~Acp?_k9H%?N]q mda|n8>x:%WpOlW?cl2~ɋ.GHd?}>l \؀>|ooF6fphLL4l2чM; rBYC@6l~х/`ڱ?z1 4Mxnk8QKuR e/\x%'2e֎<&G ,>\k7=^'C=^< %q/\&h@ pQH8!&1XPI0681b>ę0H(RGQ -5>tCd 8-1h#HV ʼn$Ao~ăЃ^āN9:mkCy3Mړ)Zȓ0bUGIPR.C^4 y5(#G7!=S;]zPfpf0vF)v@' +U& >zB3YO lkC$cgǚCk>;`3Wz+UɏQ>dH5ࠑ\ؗv|}参D8ݠ-2,=(.r'/ j2^ }_؟&#=6IW) .:Ã:IMtUp7Щd%o;=p} _t?ЍGCp>|…&C`hcڒ' -z#%.*D>pgo2.!wPwҐ'Q?p^vBh& Yѹ&46nْ2){9e w2-.n(F?'hVƧ>dA6xүt>bnZ"c?i.;Dy诎,'? m{Q/\l-|  _'M'0mҟm;K~ŃD~7|ȜѢбs!|~8p3pчopfW;⁌{l };uڔ?x }d䮔Yq|U6pJWhG/;ѧKڠ =у A_-kt%|_My2/؏ϊ%/< zQGh};C_;4mWE^4F񂿒+ ݊0hc!ace'doqD rN<ǮٛĮ؆)ٳ?|O>m<[l#j,O2F_@}ڐ G_e)п j;qb6>1&Ař2yFA7;QGNeǷƊAhe_px"g}F, 9<%cf}ڠl%=h#fC~d>}OM|Q"E1n?Up6kPdXȁ ɂO p+.eN}d\qlтWkk.y[|kG+=αd/?q;tN0\/IϊwhE8J6Gf퀁%( ,0dh7Z @N䅞 lOAO6d9hC6@?z˰CEQO9 F .ic` #',1e|te|L$r 3"v]ClBLS-xF?K]M|ݐ!O}Ȇ1H?$/+#Oϐ~+C%?A‡^pѡ}h Oɏ̴}pk~l?}xPf胛 !dg2%?V# Ї=\t=gڀKtyu`ӯ)^Р=v&{^v<+NnoE>_ $>j/Z[Os%9/n|dI/dAF^N6†ȋ^ԑ{?u;:!|Y*=Oƣ:\M||=}n9{3E7γ :?4>ݲMF' pG<4\5oՆ%搻DON|_;ܥe5YM<pG|O&ѢY.R~Idvd6ـ!^WUhSY_ oBS҇-|I)㛮+n[Oyp/@>Xlч :$|BNmvѳ/?x+n~}M|p&a3?=O`I<>Cfl-U}Np&BxT/U2vSWAALl:GhGզ$h9npjlɁ+7|}v"n[ It ݒEْTB yO̮xG.R~F~W|O|GWp+9nCϻևݐ8 lto<zY͚W/^! /xd?x+ĸ ed_oγ[0q9vBn{oG,ݰ%c(˖7|Ç+蒍clec6_ɋLK~ړ[AI96/s7$#/rDC3h cRj8Umūmlz}G/~Bh&76C޵As~ɗ/l 2n.21&p+\d] B)d „刌Q'."O*3Xb|6 pa dY$p4 pX,dЌ61>(#A/a0pe 80ԡ#hoƤ y,89gXڠ*S>Ƈf># 2ڕ󢃡 oː .peɧVS-}8pN2 OhD?8ps^ CU4#7FK`v\Wx"c<9+å<@8%^l[R'5 T`Í>8>\F&0 'Y-4}~HI|Z?>ِ>ep+ \} }.vlF}hȢC?Yh#}| Yq4ltEZ<&xSl|MVYHl>bpjSĎ <ҋ]b ѯ>dؗ>x`h;M'8F'9fFO| ZΑqpy:ur;|…>1][ɘ|W<=]1^%}9SzGxOG^d/Q*n:/v}Pn٨8E&k˧!CzdA`]1ٸ $ {z>QF8d{[Eg0Ȉ%mOvCGeJɘ7B'7up >[|fJ63ZOt)үNxg٭xP78 α?z[#om'ԑ %?v.>ddd%6 öحl@.kGh?6KFa話=/zɏ9h%wlؤ^cp2~K~5vg"/<^| .]9tK~M~&xb#/ߒOF\*}#>\7|Ntp4|p/:/8d#|s)? ?2;pЦM+) rb&%ձm<ɋ?Y쀋ܴaoA|O*1V|x&Y\0A'_%{<ЕN)0C9"&u@0u*G`L?'LʂyڨP9>(a@ B*܄Hg8V'(pa,hkW h((`0,.0VKu9)E@6x(`$/e1Ft.dC& sI\ʜ_778|̙J~d>BZWH^'v9HlF^W?`xڀyA:2C* 47 A` U.=j` gr]UM=!u|E8\-GA |Vf/!0bU].4ѭLb65P.'p4)_Y[\ --doI}M?|YĜ_ _SF:f#UMnL%?rЖ*I>n=]S|+F:Ot;"ХMYNK8vԇ\k@5lB*b3tN~8.|OcC^vI%?[to6:=x8ɾ 8ڀ_6>Q'm;6|/.YNzO}}|+>A+P*VЕ>Wt|v>ͲM*qʎ͎чv/b8!?!{T.1yY} e IxXӆ\iobhU Z}dvYmTRq /hgod\^26a࠷?GuD?l|9K kӗ lЃ^A+_:*?2G_uUx7Ds" 7B+ɛ .-r=j+B~p- t|.T|~ɜ uO6 WNf_w}SAp&KlTB\h!cv/yM 2 :LnvЈ(;4Sq>> W'Ȑp  l)~тop%s$ ?yFФf|SqR!Wڵ!?$ pl Wԡ҆yQl4zy/oe N/7H&$|/r@;?e7ꇎnӎ7y_\\nti?6͠HLOE*ƆP>?vLPw7X}'}b!e+l.Iojt/]~](766«?nݥz׃ ׉g_f}1ݠ5xھ!x533snɫj|~e|~w>Qpt=z8ƷlqTbs{_D`8;]yb4''{;8˚ځ&-`lQfl dhP˄-ٴv~!d|}\rl>u|/ 8tWAG)l4_% ր>R LIe0/ZeS|iC,+I_-$?mj↦Id06ы'o bPŸڀ+v bP}rJٿ ] Z=(.?vx?)~^ƃ'N}ea4/>bmm .?L 2A1ujdGzn~˔f2L>3>*v32J6!nGS?;QO.5~'ȍ_~En_~eڈ6.чR'iqD/]ۚ3^O Gq|雝|1?*=_No'?8식g'ɏߚeLbkE~8[iGn{3N7recϾeo(}~>>+ |͏azxWy_Gr'85߷oOo&덙BڧNy\.4_albv~Ul[$~hl5'M 1Ng?aol --pO$8ѯ3գ3ͻA/ ?>,N\kb3<ݕ<'{t}wp'FR>meem':r 1Q?˂]?2郖ҋN<ҋ>܍L\Żmߓdޙ;з98s&8ud.nuQxBKΡőɭFmY)?лwD~`;`FvOq!bbEi5YY10}ztbk4vS{串`xw" β%RO^G>uU<ћzeNJ>6b⯒9/mdnG{w+ ~0hNח|ɗbL,T~ ~$UQ,f}!'3/LD~8tJ hM| PpՂ\ (ۀ28 vЙKgYIJ錦tu#rNK˩,wFr5βpҐ  L40(UZ Rh. G79 ރ7aYj| vNɏ<nɏg">ѿ3O5` h`OSipkALÃ?9<nGmzm-Z`3m9! nn5C^Yݭ\ lC`ulL)gRG6a46N9g]JGlfG)j ||ad;6bsZ.863L~%iC\doh=(} E?CaINLlĎ~L?M؝ 38(OvQQ]~h ;}-\9q[OPf&j|_|pCW9#lLtM]b BlOh^f9]ɴʹn.HoS{3[vlo8Ξ,S50l ނ5(lmҮS2 n0) }p)~E q6:}q(~Ձ#6HQz%E668pVlb jmӞS^!1*&%q3'I?zjBՃ'T*׸];|]QW=_~'zse~Wlus^Kߵ\N3Nٌ_X]iC7r>icMZjxiRnrmNIފ zdgfOoHFb)EQvO/+K9GHsF$猶16ލH=g\ޗz/?~_l9!}S }kGoOk\D}^v\ȎMq_OtCo|i?ԗr[ʳMX>K'%Oܬ5fgl_Z cwsŕ66(ɜΞ2]gNMl5>8㶏_m޸5V9QE(e6+E{m5xkO >ek{)~X͹IS\暽͓lzjzn+I|+5Tq]YetXɌ݄;>\o:nEcfyG_S.Hf ʸ?.T86$6JYm>-9FuU[p9JH`|`4r%c'C9aH< puF_ϹS6`kS< W.x}-UWWxfef} ,eY[u`GDSm(ZM;2L15|9\M+y:9m ,+Cy6cZF['gGK.[ٱluD6U'+`;s2Նɇ؄Tu[)0UYRntNpG~ڔ˖ 蕥~SG`Iݮ6E r?}]}` Bol2 为pr,ԥe^ʾ㡌=F)0.y:.ep17xFpO6.paO%6N>8 1WYC*ORKm#{8zC~>.O{ep玵5.r2/2lDy~(v>ct9^.f#9NOfqxڵQ6Wkrue:SsGv-ztlg'682U&<BOyW/d` e }6Nl`8Bze#S x@k钾+We A&+m.i#+ %md8a;[y6RY0-[ur[+6)?`'1E-vRiJ}_ݴ-|m.xZ B YhC.psd,\sxtI~xO>%/ n gَNV&9EœsQ9];64-wZhw:#I[SMjۍ8#)8Kfꫝ: Rק7)v8z,Cf69폼K~A_З\#. 4dEicˉk6Ǵ;;CP-f⮴ަz!Zֆu2QAl:ZǨoޓ+[mGk~[zGk"݁= 6Ll |:1?SbYڲMbLO䘐v]NJNıXȵu29o=} `t,&+vҭr*ۖ NZE~f݀CC]9,-+-.|+ Z&]de2\}~-ZIib25F.wՕ5{-'i$CP7w2z]Ör[N._[R40}Ӑb4' m.HVDs#h30䀒F"Zfθv|fpY^iliXC9aKCO!w 5!d\v9P%}Σ<0ѻad0'{qv񨌏č'+ gqn> Ǟ~elY{`V~ڡ쯇}'em>8萵7z'=&8SG"۳㴋-EYp |:{ڢ3285mf͗MC9أ%}rxbOVt7һc  ߱&wS >SNIs&0Ic󃄡2zkRXXTu~2z0VG'UWp -+կ}j.%I%}?̉ք \=påmUѼ~No Eo_Μ$ޘ=q#]9vkb`9]7IBNƣ lc¥ X'fX6FRĶvo'.p: &s $kWIf2 .|U v=mOL:gzk%8:_!3g/xDO"Q&ߒ1.=-쏯%e0m"=`ҟs963x,>gVVdx`$ڃYpd#>ku^lp1a69% \> [Id>G}pv5%Sc$"yxj'2|n)cGdfc2qI WJ~8䢫vぱ\KSxszmSc`Ѧ}w5Vj9!Ñ7ۅ֌.1}Ҏ@u5'b;+̍R156is79fR Wjaޙ:1Rn댌9[\ԥ6m~mKW_G360>m>rJfH$1<0wvҴݹonp]/5`^\"9N&r4;c 4O=eex`v3k_V"u@8팬d>=67Y]C9M]qf#)sm험le6V ee5R.?c`|;s~%d0 6EXJ=ڪl~kE/d(s~ sScDH"^mɞo/ɺ<'ge6E4φmљ6܎nhv\`huvrZ[s&S9Q.G4 IiMRw@~i1 IOBbKXzWdSjg74һ2AUP;館ޣ~9oya+|~ >9UT(v(_w?\RgerlOYܫ妋4t妷Qz>-KYTLG0-vXF]nN=#]k/mr=2ѿdu謲=  ?щ 9.2RTمfG_ܦģ=}Gv: $'|v戾h/SNٻz~%j_R>M~_|__?exڭ)~Vx 8?;^_MSh]64ڻbi=Bv[ŭ%e̖z $غvpi^ HS*;WW{ K]|pޱx%xGR/h2(:d4lm+^*8d\pi'S@kml&-lr,lwzo`NҒvdFN+i[3M#Iu{1=f.lmǟDeMyځJ+8԰i`\G"Bѣ?zq?|_mC! ܝS+O;j#t)|[1n?K/׻Ҕ+cEzOp1~ė~na_]d!ػM)ʹaȸ=eɫmpeHboߣ%j[wɔ/'|S>K`S#ړ}= - mII/hRw1%.+.-%S)%r/|>:nW{vR=ykQ%[|iWr8t^~}VGOB<zaBr{e=΃-먬xϴG9˧Ư1~-iiwrg,6zWFoLisvwGQd"ٞ\ї[;?? h뵓Ճ=[?loE{8p.8/^3k8:_tur|ͱSpria 6cAPrpltDG%j+w~;G^UFg?s~KUSe R>!/J_;gc;jw6\d_/E6͆/L^@F \lebD fn^ zrJ+Y^ %ĥ.*]:ͻ-zzMS1u}R)`ϕ*o``W݂lz3RRl6_NIE5dƧL.Me Ic*< 7UW4:}ךP$Cd̢8^,%\Ռ_l"#skiưޝ])l2 5d/;69тF>zmZ #IWxͣ )maw.ЬL60H66(mM'O&Ruշά׿݋}63rXk"_]I=CO'ermt4~;}Љo[_!?9\i vr1iV)86'wzeTƻTn "j#oJIWr3mf,]I i[ +4ߌlQݴ5$ω/LnBr-c; S)2l\n] OsOjg0g_YL-%;Y!;ݽᎠԁ~tR^vdz}&v!jK~[θ[v6G?{Oىq }3_]eW~= |+7xZ̲S|G ם}-&}7~SY;[Jvlˎ_ nҮ?zK6 wi:)yoSwX;{?C.mu2̾k Wlsnv->Kh*|SJMWW6uK!m,؂+9V]%YnoQlAC?y \}չ3lPzc io;xƐ]l2mւ9 nmԌfy4l-ffmfwIM|5AWwhŚ,̭.3Km)(25Ӑæ*m6mA^_hnk~{\jH35kG9j/)ΡGvp'VvڨF 7ϱOzrk3^FEqo6,Wew("S!5I<϶Ɠf:F6(7|fHa8jT:+gd,=[d=h\pY\[OAruf I@r2;o8Z9x1mG@{/ 3{ZEh,6|vL4!|WO<& G|eS>yKxħ.7)wdY?#[W{jp3Zy X{Kң v&_Mvd/mҔ{{K܄-z6OYM2&<rGF_/+ow$i㬿a/uj|o:e҃EYrVOx+z]Y\A2O a9јutr ^|69FH?9o/[M>rSvuIGrxh6Izs|$'R76k +ik-Ý(pY6H w/HyvXZ,HX/EtL m"uma}V')C+ʲ`IhS-6q (O`O%mEY.-WMɫiՑhRf꼉/;4\0K1mԸ0o3-M\vntg/6n-Zhw76P]vlm?cی`4hoOc#<$ίCzRiH+ 2o2ݢo<Ek[~(;txʎS[|%Wq_~i \u: Nޢys~" ^^ᔧ#y۱䀟v=}u .|gp3-qM;ކ(,!@jfbG&ءOԆMj0^AUnQM. `l򐎙f#`yrE!{,mѱ+I{C n/۴s4fe_~ m쏼ɐ~R~3qٗ~<!U.'>q́O`u~0Kv?8}@΁`wNaGO?e6iI'/ࠏ_oJ~ostE~iՏJo$i9hy~4#w"qilC1+ϯ-[Hk;=0#P)0$eI^DITG_uFePed`j ڤQNZ ,腫x NZm N'󠬝QF:<+K\QW]+Y\mԁ]GCn0Η("# ٷcaۮj7) l h^8>˘"9c~#cCMN,3Dɧ6주儧8i\emi j2~;/}FV 6~,t5\#3\ n|+\.Ї4};>0-YWy,prB;Nڞ8fhcp*c`N7rq4coo,C w-cҪMtKǖNl3Paq-D~wI]IO8xH@%|o ZݖgE.M)_P-h&?'&-2zemK~x1@7ݖ{ ʄue~7o 2daQF2^&Tf[ps m6TM)8p7~w# N>ʧO_>iN59$fن+u>n<~9:\]?\eO'}U-dm-/Jm鮬%=Z7$۬qy36}M61c1ܱ.1Ƃb,U8#>T 8 FTXWx8cN֧p|ŝI.ޜ!d%c¢9agɼ+uD #Jm-'JCu3wͧRzcR,oֲNԝ:Rj͚XWy=փ6+i[]ѥ Afqm!-5Z^x>uKַ{.Z!W!Nj@ɴ]9vOFc:9f\^OuO[ X# flx84XeNsNL[̘8ƭ26hX03΄u8 c eUR|!}/VwبIڒ3p֍ ֖O%95NކXєhΟ]tє\yrkY46I$v+ w}ˏ$'˅AR'kM,<}+xw\| f]d#j 5&wmb N;dSƭQ>Iw"M:sO,= wKtgR9z)[*ʋ0#{(k3 gk%svSojР~5+';-Fv6v10>^B4 :kWFܢ +E/O0ՍXpB515u*˓ӓq9lv0MҐ_ϲvu#% yOg8e]EYZzsS{xIHTC:OGv4]-?兹ƷzC/:]ųJWЇw0@% 9Pdܺ*yWq%c)Miz{=3'iw5`tl  p[J6ӂX םXsΌ w^t9"zvk @4)1Ompt'#cb-y7z=9sًtMB.?}k{YYy^ydp*^ yvޯo z^Q_UYb`_}̵E~Ox%v ?e~%?G|o| ` .yݷmbgq*D>xQ3IB@lmQp>`ki&aλ:vMԁ_GR,5 Nm2˯غb6pϏЀ^e~|+F`:%4SYRޱO|Yk[KER/Nǩ+G\uMIPoP''&{b`aִiCi9nƙGQⱁD!2"{W]g): qeȻu\Sl9 G݁xɤy Ro|U&Bʮ̘ԣ=R|;^/ϋESpוuewLMԨ+ʹH¤lt I 8z |v\ep×v;8^e0W~ 9i#9{&mo.e̞K+oٞz_6gAFTԉ'!07Mvw\FL? {,q&}|nv>ȴW_>vc6v [qc?IWf[xG.>-#UYF\U޵Ez"ײ/r_b_/'ze}Sz_zֿ=^kNQ;Aݩ<ڢ:{.Av{M"+C#YK'O^Adk0m?e:F7Ghih=N1ܛK7vt_}O]|˚k9J-`I~/T9u8£ Z=fjȑ?v9x @*msܾtw]wվm1Fx񰁹;dB5##hYn$:8]-EB7zvF*g9]{>Gχ~ ɐ %&x-fO=c`H2Flcm&]\Lo7h3v;.//(9`Wxi6xn FNʽ$'ޤwcb5pp^YG ^ػ27К=˾ƅOeƖ_jr\lx}?v2.`lՀtϖǺS&' ,Y&\?S^Tn$6|{GXƧo%7kC7cj?zc1"%&TzcB?#* Ck1N\C9Φ}.r4{1d{!m,ea_n+dfIm/9D\wV|mnHbbLDzzrI3[ો~kmsᜋ)Ʈ"~wb]ln\zE vWgo 36yfvu)dYuGϔÛLǜyE¾; 3mŊ*ob3x+1pq|vcf9H m†J+պLc<]{{1"u<ڠ6jO$t#СCm3Jش6w'@t5?/j/䴰LDiS~brݖ=?|û⦷e.d9'be;;W2p Jb`E/t.Mr72֚zTswO+6fZ#Q5?ι6og<m^3ݾ^{e{[@'6SIT빨΅9`q qӛsK?><s:D\>[XMVΎ fcP/os~oҴu]t*/ۑ7yp ef !ϝi+q=wdOqUj@&}}6)xLxսznL*|N0A̼wudWzJ 1<{,^뇆rhTum"E3(>\u\=ska-yTiK 3il.1Q|0VqQSJu6j)-j o*ӳB[/=usLddu&`yId?vwiڝIf@ޛg9)tlqy$~;=*.<6./LبUWlڕENwq>٨!nno&}5QO<\?x^s80'o?xsmx=s\5έq͋>+.ϊ:|(Үb|8?+Xr{C՘z'===ל'WN DKO&=_MЖb'/Ίw}8N ӟ~ŻNg}F[Δu\\#빚nn.{)am8gEr_SlҸ[onE=]mA;3Q^$O6m,BԧƮ}D:{3H_7s8u]1s`Ie#2T@-;y G+?4yޮtycx{c Ûݩbo){pd('QN^hf@94։=xJw|gbɻNr@`eo|4ꦭìϧ//bק"}cY^:<;7s͜r`=f,Dmt Cc9a˅/ )9)s2[G>>OZRO&~gV<.幱 :fbg('I[M@P] ~?Z3^+S_ƭS ;Hhtz&6ݝ cII`ƹw|9!<ciO^HJK/hǏ;;rH1vmo/ m#qSbJNvۻ&vMLpǚ;/mlv%đX'>#y1JKcq6708袉q{Ѯf9a]n_Z13 |G*a4ͅ %E9/lb6'7y{$qbb= b<׭)sjy>y>[f?}:ӻ=ԧ?ԧ?`yn.'VWr@\p%q< zn}%^|q/{+_؆{/[X\nf dmDN2snivt&&WsIi8nw /(>^.751݌o$x6ނkIM$/1} =k ɓj5;cuȓN3Ny OMͼSSRnZ|OnR^s`_}Uqbp#Vp/m/rњ׵ᷤh_a7|`~^UNmԴ/;\N?wxfNo{{;s2@ga:ߣԣ#Ǐ8*ޤZ1x-Zk4}1cޫp3?1b?u"YK4p2nm K/=޴Sݱ|wܽ:<;zl\SwT ;fro/]\j/+ߝs9=pхbwwZK˽͞đbhfMǢS9&3s^;/G횆ުC}*cFڊGF^{],NL|u٦FM9p=jSt/- 3[pB\#yw :p|Tb<ؙg;yy'x9sSt͕1req1n)틓7(e.6ii^02NwtӮ?l9y9Yȹ8'Nȼ'i]6kɜ21>Ǣ8K6?̜n諒Q#ÏeЁl)6mҘs>Vnнw 2G;ipQc4Sݲ;P|ʗ~I7˾7lďuVNb{-+=Ʊ'\ Ih~r{גJ6 Hmp5PI;WxJ6_i.6;?>bS1\l{s3ǿcX}~W`sp`l5{O>'>/.,]o<֖l#AXoencշv)X ԷRr\KgF=ZSvdsƹ[u੅vޝҟڳ;=1xH[^[s;7\Svw ~"{pmeck|:1­ጫ#i$hks#wH3df1_Ox$fky*,eI<73nub1=9.y?o+l( 3eiV#S\#:V(5;c(ǰ'=I-Ҿƒ7}=4ʞÄ|%^E{ pwy++1n;X>V{GIjLy(5vSSv=/;~y'N}N}N}L fީdIon<fycy3q|o֜-W)iiO g~a%ffciy=' gt2v F5='{_8SٜPvM㑪 t_O.y'ԞTo5vvn)M'@g4.9`cfcSk rq!6R09Ij۬㸒ݹ3;w飙wٟwӟwʃ7=ӷJ˰2b4GV3 Z'&7GcjݕrOCk?>N}N}N}N}N}ڑXOd`6V6/ -Jܾ\vSOq7s MWrv̩q>kCqߡo{r66^x~7qn#hm6fH\ic{<<:7s939|1&20'5=1.䒶Js.d<86ǵϼ>r33sOζ>c1購>bhna)so"8KdH;dީϣ%} giҎ](sͦ^.l\3+o`<^,]TjLz'K;i8wrZ3:9#14KXZ_NÕvqcγ<̭ bn E.cXk#16ԁʮ1?OΔ5'ۺ(idO7Ѐ/m&^Y#0i=esB_sP$Q;_Iԯf |<ަɉ&mfqi1Fڻk;j_ӰEԫ=c5ܞ|F 73󳱴 lX7[oZfs@.2(2mA ;s2a{0tl3m=cF8p,ϔmf=CNyUmgZL Μp=/ÿ́}5Fx|RÇbae9~ oztKH<3>=xs#G'\Ol6ٟ쪫rrsR^~E|K8iN['fWexW|y?blr26'?Y- |?Gx]=5]qE\I_U_{/(3IH7OzQPl9w 8d\SǙ\9\uovvIw.<wN,<2B ˟Xޚ%;wM`/N %-))+ԧ?+ԧ?+ԧ?Y6ȹ=T]O ܛ(9stK}qq)#ic9 :tM1|d4qv b>t?90{ݒގ[ޒ1ۢ~:z\zilg;qjv69`_yM8u*Oӿ}wvOǓf<C8zT f}??7e\1Թ[sujg|2zS9^>'b{ cbzw|³qw;o'>FWbtz:vSJm_=Z6SgQcpg=fN{ob20wfb[j܆<|.=ؼ6磌c2ҷѴ2db>K/Ǐk?2 {ze]y{^잞l_q7M۩릐7מWs wwƞ\풵mm 0mb%AَX Ƕڝ8WvٲAe~,B''fY<|Sglv:qbXLCLtݪxi|_馳Yk~q]wJx7|M||YO zgNs/'@z K}V)G+b3E|?ԗ|n)W}Wo[HÏ?j_WR/Nt#>>)wх,>S>9~-OysKC?3qͧ|z{|W,8 s N--a W''gԋ#?9~qll^ֹӺ;s dcly>y>Lft[?Kn:\~)ܑ 5W}9ZXG{2jf||9z#ċr;3{=byOXy{fϖwHero5{;~(͂7_=kw<{9qߩ ?K8vEx'|~;g<#.xg|z|صwwg13s2}y~4zKw;frl\{B.r"YT_e{ <3(Gޱ% n#r=bg|M昒Msݘ1wr4^wu ?G\͗]nZ4>{3 ]rs~ ʍ"e3wD1yj.Ւ(؛=Žxn?Ö2yuql wFFOxbC7T5:#3[>6AO.3{'Ng}GL{9jV쾿6r'W}%[8{?uZ&M&^HgkӮbTx{;ϦWc9i[33I8^kCBښhO<16\#[6z]kMmxOBE{viwҘ7hɯtW7w_klW{ڂ1Ss+ڕLM{d`停h>crN'`=\~0G"WcuPl\Bqۭ_Ҹ~'~[;b.o{E굯o+˯=Gŷ}w+_uU1_O:&{~~'btt|^|g~zZ~LLoe=}Kx.pvXIs+q4 kW:~_K wqex]|??ܞW$i{kjmL?DIٹr)N=ſTz!̤Miw|ŭ9d`=V`fzY`Ǝ,oܤ d|1W:W1FbCsӎ侹=7\cyd#mVNӿm9z(.`|ov|W~U+)~!;3gHşK#?[+#G^uEox}|~_|7}C,<>_O2~~*͏?1v`_苾(~5o!n5. GguqOsoa>v]zq1wߕ7W&ޗ~7ƟǗᅫK.΅=O??s?ugg{H9eۑmKkTޏ?~r{q7?M]w쭁G}؅OK.ucB Ů`~oyH݅7daUVڴG1sP3k͜PC)e4v!0sѻc{lHw{u=Y=4S ?6ivMGƊ/)niNv6m&S\i˝\O~$獭=+H}7XK7^;F66ȅl`||Y8|^1Λ1x\wOƫ_wLO ۞.+s[zt~]&kXبy ڐ|jƤLU~,'d͘( )9-I298߾zs?1Z[kq*xCgDŽ`eyy+Tȹh߫}!w4m]9r9Úq%<\˝)eW-N 6cjmM1+˱kzW;l>|Ǵf4/Iޭw{O>v_dj.&IXDx_k#|M {J\kvd"hN6r☡6g̃?ZlNu~q{f R/2<2$zr:`r.y8͉`whЗҮg|j@ߺUXH9n/s+>.Jbomu^VǏز0?g*~:Ţˣcc|}Wx'<5:9m\\ueq }x[z̞8cȳ_;7sxy׾&91~#u;sqqŞ=ڕVrtW@lb]ӱrDtmo{[{Ϋ_x/1cc罹&;6'gNJ_(ЧMr}%JHHާ_֝6nrM;.:xQ{'~g5 8xȑ# ;Z@HxR~vΔJvCnzfFz~j<9y'Ν{n{(.̌lLPg\g3Ii_cac5<Oƭw~8e9Oŧ3i~[bfu1qdD۽YYX\_7ž뮎~Z㧾3c3xs/ :v$2>Ø_x )Ͻ>.F d]otlv[o|CE<ϊ;O6+řaa5'+]lo$^>vX6?2*KhLf^l_3XOƚT㩗Lz{-yЈl?>D>bw@KI0q둻cdr"G=+^y/]9Q߈ɸ+#Ρo?qEx3~#VNS1=<kK114W\rY'?F .-^[My^kw|O謮P'^qmĩG.~<)N߻/kYy~c`e=pqM7.$FVrK3s[qctt\OoOgjuUk+I1.#!#r-3c<9 9utKvgN # D&;.Fw$ֳ8vd4\1'T/9͞E)[% zZYb5ugfUމw{?W{ ]'dEfdH~xOq'{)SGw8z畛 ؃n7%}{GM Ύ믿o&H9_*Kտ04[\tߔU\o0l>+c/[󎚷ٟћ_WggOƯ D??G;^9>9/W+~m\yS쟘[']~U -򩹈tՍx㯿>n/+Z~8?cS/$A{bɸ9y/x^贰?}ǻ_}u?1cX{|(Z'}_{>X?6;zwy_zelz ?-_׾&꛾9~%n?X߈׽W~gwb^tIc~r&䩸<ՅG/o+!gf?ߍ/}~WU?暘pJo̱Ok?'̑`]:z"6NܽGկx >-^˯_y¿W cli#NxCOFS'&8Ϗ]4-=v+oӧ79d?,< %ZG)i]-l vSˋqla.-Egz*6&c1`QfP'Fr%~Ğ}m\4/mG&1Ņ/>H#|i+ozssylz~HWNM6]'7I+n7O{bll]㩑D<7f5p_|UW]6nַťϲml Ei{}i{b;cs7o'g=%;>ܜ#7$o$4gs} FLsxi'Fbu~!fgo=NNVw~1w罱;7~(K'wǝ1^򟏛[771{r"6Ɖ;N?cbly=n˷ů=H|otV]_ƛc2i SwWb8u=|X#w7qb}u?C?=qdoJ{KPNn;) >uC -GhڟLw֝1޲Wßa>V\?7m0k:1hfm浴={뮍>KTWjp\!hs* S0-y_o]E96vD6䶣 I3PVw'fb2c-#rg=mMpU9]o,>iI~FPfU3'gb~a}m|g]n|{MX4{xÝ:97ccy9ssCN{؜_#wlmoHo{G-p[^=7]q-ƛoqbxu=r_:~*/,&VCG5Kqv5+GOƮw /B}=6W38|7OmU|Bk7`ý36clc8\\^tuE8}!hKmgޑB;[K|ty@suOd?v"@{p6hNK|sY340^'6Vr,=H;F=۱ng<*X0AsNpR^KS=& `l$Z]O@5ٺ#-`li cYόhG~s69=q4ѻ~%' ɍ0mp q8E:t:~~jtW%8&#fZ;lt*rdd8Nl.jMu➿z{?{ҍ&vĈAZ1>:sh8u$&ۍG[xt'|̭,Hzbt,2u)8xkv'NnvFqGn b$߻r$sE=ӻwDZGk=q}KcD?>woN=΅dL"Swt 412;DV|wbr|"'1?w*.1>9,54q5A5s^+؟IjW*-X v_*}籝z u 6i-؛3{g~Dw0NMN.>xQ۔(kPxnu!w5Ycm8V#1}"ݴGVKF62aΣ;h{vk1ˬLg쮌boDñIʏQZuغݶ -ŝg}0kg< ˱o,|͟'[n]H Kox}wt[Ŝ)\zEyLKx#9mſ]m Ig]ԋ6V] nGTxɗ<Ū1\z¢X˜9A1Gs՜k9_tVRfdkߛsؑjfg0nx{R 1j ŞG^EX?xaٽbtBA762~҅c o#JrOk{RO3k嵴Έˮ6|S".uJpܝ1nxv%xEmkf0XOuF(ئy88/{ [Zؘya3eY rLiņwOio(vVV\Ұ28OZyN6{V3OaoZ͘a^LhK⃹wϨ/:esV\9_vz_~{XZ^{6Lu `@t種\pvyV6bjl<&SkϮAvĩ8t*hl;\Y𯲃їw+ K OezϵԷo ՝L1 ?cNyц:9\1TK^}Άjpݍ_J]_Mv I^F2JA5G}a5DNL<d3污Dۛ':iÉ2::q۵-K:'Q`bg}s3PHs5XBx}NN݉dY3]6DBr-tt c-9[҅6?l&M'kՖݔ;_ҿ9)zȮ6ˉtw>Sɻ=O~ -;卤Q>'ufZ?[^NދWR/+&c u rs%룭r92ehN wÑmmߓͦ69i/j3f|[&39HOKpڦ^m yRmH'/;j ֏;jzNZɕ/=;2\e3+gfvTۗNI[6R?G~}XⲘHuBG}SyL)\b"e+qqWO;b|I$x='OCm6rޟgs5q* o[W>ᚸϋS?5?ڧkcC7ԍWH=>;|}t-B›M#w}s/o`r<^:>ũٹD~1oHܞw4\+@=ޜ8 ,s|85) 9/:^8dCG,2bC[I&ᡭ=FLLH엃qwy)4n++6!, d;ŕXZYш>*qk~7ALUzs9qh㊣ѓ9obb=#!ͺ"dnoݞ@Ά1ժm:&mr*Д$Ql)ꤪ\v?DZ#铪L'_'Hd︕(٨ӶJmU>V[vR? 'b`s˭wM[jg7nQ;ұRH_u-X祌  oqerIc%'&Cg%~; ~J {{R#UZ~sdQ7Uc˜dO\g}iD12^_ k{Jk)S4ՀhOdZ)_߻\pV*]\w8o;w;s'}Ʈ H :S6ķldC.2;:[:a(L\7(L͍*Pf~3aܞJ/vTu4kuZ5erqU{1*V<؋JK[ǖ<*;6G>NCOhކOpw픴]cLOf=yb2@w"wcgѸW*wJL\KVZX_oj{TOگ{w\.6'ù[L`<{<>|G[ӋK14:ܮ2/gֿFSeeia#bXoGPu} (aߙq}$7I7,RrYo窕M;'}"`O7EW񱖋ijoMr=;ч3K$Po_=%i-25PnzhI=߈6Q/rJz lM kRrTk;9oMkd*y=(w+;*zz{G{=,N;xlҐOo~-f[s W^fvG0)EDߙRΕIKpW#9/13)v=nl7~1\+i)W_O Dlexqj..Fdڨ1a~,lXPبq7VGj ,z@νCw$D{J'O~{y];y?㇬ ^ɺr9[҆}`;>hٞl 6r,,zcM[ q9ʫ9RlNk(OS"n`Hw^x^u5Jfm|dF[Ssu,8TwW\|QV)|8Ӗ@zL ZjnLx=S:~ :>)9V?'Fѧ\u;#>~w%:Lݙoo% %iLK9sx{r8;k 1txK^^+9ݻF )Z5펹nG_j5kc~fnl23b/n51ŘڨY=FM'giq<3<8 9#baX|wbό}WŃm//CF음o\}Y/l7ߋ~U᷿'^0"{wzkݿq|?x؁x/boπ=܉+?tL=ԍӏ'Nw S>Vb s>I6j(7Cp;7ĻK/m7tP9Is'6i}n|~a. VCx6h}[;1>5'cau!:鬗d~q cF ~9T@o h v+;X5$md}gK3'?@kH` f~<I!W]~׸VTJ;ѷ T{\qs{+?Yൕ L_7|r6w+SNY}|ܖ iMmo]ۚm%g1;<۬i83(Yu5$M&ԽP@i,.xq_JIL75LmIΜw=ώ94|Tg|ԃW? ?!, A<{{Q̦.?sF0 61f8X?] ix(Lȳ }Wnw哇 ;vvgxUHмhg`T;<0 =|0 .L3:x,u&BBQfXcVzH9h&*T}(l'Dx ez0hm7dz!|C3L\y׏g`~֏ox!>Ի_vU?\ V=sXLaI>,L,᷹ YCs4@fε3nQL`pˮ 5tt+j6|_QQ5ncww.4Դxj# 5rp[.ϨP# YazS .(oth^l[b;l!M?po>wj|җُ>+  >a[q_-IۜSo|-?h;ϷUKثUeYooS1{ngm0;lC}v7bӦͰp߱|gvio{㟴a1OgE t18 #4;?B: 5L(5?48A/1`kꪫ|e 0Cx$3 aFcZEbGSOu P0 X 47ؐ-7y!6](UKg+--c, 1 a{@Ȉ#4<uf^XY =֧mQ;jv'?xZY~68Pp|gBx]}P~taW5_Rc.]ԶnxG%88~˒t3X qN3<ȗ<<*MIUoaXB~aU A6Ѕ0?7c}p\O]q<׻~l d JS'7~M:oq't!oJ$& 5+X%3+)>cWkW.vgnw4|WKh48p;wEsاrkySGYU|~<7Dž^dGhRL}BWY_rȸf[S<):`dR;ϳ?f >w0ЎǹjZZ騖[/ >>1== C̀K'Xgڍ}nrU~]j}[iD=#]m}wڊN6so6 ؄ge[+׾i9ĞA_dIsf~]ye_T{~wۚZ17wCvɧ>hYv'~Y`sgc.W~ͺ OP#r4:-a [0t0:@:B1ݕ-OAڶf_l,WÙF7F 5|@!!^p4n(+@NONQ=&>Y) |ɺ:ZCMf+ap{o)3԰*ۘتuY!".E`\{uۨB=./eG7#Mo7ʑyW)~|S_~wƁl}b(vP/}AC)XL$_czv̹g[sRȡ#qv'~أ4$%;|X%`q?ncDmP3jZ.zj5jXQSowa1kSځZ6 Y{YI۰RkJk:ݾY/6l䮇(dmIhg[3'k>^:bgO 1{.M_nfk>~~zO|>wZM~ Oukj56$gjkʆ` MPíj#]H:ڵk=C XBZ3<_nWuYScf*"dB!Gyėfr PCdx$ХnPSٰQ0jĥY*^OC^NE$\yz.̿ޅoK=%A: q^BޑvǸq ۀջ)V)AM$W?xDZ<8mBt>$ޅy׉4a_Cp,]}RYFQBCSV]=y zTwOΩXS.L V%2 /AO~bd gW{}Kv(&8`w{|LB8혞xGȳ+Hg߅$.nGwn({L3aa滭\ƯUHh&^xM/3R26(\9ڴj`[G? 5fe˖j빅QgFj0^%ȆV)mJKMkl[klf2fIwXq̏vx~IyOmWߦ]xvF+~_";-=V1y ,aK wąw<|4X-ij-At^9弒v&~#xwFUf':xkg‘(V%娞uB49.5Vjpws;:g! vnowt:~ngܮO?X>#Ų5ǚ~Tֹhy٥AUΪ?L8l]j2)RS񊯨zؽ+,n'ܮh&v^|o}0aQ3Pɂll.2_.me6u9v>dSb=gs7ۿBkH7][{6{ُ۪VپI+hk̇-W2%{ߏa7=v5Y%o|>nW?-j;m;zKS/~u]:OPq̙3]mp_hCd2.]CBGկ{+iޏAj8;,LFs/qpIU,~t_62E}Skr9)?91[(OUzty=&!/39xmyLكJzUNB#}% "w\-XRV4갂_WiwdUz)WXP;(sA|lToBҎ/+TLT^`1?D Es*'', B k|^L!:9܍s Fޏ(ߔW:z8gVm(\V?ՇYFA^zY\&K>cF}P¼ɩ#*?\/Q|aX9WyxxDBWD*ST? oWȧOxܘl>Ҽ,f8i-UQջ :h,PuҸ/=sf цĸ!YwEVfIkʫ5~8WWU|3cgQN]Qx>-!R0K +G>жF{YZ2u]̄JZ0">ߝ'P09xL8kG2 87a`:5%ss ;5]sEGr*5,y޼|Y *4fX9'ˑF-+#0N4D WT>}/}7^ȍgor KAC$A;v!S<M:r5ZfpLc}aXbW?f}7[F4Uxy}UG{Ӳ+vB{.=y2>)sʟO%̩@8;̗՞% SEIEn K Am ƺ Ozƞp]+p.{ApW/Q v IGy'I_9SIԋ%p'o஼U² P$= N焿e i [ɌMIBфт0Uͭ TTLJq?,)xCd}~*VWKs غu#*[qfϬB!Ãk 2Av^_V"-.5s%oloz!/> Ma SvDJz]0TVP&ƍvo~m3XVZO>/F(xq0,NpK-b724h`c,ŭxzkS?ӷc^YBio_Ц6/}u.[l#y7` Y[GQiuݓcf})zطa„p~f9awКpߗ)0t%U,^ ><ܽApd:5l_RtWMZ̚f̰D()rNRYBDJ5j<&I*zf2En< |HQ3BzccƄLQÞ JK!pc##3^tJIhzQ ϸT*mCC^t:%?EIOKKO>O94֝ijRL$[4v9ӆ3/qѷ^6F硇mCZZ͉tv\h_mbF_ͳ$>~bi/[CwB}zcvOs9! գ|}-XQj*Yr &A(9~sV|~Ή~GRlv cß?5ǣ ƮZ̶OMv:ԓT.n{}E|"g.$e&)9zz,qƊsuo9sdLo%?9x婂$WuUx!wo ]qN˱C24BQOjN[bhv[2a lhlZϳge'% BDNGl\d$Pz5mmϨ >&VL t^ϨaM}z[ėvs=wBߐ@*0_(:oq9d-.}'٬oŊ}6<*ڱ{mn$[1k>|w|'A#;mu+v+$*-yX48uX4! x\$ #iCYgW`)T[DZ %2j<Ļ>#ah0j#VV,?NJ*4R7oD02ٜ[߲H[&wٳϿȺ\a/6Qjꙓ6ivbl΄уWMtaMD@~i5,Mn74|€+?C|C^f^n wtO~[t5;?|9TXArSSsƆEZFk-ݛE65P5fXi|ģkB'+y/G~oz$]ߣC0 ~^QE+IX0u=x5vO~f3R4GYOǎ"+tؐp^ww+P(Y#x˞wgaLN;M>Y}S-" PC;Z-ßP#yVU41D,1gᣱ%e#ҹzeKǤC&pb\m\atF$ v 5Ŭk9atҚEÆgEsL+ _ÃqR)JĻFXY٩aVU|-冚{jJ 8 Lϙ3ȿhk p74 C+3%|˜}kd{ΎdmI> eat ꐀ3jX׾:ڃsk*peRF&,sSFPݰ& j~$o-1~u-zC5 Ӊ8DqJfhq.efT=B#lΫYs2edf™J`ϤU^_GG׋)̬vuMPLs&Ϊ,'ܹsh>]{jk|[CV48>?c[,"\!V_n߶"%7wbM0љ2a^00Ea3; 2gȌ 3#yD >ȇxғCK@ud poaͮP@sN{ڌi=֓|1´|>HlY+N8îo#6"º[ײ'*hC{~1#Qo!6 BqL{CMhRi"n=ɣ5{W۪nM;,ubo'fx(L Q)M-pn`u=t"* ßxnGXQx67?*m{x=+mGV$%L ޳jv K3xI Q<ߧxG>MM-6mt~hJ7'_,#'Ld=}.ErK=:'0ӧy*s¤^Gn,`!(8QzVQ][B +!_OK J\B="^ (Kf@3hvBt=8}^?*bT= kSUͳ^tf3K1K 2gkѸ,l[RiGΫJ6{s׌6U]U ^QSzG6uyDtJ5xxIf @B8ƣNsjYBRSZ#~N?ÿ+r%gqPQ0],܈Dy,0 vsx~HuXxBK%=S^F^;> wW!3J㌼hSwRdjoxvlLj,c ;2p*{C_盭mҬV?Q[ ں/a; 9%'iWߓÜǖ6iX[;VrO&JakmHO\>"Y:zzz_{pc`ګ]# S/aq&ȓ8<ƓQd(G9m YѼ,'-/bie2g͑lGlXtq7>6`,dŵwr k $r}Fm$ Va{c  b)tŕ@VWم3!w̬q`(j 7ږ"Ec&`K0HĬR#dkZIٍ+Q~7|E7opH>%3R=LSn|ޅ+zo ٞ/Z=C?3 3  D ]C盺,~O0R=vTƨp'f К5֓atU% Cu$>d2n2ōYw"4'FBDa N|<;> &g3%BU܉YøG#uoB_:ҹ:,#`۝|[< FG-+ OQ< d$V͖ltDSq5RMUEt5);lXIqG{u.a@v"%1h@rEP٪@\:)3.ߓ/a*iΝ lFgs!BC~So#l'gP[t yX~!KmXI-P,-:u/@) ie&QJXY,Ilz,@UJ6ZDgho,yĊŊ䔕?FDZ/83q*=q,|( BT厭CU(4kl>3#pqkLo4HFU#yL*Jt{g ӏRlпs#O\Jبhvtu8@JnŕWAe%Ϭ'lҔDZqfZY9awڼ, _\5VW((\M C}hi X<N s'LnbT >lP6smp:.GlA9g[Zvʳe'˟vivCƛnrk.$ثWZBY njÎ8qU-[{h .j)r=sjH_䨣g}qv%kOݰWR[.y ?lI^uk}u זwvz֩:N/^sKn8X)3mYW8LYN|q{D;$C70:me&"߄wt!LkK5J`D8_q0"'~+j#uZƎI̴ }km6抂a<;mhan|e#FQʃ{ ysPt#cQˊc!J(ޑ߅W ^0X{rmK𣏴c;A*XY#=ڎ:X[=w-:`2mZqi34͵EKYy mm->|6їx4b3&MVK#` F[ۼ6=Vj_)c͒&,]f< >eœ9$A[}8BGg&w΃` gvD:o&{ 3gqϤr9~bKɋ>3 40nۡvUn%~,9f̞]7o6oOcSE1KijkL73>Y&V(mʌ>yjкvo鳖6_ o$y>t=9D x ȱ\Im,b}[>̌SCGMP|:3g8#^wjn}oy\L f-Pq_M@ '$Ч, ҒXQc^hdɂ'1xn gBED|WrcU*( G~CȗxC&tڙ/E6km3y;#nV?Guk'->`zr[m&)&M3f>Kt'o\W0ӾJ`M)m[-U,Bd /[m59Y㴩6CM%GīKM~lX 6$?"Fɛ)g>LΉʇoM'ÁsꩧЈ{&dE~a=!x|C3rτ[6; /˼㇥BYxvvsm'x-; 9}uMh+P2]pE׼ڎ8H7,>)jÃYۼ~k_cr-; ;3 EϜvZ>퍾:׷wx<~ClǔX,IDATH*ni""wZ#՚{ŋ,l\S/LJ[xy;qW)t!RQlUڒiX 3y埲P$qb$j&^7-#vjWQFpKq4rjF>gۡ/Ė{-Xt6SldJmvY[wyz 7 [̙6}6MV5./CˢsdiΩԼocBH:9Ųxꇴ 19agh>仡F,2eum>t90 _Ҧ^G{P&gK`itz#`>Y p7`Ծhe7((E7oKއg҄ϾBWFq0IE 817V:Q`F wXsnj8s3V'PR> U;ӌdҚP4[%,tm.i!P;eL?#; # =TxvѮ\]~v ^hH>Y|K73Tjv/Ϗ}>/y==?ߣ~tG>_?9.~^e`~OpwǪ#>3pX\cl8q3~Chm Q#=Ǝ7M/>UqtY~f mko |E U*O1VX0"L#$+f̚iS8R5k48!|!n~c{l? lay}?O|쳟o-uEs߽y?{[J5gy>b$ː.3~B7;1a;`?w (/lƳb޿]wu_.{lz;J`brH;RV[}It [Z5ں&XF Q >PX (ẘ+S5^2-('z)E]dOۛD;;[q ;sl޾_W~ؕW\i?яlɒ \d_=77e\voWbqۊGrc r1(hqs\@EVN@06jRP?qB5(%\妯SO=9~ΑYo;#n,Wr>2fo/I" q_ 'wrY9N:$o<{;uK/#<ʥ`U?Oy};߱nwؾx&NU]O|ϵ#8*>s 6z=UDaO [&F̈́_1J+ف38PtspoBSO Vކ:>t ,x=Q20|f kXѪ9-S'Mfힻnշbδ}ǏΕ8smeOp[oU#⁛&='lP&YRp"n%rɲjSh۠ՐNZ+4vpyέqyk .G@|ԝ^(glI_ڃ=+P0d_y<.{hJgB(Wf /E#PU~u.ymmŞnٳ튗s\=g+3fδc=֞{y+3fmiRgsW}r쏍Rof[v]}_믳>6)ՅB_zzm% t' }~S'\WeU 5vn,*ޮAtBFC`am%?m[nV{^o+| !f/쥞巾v]hcO8vvoos{]q+쓟rr_s|F1^}_sǘЇ7p3ߜuC=9XηAYpgu;`#ᠡ!c۝3+BxLx7;Јzᷝyx<}G}~Z/B{_~9+x|^+e_nw408Ny;'?|=c/yﲯ|v-|Fy׫bxӧdCZ3M/}ž+XS2R1,OPo=a emTCN0+fK)V&pf3}R|sy/ ,#,u Yn֍}s*UkL}UaGk};m] ^;%.[rqGX츣\r]Kx~--λN8x٥/z-w5JX>#Iǟ`macs˖.RajIƃf?3gTVm'x}đ۽ڟ~2yH>;bwqFr_ھCNy Mz=fyz5vg?gF:y gdʊj["wڕ{D} BSa[md~E84b!|xd7c;?D$ =;=x`4Fjp >% gQhf#SS3 32\]ە`G٧®ɯKVݒ+|?gf,f9`-oe_f[rB;m9xq=)[_&asl'o~M9xe8%vɆ60"MUs!8 V(q7m :N6 ZvɬGF#=tt\duG / 2 Z800 2.1}8~>_v?[I]B0XM0{l[\o"{ ^}gt]|žaڴi.dgt?߷з7n>_pd28V*駟ngHpa y o?ܕr@>fY9ǡoC !p [( 7_+^  #QݝCGyPf1|<'3do{O}c+-[懜s 󲗽>Ou]g/l{8]pCu\G?j]֋5g?-o~c?;'_prBe)"xH0^c?INϝ;il1 \~ϓ<|~ً^|]zn\JuC9f|3C@dքi-އqtv pJܷmiv՗h/tSe7x=삋/^z/Q=}{ZG4}z70mph[?{7$B9 p-|{K-Znf޴ٕ`ζvgLEPcߩSzQ|+ϽoygbB(F(gp6JP ջzc?}R4V~[ Ҽ֯]g'pcgSϰn:eկq@_~iWCS)?ȣܘ2y괱գqϟ0pe#'e){g+.Ž:H:iuutZ1w# }γM7-G ;ӦL>G~ZD5,%f=\0o_5V>͘6Z,.xPݖ, O֩Vm#mn^U>t%h1_wOTړtyl p9`R6yWkU4a'_'RXZ2l7Xo6g-f64oHZp8/t3|kюc.LQ.a}vkI% ] qwWXj8%<.Tq1 Px&ÐT B0sH6'_׮ #$_GuM7}tk5[6Ʒe?ɏcfig>O{ן{9 .>9#|.ϬEl )o{pꆢW.;==WaQ+??]Fio`~ ۡb~77aWr~l\+֔i6 n|iw<>)zW]ulPY*xbJ: b0`t!z~cӟ- ]GX}ݎ8FX c <~']yNP ݗw,Xƣr0jchVowN̼R;Ew4sOwgW.pЕFhnntf|uWUMx;޶/xvLVj'>ngmx6s>ng5 36G^7mwv F2}NGo~v=w찿|0 |ʗbo[;?oްэG_i\ JMk[.s'ڙ_W \hEG[#R/f\RB N30!={<1`8Y28V֌ m7b-XƋ ]ClGmݚNwޥhK_jN9dW^ctƮ߬of74~;)>۟G_]5}ӟq{,yY.vc!ƘӦ* =/|%>o|k>zy9~(ɨn|3iD:,`ý׏A ۼCcsw} Zw p@>mK7z#Ch{8!]*t[Ic_>S1KJraUMՆF 6[!-|\=  ;Lkc|")UBտÇxuh.L3zz-]wq :6(>FfVU2p"BA(I 64N 9 qQ qanO,x*q<{`BGY _}ߴN;V^msU*(FfxbApNu]+K.u = .8gժUr1ʀ#P~YK]׃:Ȗ.9N9{9{f@GV= |;VQ{.)ۮ%j6ypu.41ʬ XO{{c+wc}Ǹg+%S0h|_wc Fz McǍwaAآ\V@Q A?+o/gE 77g?hk{{٢: ?C.^z{7lw7:`+yM$q8K$bvg:/| 90^I'(ܬ?/p ,?x_ՆQ'>0,gu GVjq A0!=|&cskk{~G>!ȇ?l>VQd5n5AGVM|\cG?]u6e$*5/WR {o=׺7o1fbш5VJpkIBS>iCW9eݓ70Vưʅ%pȗփw/mƌ b&4CNCHwFI% |&Xvf&-UҥDWJ /a 4hpe"|CZɞ/?;@XWq!m u\nov(Bߦh s~1Cϻs@ X{@kSxٷ>IJ:6gC傥'Y-?hmy%&BbN9ͬwSvǙ umjk7lkfW5Agu6uڗW۟@XB.:~Ǻջ];tp$5+iAysc3Xu`;1Ɍg| 4@8!U$0DC Ny7@Ojj7~)q}g{]sc:ҟog98m}]ȪlhϺ:TD6_kS&M#;Ty5J-?<4 aIFU38JXUlTpᶽŦMlVȏxd*njk!9<21Mo|ק&Fսek<-eG9p|]ڬ3}KlÏCwا? {˛`=wݡa/NSN|=~}N>#:J͍iJLo[M:1x7` -9fw?7XGW%_G,ݘ|1gzV>=önZW%h6e6A|qZ+֭o|@^ZˉlܰfNf}nhnH%CA&k2BޕAq( (Z2kkD:a6;uN谢AonFk7ݭ4K<ΔimS'YN{DԢԣ &_ށ^K.;\-`vPJɈuv;v'}fؐpg_ioyۛ'u雾>g,7/~ 7Ӝq=6oپڻ.[~1eWcKחV! 2qx i0^ x +lVٸ{<4aowx+p Աօ0=xBygΩ %sJ/*KR!kpϦ$/nچkn=X-vʉɴE0pUj-uŒOnZo&r@U_}C假UXg:׵}ok~Sknm=.j&M ]c"8l=0хc۱pw` }u,%0 p.K|0u/|L(g0~V/J"q ,3P<,oV0N0+V ,?>y^2˜9h{g3hRJQYJW}e=IkB,}o~K,{ۛlU7Bџv v֯Cﺗ;q$8{F΍mClw|!Vy]؂,M]GVN8Q~gՀw(7Ű" "BE8OBf 7ʗㆼ(,|X@&21ַ C1JAG!}+j䡇b;.I=lIVģ\wb!F 쭛l׽5҅ɸa+%wcn.)LOo}[=dAC: sgXIٜ߄A٤a N2{`2ޙ b\z&\xa(~pIRX϶|իldG%pKGpǪ!P.TWJn(t=wc;3Y'3,Qf( >^.fW=;R̡5=s 7h:4_ !#—kU?np~4mfSfLsK2-R8:m5~E?||ԀC -nר:Z%KV~99wi}[V[Q;#.}Z۬mξ*ZϺ56w${ۇ>l'y߷f&YhjU̥"r_5i }د;z\;LLÕ3fr]~͒A]ǎ*{ÏPbPQ4H4wH;眳%i?f PΛ+Ez=2KgZ_w}ߴ5~&n.|R@?@X?ZSSd 9]vg=iD[$9?xljQCxYv_!7 u]kƴq6UkB}?h׋wYGgyQ{Hy{R3M>&NiiL1Y9[w=[Me/9$Ԯ cѩQ_)m]n6V&YDndXU"e'j@{P#a(U*5I[zX7 W)nx%-^d^|!kn[Jŗ#/684hw=-b7YgeY~I[r*(%x\U&O<:(>S &N<YejZmy.G=#d[ÏkSp<*8w0{j2a*ۈ`>G8Ѭ;jqAtgD-1F%T45N&ZBqCjs)PmΗ+~xMDo7[tkh裾>~ &9q""܋%CMM%-'oDc \|[hƜ wW>_8&<7HL|=is%wmZfl m {mnc5Z3I6X`Mm_;;3q_+L%|^n3ln0m#B2m-v7ⳟ<{ύz0C9eGl@iz0 )5"T6 Kgj&-)dpGVW !ң+"y=Y)V.܅įO.o}w,4[Vq%ˏ;: 8"ycx h+g HCLlm͵_~Y}kKlpۮlK$.;uϖp.ԩ}=LƒQ!L=cЁN7} 1 6$V` Wa>Ϸ`rYAFB<(6P9eb&ccʮR_Fbع23Z)ҳFfSۚÏkˮXm51.&|m,)c ѧ8 dG?^Bc> a0k5!&aXIc 3јe ֒DMίŕuu}}OT KE֒j_sfڈW7semMBeR(Yم`섂s=XK<|΂cqq(?C#48' c Z;c|8u #Hњ[mC(X 'Ib*%C0n;8[~ }[mٶ\'ʚ%4Xv۪nz%+W;lϷ\@KcVn(Ԃ{Nkυt?pza=me(mn; L-\{|xQCOs ,|Я| U1`0;h x/6rNи—mt!RNϱ/{'ؐ<Ρ#!{cUd5TlZ0z=y=,JK6HɬVO.zIyφ.cq. +&0 ܞGcUSOI/UmŬ"^?Ϳu rq&aBנ*%Ԁ`c(hdžҰeWSmڇmRCDJ9}[ъE;Kf~Țgϲxrg>j={"%ubKv]^oϚ"1KL[{+S &uZ)fmmwD5'9Bjm~ v Sʤ*,@H4ZX<^,cv6- eȀ蝬G` '>AHg8xxtt&@hkms~{ (SUC6!>L:H/uV 5rR]6R ¤|lftJ%aS7\iZ[v%o}r!x,rs=O K{WJ:ޅx l4xՕ#4Lx}lN;y'>fm" jO!it~o3Ikg/VnZgLe#u+t"]aݕ̕i+ƅUѦ\vv)>ekۘQWЦrꉪҮ[ZZ $v׮=ΊL ^q E@؇a†?a ^LL 5 P`MoXy2 5+~KJځd͇-jllЈVV4TP v>p_!HE %S3[mR­V?h-^ltL?}ﻖVڒe;/VYҾ}_n_tXPpnd쫓#9 w>/wRDk S.+ݶ4S*v\9To#ỊDYJdBC\g{:E*!o o;D:Y A&ď}rJ0E ?F%ծڙ4b)JyB>^Cg[QG3`@8#EӃ܂+c*R.RB6ez4&A;2)p F.=/1u(;ƞ] {/.ǀjo(ORꇼ!Tqя8+e ԋ/Aʤ}'A8HHڿwc}J0y?ЖiZIB¤7V)ٱlŗl3*Rb?*>lY_h"Mk~wBCIU<,z9:g'vY<|S [OZrCc7|#M&@:K4fgmIxWoWmV2q])KVLp^PbGn4Ib)INzȝ{AGV\<P3meV.垌+߱MuU1ԔPzTu<6ຏqꝏsq' 1;OZCJxNc?<M@HO]\J$҆\]Jm!'#1%d}J44\d'koK1`@ڝʂON~ ezYon?b}# ayI,?U$pp<1nj+&VXF `uc C*Rhg,a= b=11ZhѼ:U%?**fQ+HlTuTZYYs9gW  y$KTa۟UzogIdk*aI`Uٖ<7##\x 9#mRDm:'U`n c0@WO6#R#8V_4.$hGp}׀MF}-ޘW$ .X;h}LD2*8bDf >Gm?mg9 ~'咮t~~ ;auOc,d V0`aX<Ѕ&QD@K;nsL[խ~$3t &&4 )#hA6kMJzn|aX>S?ڥ'˳ޏMώ ҏgsa+I)gmtD/Ȱ&݄b"AC:X] VOmw!{U{{ggwmr%-e8tPP ޔƄXڷuU9Ѻmh4F9B>̓űʏ7xyc0"/Z]Иk ?,S#}׿F^!FDFq1PeCwPkH,"Yi{l(Ẍ>o=4x{߽nci1m}@%'|J%?UqE[XӒp$$yR~uL{8裒s *+29Hr]N&%0/ q}U7WXS3Y9lB:.[R rlbUEMBga`%,0 * i 8LI!PFoBƏ* gQ\-E;$mg7$0˖-:G.Pz3{H@TM f]FkXٷ> &W3Vnm _r;lM¥_$4L\C(N TV0#au}8 ϊZ]1-[j8r6xr@%f!:p8YrFxt_D}L8:/zENx`cRfTEL׊֛QҨ-=M>AO<[ &.peDk'_ǀ.l7yxcq@n$O~ϛ8?i kF|KmMv7j- YzmϬT^ lSs;' rHFd_2𰵴XKW}SWY!ˋilʡˬ[}>n)v:~J_Qj.Vpm >$U`E F[ +o#hђ m-!n_l@Bׁdǽvˊ{#%|"ḬAﶭS39w@Ca6jXXKلv}H wd/v/7XKETfĎ>LeY7sJKx^87RG1[T \vX?Z:,pzFrn`b9<]r7> )#SQ.H mUMEhh0 A4͘A;9"RC1+/y nx!J0!mmTIV Kn4+5!gH58Ʈ\QKڈ4!(=7ΌH2ZBCXf*Y$L^!B,cIOۨ @_pK g~GYeH}"~ f<+l4@h*Atٓ S*?*E?f#d\M J!oHɤ|ݦ&,/e_-o h,G]̊3XH=Ս'VL>3j5 Dp~}eD$Ǯ+}d\C<%WJ J&b6ÊalJK]cX,z3Q64jbʗ[[SBk E72E"n=;Vx].n]'o^rP&'n)hܶQ+JrA*j%Lj([a2b+ K16Ȫ6aC kKؾoVjWA`M zwuODi}M7CF Χ%ȳl>`}va|me6C ` 6!25W^*kn nv56zX;Fm Z8O\e}Sj :5|mXJ*PqS)0@` 44 LA'eo`f%(#/PA31^:GA^;wu]Pǻ)zPą9; Y?Ѫb/f% )/0 (d>Xza)X QsVlK1?&:>]L_#4Q`+hS>!>u!IshLaIWvLA~SymPX\(|;pacƁj̦֗N+^'n-[k,%A/˧~}2!)C 7xX@D3mYBCX<نyԾ_uCMCp.`g~u\/˯| Ft-,TsžP|S @  3 N겫oξX& leWbazt>W6Lio3h 5pjd 5])EC]__vu'D(0v}5!g L'vv5(*&nƇc䉊CB;\FӇ/2|rL =L q&xhoꎸa{oB 961\VUEwH̔EcXÛ[lP%F-+%kD!rrrİpr@Bdߍ iCsImRI)o˝]ؓccrE`(s%\ꫠ|/>1d@`lX0 ۾ǜ |Nc+9Rub̙?$ڒ7mb-n[yv_fF+6.y@N8S g\.#3jp֧YC bMVпo֔Hn&ld!+:dXaK_7Mc7j֬HZ]`9g=U%lK&rMv~DujjEr"ic?XhbaK$cVΜ ~A‘LZ\h Mk07Ԉ/Y` r=Ɨ$&\T\Xto}b Q`߹{rr儆n Fp&&;Fl1䬵mr۝(CQ yjbpQU>)!ǚ2V55d|K~p,%R[s,ct^WۃVn\Ͳg0#2 =40M9P= s$O]•=7n)z*c!|.񨕔09+1QL aOy|}:X)] hC)1S_e ) uP}#a$`AC2h?m/|8p!-Vp!%0P.+v$h+ލ?A.<}h,TeȤ6[v#}̞X 5ԉ2T3z5l+ێ9r;Qf!hb4P 3f5+Wc֠&_Q_6)lõsq~i/Co-'uvGhwG(wvG'缏j$a%fP$XYY9{Z;_ڐu:a6.hZ3CӭuG;isϨ=>3d8[M|{eC}=QbyzͣfjD&m#E-jCGwXği_S㠋k /!di\aobڗh~I^rvύm\'S6ڤUo~  YR?XKE]ZWJ(9±P~཯JI%3ٺ f=!m,9;i_~Kk&ѯWx;.G}vt3`h2pPHF*!@=#ƋE_ŮdY0b[[JRΨ hf*q/0!8\/I.S]IE~_e*y|ƗB 5c>Ov$Ohh~o04؄ϔpR hDo |}?Q8Ls8} יn[FA?S[!c5u&Fm-y_TyV],h,o?r 79rixx ڞ welqg-̍CY F3 +pR}*/}P1|.Kڦduz|v7U; d]3jÖJ0g;Mf9]wgh&j PI[AktmatVpiۈvܝHtP#̓Q?M\ѝ'|oyaܦ̦ #cz*N{K%(ք/knv0PMɈu/[oV},KťDQ~3 tj4i:L&Ϩ`AL `lcoE\PA]jB}2!4)o | Oz״t 4sa0q|>gp0r0B^YH)Q?CJ[|)FL`S' 13eSg\=|<#KPPPH&0 ++#sFqv܋.;o6K6JzQ/4Ԅ ]u!@Q!9l{f9/[87CDc!?%8FPD]f7s댥mSN9͘iկ[TD:c7۳ 58_!.!"MR*j̳)Kwk0)Hl>Y1C )`op"]o0a0 oBQj _RhI D%DU(r+|zV@< r0(!4 *#^SjE5.fܥ_K|-LaGPFwGGݐ}삌Q0CQ>L'ICy:l\ SCM=$Utc`}O[U S\_D҆ċ[~M7˾o[{7:CW\nx K~& PpaOvIv4L4aۊk0LxF$o,Z&CT$2luUU,>V(dUQkNeN^f+'l<)vCDD`ޡdpΰUm~3+ݹ]'v'??2yDŽ1`veN:94<3rϛ; DL>nǞ#,#bF mvϗ0"cEMAŒ >qkPĮ5pC͟o}rCM15JyK/뮾چzZ%4*\qLjaAi_QwP!3:Ιoҳ|8@,[oP1pv!u#j H6 ,al@TǶ:rExOpKt ũq/ [L_RAy!c J!p7#=?Ѹ'a+Y|Z{{[D+P:NDa C4 jl?I|IO8ℰxց4Ejh0y z'LG Ϩ+jpeu7N%Vo։jD;.>.  B3 ˦M8ڈ>||\pIiKJ`9>񥯸&ZLuHlYsٓ PA+Gx(!xV&s h>2xK >smw,c .sy:K&h1[hXҾPHY3oEk(\8py׻ĕh4eX o$F 6JuPz@܌Y-Lzkl22ߠNoXH$0C>]+dl|qvqF{SLba㉱3uա}.{+2,6ap"M` dd/joM50Ty&+WD@N ߡ|BOY>TʲEG&!վo[K4XZ+[5W\v5YNf&'n[Qe-5+z@BN/,ÆvO6/+ FJ"\s5s*hL= 16P!q6$x oL"4ù΢^cy1;:&_o)x'$MBaޱ, Z'۔Dvl J,e1BUgXaLBGRJ|AF}'v㿛sQK "U+.H 4~+=퐏0\L?uHKPi3nTO ڠB5!mA$5wK}5rI 8_i;.v$C).VL j#Hmkj:4o"ZV1(=KP6Kno޵ٴJi%o-q\}&7od\2. WNalW0\!猍r4oĠ&cK<Ȯx<?^~ox:#7ntύ@ZP/h eJǕ7>iP *;!IHnJ;%NDxATKn0[gۨ+! ooKLlcw(f|7Uy~j eowm=|G+SfFǼvO8> 4V ~3Efȏ `OAS*>GUy@o80UԾZCOS#xGe2ik;Ov }-z%GF}>yVN`q̍EP^Êc&[B嬉S~?'48DJ+d~S㙔ل.(Ǫo{!g6u ؾ#첷^7Yo|->8k6p/zU>Xܹ%~6'+>OќVSZN,XEWsX=lDc5ڤ'jJi |{Dž=@"7ߑ)>| kLVpc6XQ$}.\n2 ,XYk?!Vd 7ǒVʊq "Bņ!{E| [^[,X&hEmBkUDhG%>յ_Ԉr&nV땠PNIHCՅaf5z9+Np52&!9AH0:2F7HhC Y18 /ը)eOf&V9EKR+ 1+iI V'ք$}9+IH1^Y.<aGg}JUWա%hU՚T e%FV>&[׫J'mP }DЗ 7 w%)=dK65[o~ؗ+IV$0UeTƈހdCF|;^ռ?H_snz|%ӠxĆEEJӛ꫒Ǐydr$Y\CURwM!'bmk>+%<~*ɩѨ ),ڒEljSEEjjoYcuG>̐ߡ1LXCg14%ڦAm-=F8cqI1΢fsb^$JbOó}S;zn{b7GGz $OSlZth( VqᎿT; O ̇<6?kLrv[-a~%* @Vo 5p6o6e5Oܸ[$_EGA}, #8_FS nk>,@$B|`-: 5o3'+ʷWXUyըAr,V+3%Tv9o6@osIK-FW»DH,MfgnL@|T)Zks e-%EvPmo%XLsM0P臊da Cƙ#ДXZHNi9orxUUesLPNcBrD5S 9/fDe'Ί1<.v" %Hά+ɨ_ ѬrJ nOH  ;-1Q!O;=͇6tǼ'|k52bEd#mVtpaKmQڴ#N3_"ڰ￿57/vYK-ykQ_sw6eYJU6ehHOT:H1==/M.XZ8"}6qLH\Ac#m3&_[n+i~<)lb;3r?^K}8<z` oDl@o$Zbl@Gx)tzêxlXEb|5z13jmn̂ !>خ0`I7 XU8LbR 4Sgͱy`]ӧY)6y 2s9'2 ڴmxp&O1by&uLP}>mu ڈE;mʔinlNfZZWhWgOƘKydj~!QJ:!ąڴe[Ǣg5v\H%L_l)T3)?8i[긡FJ9ameלVKՏ-DT 4YSD S[E|pu$Km&[ճ&NiTO^&jD:OY3l!YNLzD~MnȆ3Q[xȑVjkG1M%h&L -TԶahg Hhm[m9imcw6لs-ߚ;6=fsfylP'0WsdLpnPxsg1xpA=LBLŅxQ)J8> 6[NxK0&,aQ݆Y .,#@bhPE6.BD%|!o"Vzx A QCMYoaXmxѳN /)Г BfOu0S]Ї/axq{3E=/&v L6?=>n9v]Cc<VՒn;l#uBiF!3ekB} 8[U*+odgm) ۚn$je#8uh@i% #㥐Nɏ*>ū ybg/۷dbPn{!_-7wai)glhѦFjHHlK12Ąy~ׂ)1 ͮ8Hu ֮)-9n䖵 H(96DmhBڊ]R*uX1v3/!LU[0ƦtŚJ6>,ך^G,hCټ|," klx.ɞ+L1#_N #K7!ɚ-eŢu$ED\7 ދ<\[D~V}Sk{4;(XhɅȲ#mJm !U*֤#6VU^Vp&a奄l䔬4~D缹YYƢbDOv },k\jɁ~XH1dc4 y;ehl{P[]=o P1t+Rv&Y|%/s/.mO}'Է~kw6g힇WE-%?%gβČ):E(bZm% 4֠U?FUwE/~qй&0b085CcZ|]FE}՟;.Lȳ@y\(voQj}̗&YUx!b⸡Pp!XkHom}ݘpރR^dN-p1~pWVpL^|`&O[0 7q#C8.HwxccC[(߼ G<*xDl>ln8}}/3w>**^#Gy9- (XT% x[ R.jC[<Pޒi/W[{FY%B(s31D)FwҪ1o.C XB>1,Vy˖y^}{6{ۺv~BXV /jiǶR&N X4j45!wd-j-I1΋=њUkkp6Xa`sXĮmS˪Ji[xvp2jG{:p'`-,GnxҊR{4Ȏ;DKn("+mG۽7.&.jl~ ֠E+%l-)[EԊ>)q:b- &|; ٧}ؽ+{?f9S+_fz>Ti\G+Lk^R[|A63l^k n [IBOs,e嬄bZէ(g"Aa f1 &xV<5(nT8;0[}V}Zq/Ũd=D…/q8u\B,/Kp*&x6T53~Yy!."jӶS-:i~=[%d"7ok֔bk6wLak|Ȓj1Vg E5FWSpL(4u&tmg1{r9] $+ln"VMnil[uvgUb2Wb57JC Um|n8دT~,Zd ?R2lfͲXw9uogG0b88spy$uhb2qU*RԴd9|N,/@9X҈-?d;K퐣ecb1#g\tUmuK`Ί!3̴TQr%[!G8_QebXR^YA)7%mV;swDmbsy϶% l@ ʼn/yu~9[ kW46[rS:gz;h SW^fS/Ji<ߒ,#%AgYJVہb==VliFk ;m;Iw -nR6I)k%yA:̖3P#fxvt>Y1%sBo^B҉? 'lFIO۟Ծ/>y7ĴKZ>3T&C*pʬ\qw +M0z5xzJy`q[uesPkJ7Yr"?jxxIJM .)3NcsmF!\1{ƷmVG[߱k-I7iLˊaF6,l6{ 'L ֿjfp'L[-aj5!ߠtU=Yؒgh mH5JXFVkzmT VSL؊5kOj'r_}O>儧Ѧfk1ݺysϱ 3^"" 9%6$ _rd߻*o>SUe̦w}K_olIs]xr}v{^+ TDD"*v^]Q7TT@@^vC?W[Ks ӳWTW}hP7j87 !z.:LTU5X0)FRP_֭=^u*.(qWϿu*3zz|9աF^j}ԭ\Erd)PM/d56ML{7K]V[7a"XO.m"n^ۚ0%F+Dg\Fև _u~*x;Ѿh!f-?4^v80FWȑG 2 i̍?)~U,Zqh|No@~}G!&wVȷZroyԖG<پxWmC$~6@eu!5<:I- Ta/FXν˼: K(2oNcZnӾի_ ע%x+]-?t|.~m'/Fr'f-^bÏN\(S`ၓnˮ3yFByeZqD =yrRK$&} i:{(>L[cΰ}uv<s+\&^^Z&8<)Sڿ4 nNz^':jhb8M=7KVE5:KQ7cppg*hBo~6?Mu:?4R[Y8ˠ\,aYfmvvr[|iRh-?x8Q֥|F} -Xx87o| s!瞁SC`\+p>z)i˖E+p黮$q3>E \Gʔ HX?#<~m42B' $#4k!ZQTSp 04lށ li <#[wa#Oa~,zۺ=WcjZ܁u} ذ[L Csw'NTJڙMż30Iֲ -jTҺgYsIJkf$MRl'E`PIbr$ƩJZR8sv   uMꡞl;{:NuԶΌ4t6xuj*fcdLMV=( cGQ5b%DKHQx>Is /z;[o$MU'/%>:umP6h\-}tHʙgee4k䙊_[K^rUXC$r{H#ibB!ֹcC4-R)D#:׀fx}=e~_ %YHA:`ĺzT۝6ҹ).YF6M7ߡuD8g8lQut"~I!oaKF^S;m Z#AȏOR~Q+_Sc+߈ Uٍc/ mFIKrz 'q&25l.Df1!|;E` 3^l(߻ؖBu1mG[[8L5#C۴iH!_(0J_);Cp!2į>s0؏t g\5]7}$Qc'#p_yw{h6o.yϕ8gb(ég3_~ݟ\'? kyD{PǬnӞĻҽw}hYh]5\fKZz ދ?H_Eo xd>/Aު/fP9u"l.>9spBڻvs6at-0^~> R:;6ړWzH^9eZ۱m63=XcfƂȩTzFEQ)>hPx4"f O9V$x2PP+e#͍1q2\wM\w=8bTDp/ 7wa7\YE'{X?\#X˥-hEU`Q'p̥3a,?r&_w=L'lsV&S :4z% Qî!'Sfz;6mޏز6gZgfhC:[lܼwկ<9HP/]8p'{ _xNE\730CqOKTQ ^RGFCQ,7-ۑ%RCPbt< ?Ӡ*w 0:6GVO?ZVl0Øk5&H'.dq%4~ ́'pQG"%|n\M-^eKqO_{'j| ȇs+9<ٿ"WH<{:r v'0ZW7][+ =A6#5ǖ'qo]o{|?0"6(G^YwQ?I5?'0+w5@ /~K CfyVx?bC9û.Xnf]&&۟:28-[2z嫑S8[XitF_Ԩ{>2oNklF:o7mEeb|ôS7ؾoůEzkHf!-Ҫ>n`3ۺ2\,;_ȉtͷ᯿Q 6'?a~m;n2Y|~Śq_·^< w !َM;d-dcbڲ|/fߵ2%0BSRHQ$"U#a?^O8 6\-iT%rD*qzm(@Ο/0Dn^i/Wex"Hr.[]$ xa-BJuBE%l._c6R{:N?}{f=^d<1_ 5!9YsLhϦ,{).ΐѣ%$1K:'I68{.bFŧߍ0qlg_ةR΄fd0qͫ_IJZml:]C#8K -= |R+>fNa9i'ڷ۷_ o2A-ksAR"p{fgz}c}Tf)6,k^l|ֻp98SN&!sn+z:fjCMgP;;1{<̝95]އtw{Ɵxn1S8W`?w1bACMF['sd3*hasa-Bԕ~N~-(~wѼb9>sbpz!UǒŚ"hA yDmXc425MӣĂ]ؼvqY=Xvsji6<}t.ko@9O3~?Mя~L<8~_}/ǟ+#pIK~4.Ojl\3%F,fedpDə^w,qժׅ6!p5V5tbޒqHނ8x5usσ3o~*l{|)x!{t!d_M;{t 9ȼ"{Irlm/vz>'좺-(`&'yLvV 45!O̾/vzpcQ_X >O~O, v!B9yRup҈$mӁ󞧍G0V_St \ciZ pH5}87’\ ӯ+fp%p'DzO|K>!,#8>znZ 5-{׺:,O{_>8U鰏 N8wa{.Q^}612{HٳRl,'޴$EjZnBZt_2m4s?: z(^טͻlw*MӦ)O6D'mf;w4YL*HZ6ol"*P4HE0k̔2j:] P%H̍@5RPN|Q쑩t/̦uP"h}a*5;JV^ww-{u[zV*9|z#ZL>mp'Z:62\HQDF[$7dP!(NbY, 2@eox#yҕYUɗa~J9kD9A3l4E`DA &T^s5_r27Oa維ȏ%Ƈ=mx+^=tT7lzx{S;adGڕ )lԨT0E2A[{'LΌd+o0,B:45{x'nu8CXn 6:?f)4NӪ^T`}8  zF}kÆ;q/~i6l흎 "6U? #\6HAR2>h8h`{|h,Z|NQV߮1`SGJQ niX#/ӌ].t- `lpđjK#cX ~QdY_=QQr=J[PǁCG R9pWnjHHf)*f궎>*|l&).*7ɽDI|g֍XubMۨVdZ:<5ɶQMkbu%N7Lޕk#$ح|6? o:9|e9gŗ\~!ig0zHm*ps[3#MV ݞUk1y%k9K[2c6ogV@]ۤ>a5Gf%h?oB8ԕ4P4$d ~M:xԦLާ7NW˙&&W2 V.~h QO|_O7DokWBx :#TD .y9b͗n7mÌhgg:X'%MP}O^AT@1Cw;gzDZ &&i\(z))=_'#2/:`4hk""f\w0?(XA15u's.DZ!vk1-ȘA&#x}h#4XTLD׌)$/%:5λ??Bgf ǰࠥ8#1<4jfxoN'R1ʥ_b 叶cS_?V[?)M5¬a88th] V]YpҘ5|2osd%,ܣvbHćFghWOɾlWH5#~-h=-= +ջM$@#{Ci$cf&&D[m|*l>)M=bÆS|dM{yQ~IyІ[uja<;ifgVKuj&'vav-o'*+;dV_AfG(cF"t> 4ft#IJDfz'$]n$z:ރ´f΀wB_- h:;>I|+]mޫ8k֬Ga:s4e>uڵk>W'V,iQ>ԗKk_K,1V'h_+_fHx%ыԁ5w^vGrœPSzMԽN|*.^NfOxX8'CBRTƍFeH*dE.[A> boDI}c"L=3 LJGXE3V?O8-}[ t3y:AXKA 3k}S~5[BjBʷE[މT +o՘#)%BQ\GLqܱ'9VD?NP6hݦO=Ŏ0hbϝu=mȏ!+N7?o6Z2U#0}\D@ߗE%d48Գѹp113CPt^L&t8RXN֥cch"zphg虉`l,{ŹfVӎ-[v3VyOC߻ގēk06yo|^+0\e,^;~KN<G|'?mމ|E`N"@"hHeR%گE'kHNR4蠇"9|]E][: #%VyI/]Qȋ2g:(9x~𣻹B0.g4hޚK Q->rf&DojF'ib&R /7}rn+^1CfYeB`i @z`u~_ZD3CT^{xm"JذӧcW`ëP;34>:2fxW:O>ݯ9 +߁=qą7b>a]^t"ԑVsT|gnY6⭢ 﫠'ܒqCܦo̸"0#*Y+F^Nr6"[xmbC1l"o+^R&m 1;n|urRfz VG:b弱"1eEdlVZGq[O ̰.ڬhIS/ GPٱG1ytR8ݤ`$Ίg Ǟ ,11!,^We(.evHQY(m]T-LsoX䧑d,@Çv)Iif ӲIO/H{c oMP^[싲$IPgFX,㹜P&NV}YVH.Ր(2rR~!+wtcm|/] NY~5-ɩ-EUSFi)\4,;aA#oZ^NKƞʛ)Yz:_oEQIxM[$SILf:畦S"_3ou( R:/ظvb]w^nnG">wS2O+>@My9FAw[+TQ9a#%D:ˮYh24nnقjjx &Sh7<ZXo( Pf]pj9Eۼ8&um,rP;x ĝCCw +N=Ŭn[7c}7>/\? 2*Qdy]>>(i*y#z |*|+O<_x#ãضv "| oJl}1 ]CZƖG@qg>u%;(_7 NJ"B6 FW<+CRB93rpNGl#RzZ vSw ө8X""aU/پTl;A*&L*NǂɷYTݥ:SFa[["B(P(!OQtjS M *ôF*̆"ȴ/.Qh95M[+2u4Yw$i93-`n9}JR&9t艥4mA=:~w:hG$\j[w#T?S޽Ttte- Kck6e+tN3+Ґi/PʢgM7:bd,RqTڷDfN)-Cd/{Vڴ4N}%h:D^F A%bJ ]8GLKfi_^.#J+a:44 Ji(;q75#E|z4e*b411?URU5td"2i7}"=X9%wSOH]vx)<:"2k4DTrۨCݟu=@?1v{| FI&k;ߒm ӦSksXoԳm\̣OfO`pz<ͱcj0G_ T2q4yɃ Chf[QAش;1;EGx1箽f(߱>13N>W6xqn[3:G^=rV?W fНُ⠳?,¶A0'LSuFG 1Aff̏5Mbn{s> | Y? t8/+ߎpN5,L\4dUb24Zj0nɣ.N%"bnҨcQ>/9;tfPr^tmk*F>*ef]aȜY.;1C?1:<9B;dfuW̶@C|9@4X`Hײ=@2AFڵOa6g6Fƻv"Jb e5۴oc(6Y2Vi%YIP{,gG.ʕ Hj@kU?u:h.%JBuVntBUF{RGh9bM1-MA;P;~ V sN:3ns+T~ui𡅤ߝ,c7;iܩ}x#hKRXQQQS6xK ďgUZ}z^[؇'Q:W ] Ky|5d fRZvl?Q6md1{lcnܸvU@~#:\kT%p '" N(w(OM#E̷Ñ`=ttFP8gv5*j7nʂ8 ۶"}4kQ$* bAؖMT5l}AN [g M!k%L2ԏMV82 y;6=0c`Jc}M%%8zG#V$/2$Mo\15<6Tçnb Ӻ-.hn⣏2H3&}B#@@PᷬmPj(ˤj6O`(B"6'Ï#}"TmF1̠`f hc?e&]lڗB67 b1sS8膻O^m:TYpܨ^>(?z+H@S ϛ3 ֬EuSzzI:kUUZ֤QaGi~׬@Dqfu(BӺ|4F~`̒(>#Ylb%9AP#!RڀMJ[J5>ט (LhH-Ë*jF]4F(G (7R_hK, Hf̢!M(uQ#ӑȴ6ktt~`! 8T) P*FUгl n.Ϝ:l[f; Y+<yا`f^?_(E^gsdYPyDMw(vK+UԃoE=xO 50$s8y-m% + u@9qN;)VMڄ﯑ADJ%,^^Z*(?G I#?DbJ*lz Nb 6搚ЖR.5ͬkwtfԣVDTp,[Bԯq6mDS|Į>8{ׯCsW0L4H,3@l_W Y@bU ^q|&t<O=pjXl&o#'ò;Al9a 1wUض xuc7F,!ٴCO-?}-|צ'09wfiw7<"ov;5~c~߀7ۃ6fjO;WV~ >a9>P GlFbf-_l$\\j#üu ϕʔgyDޫf@2Gޗ^rCHsw dLu7MfFikE j\򑩻93ebgi E1J(O9HL!r8ys"բ35VsS >MPdǙl5|*I3D^g(̛f1YK3Eڿm H%&\Qǃߍ *ztddoO"v=a=gh3s7xÙu~ShX4)!9]+҉ &|9<( S||Ѯufp"iYf7^$i8&4H1B[nom n݊|oxjf =k?iƿկm(m0U4;FH{#Hi(LDž!͠ Qh_t(SHAt˯ ذz4#w(fUtnֱiޡ1㟃{lJ K\3M;>DJ44sL=dH_Z{~MpT$9j`F %])4Bel|sijD'CY͑qlP2~162jF|/Jmm-fsfLLP$SC|!֫H' b 2" p ļt(TE%j9-]qn5 riN'$5b C\{xq:od4@(`Ne#Fx 1߼= RiF-X" 4Z%zb0U#(2I((M|L:(ìцH,5"؈Z"BwHk dz/A$BWW'؁|i;YA Qu黚+Tցk@(;74S'mh +/U?RY Uxv^{; ֠B%㭲zͬ/MtENIОQ"fP'i6 L]tke8&<ͥ^qҸFj yڭ4>vQJ݅ uG !2Q ^F'Q++{")g4U(۽8z |_@~4;9&Ֆo#F癫=n7OI C}˙ PjlC^<tآK&tPIn@,Jv2K `,>W:N3 gt%kC{.ab,WD90bn?Fq&~ΞMPbc&&RFAG|ĿXڈuՉ'ҷGj@B E1?V&oBB Yn\ߤZ6"61NfvvyU1J#_U@ͺ"`4X#E{#Hh qluzp Gn2Iz{6_yuk顯WH2nF"+& 4֯]R749D-IQ&}͠ӏjpdMFG5眊{~TóĻaD9-ٗ\LeS&ju&,v-ܑ#! v1 qX>fxmH~HKB~ym130 ϴ%ʩDyz\ɢ"7'>w0s`_N?nUWcwvPGu.|;-~q饗K.1~Icv,PߌeSˠc}']46믿`Yuir$4B메6V_ #%h= o=+'[T^0H@hj>wPQfpk? tjvp/ˆ[&O0E†/&(.1N&FB_ |PXh4*a hin2bK}b| TkM 3z1<0,H*@EH#@Ȍ4M$ (RlldP^0$vɗq"Y :s`Rc)OwhC f6B^S6b-/]!~'UOEXut65Pfh 0) |gp,*l1Ss8~SnX&;jH dD(@{eD:X/ &H%8)dZ)7~lkA+ߓ ש ^O,[rlB鷴"JnXgh 1* o 7S N,2EHJzYJ==C͚qc6#/?LH.|ERNhjcWfNձ!+琮[pFJ`0VV&k)ҚԦb>SЗ*asv ~# joNZ?cm,0E;N#cPhT TYSFVu=qMGך5MȔڵv{ ݿ$#UHu+d׹]{ӋMU}~1;[|#&RI>)Լ ^aN/Q罀yGZK+G3"9-2͞\,@"NAcM8:4N[҈31H2wdzu'ROUcHa-/ k>YI(:Q'ZwQ!kVXMK2u3|Su4Xt#[nm!菘fWƒ4 ;DO"0bej n.b޶P<%6#`k&ߍu;t+\n!̧aĞVpo6Ew&Nf즵&RVnw [C>ByP#o9LLIe.Ӑa̙f𕛘I8LKĹ!2*fϩCWGTy:tE"4]C,L%6:CAtG'0Ax߳aڀoV#C+9i*&eB>)Rp}_u ɨNxMdU$aR<Ten$6o h`]畐}1}bXzF9>JA6̖*r6A#h:Zu2n4jH['N==#G6]v%# M3|a@iA<qsJٜwQ8oA>SB ʖx5Y>"+efhP޶i[KS.h@%:ub-Qtv½k'"CE:id4vT"j}Ϧn =zIUj:YW<s=: $3JgГ`mxIF%>MײMEr FQ?/c?\;t|31U;<󼜞>Gyٺ^&h_Ax@'R4cO3it_F_yTof5Pkc=;zP{ݖ^tOmcMbgΠ4 Z>R;lD`6C2!&7䴈 W7O2իM7U֩O4҈FW Zوk*VA,\ ?k:>닙 3چrՍBى@N %dH{77\l6|:4ņ (k> *)O `3\F^k<jY@\gPT]HkW#گGcy|$2=f4Ӝ(r,Dɔ6 N L[騃nDJ]3M~'xT\/ˮFF7>iuJqK\gZ{ ) OZ<)gk%&@ѩeh0U/!HF*[]% Ll#PY + ) 82T6zڰD1E9Hmo͎cX?u b~]( &*X;J%%=0L!lX'Hh9CbzS۶ڳH Zd`lcLrSd_ d]ۗyeu,4k(uAF;ue`)zߍ*/!N1ɚuÙ_`sn 'k:8 wK94:Ƣ~l($hD$de 7h:YY[4c kQ3yJTjTE͖ottћs"+Rbe6i6 \ĈO:ljبP!l 1Kb`@)Mɏ!m34rS<4Τgc[f#LbLzUxԌ:lJ,4**esx&\H$ F#e]՘\r8'K\$8/" F N*Z YPD6WFFvȚ#ݾ(m1XEg%-uԥsx 㬻8x83 qQBΪňs|N/X"QhKuIG0_Ngb^d*_Ps;1a@y0J!*bz En8xSpU2W_ieT_߮Bҁe4[DҞJLKUDƠ֟UwܞH /o5o/

7 ce~rXQ¦bs衘{IV>0}-ys<=KcC~*9,Ji+.?DXz6߳;;be -'?m;v'bӅf`Q^ h^c\ڧuڰ?Y!4\s  -IbYn8]A˥gmjgwӆ5>E&~q[4&EB34""M2n(c|)…4ihjbtKɩB3MdS펛}moskG?7l:iI=)O|x{k:kolkw{l>-W촔#ͮٷHZ%K5,Z0FenF˟N=445QfڣG˟>JӋ"%LN BQ(Z"a׶&4ɨ54S-CbfEV {)͢jZsQ(d WZ?ZGE#Hr&Ky*O*|CEJ N%(Ԑ"VSGB 2J 1dk"Ru*_uޚ;hHTeEa*S" CwBHTX*gݸAe D HP6\YɲCquXx/BGv݌a9FԉSb'L` 'r *#(pG|/v`,IP1nǩ"Vqi[Low&FRVLJ:Aq<ڱG{g}IX~BX3e9⻲@ڐ쇱|U(oB-g)=)N=Ӻcæm̛r+> f`xs ͛>F0JAikbL_9X$mXqs؁Xq±LFUÚ];0cXlp ,AotJvj!O?pW?zjiO>{gQ{I%Sz{oG+zz-%݉y0_L3IY[AHVrЌOm&妍t^d:] Q,SXmQڣ14|^4S||56m[/QG_C۴l?8X8SeSHm83QaF̲'b+ĉ5ƛ ^.jN8D~'&75ӤrBJ32VxH׮ PV =p itNcWաpUI=1A \H504i澞 ğ5aN?_m6a|e)PNFPp!Ec-f0o80[u G~1 f}H>Ӓ|8>ֹ, [R1:g΀+O8P37o XrkVKs:q-lii㢌+|qgUK^T&b8_ }8cG F"k|)f^zXVYOKG`bޓDߟ~s? J|fv(NǪǟ6G^/;<77#u5@ygi }(4^'Xq֩h&["椡 >)Ιe錫ށ ao9ݰlg\vv-׾H'q[/I\#ȆmQ]8m Wv^` YhoNj9$O;E{vJĖ MQҰiDE1=)'N{ķ/` q {Q / 3'0crd: ϩbtt3g4 O 6$xwWPv%u%J 6mzUѵ0]#RQ:5Ea# =u:i&hW95RQAvi qGꫯAG{څ. RՐᵿHCF^F6{`d5U,Q=x;A}p%@a\Ҳ/b~Ok1zSt*jd>:B؊hޢqS'*iFeAc&/Z.+tά[ւ}j9H0LjG4JZcc~Rrr:mA5B]ABL\dҔFL-fmu%E/UK4 }1ms9g3~xowմ_}xفAP=&&K%257$)kJ~BÒJN]&=14V=^: W^uO%wOTMYZ&U.Lūz&TӒ3h1| jĮfO'nH2*F' x~wTF9m,lʓLzC8MO_r>D%a9>ڗq[a{, ⦷]ċ8aލ_no0 *6/y&#wލp3aG܊ۇ-1e?A,ǡoz\rߺ\a~?e^*y';7ĬL!E%|=j* |=j3{44ȣڣRyCaVA` y8c#-4J3rvW䏪w/,Wvsڄ1(-e &pȗ n:?iKɢ_{vwc˦fAxJi~ę=+̒us2IA4G0KmpJfYuԈ&1;چ*%/_zASK rb]ji]hmJ} 備^e|ɿysW2 (10S?58@oNJT&TKu0- k1.\[f)d#(zV@ryhxePAu 7!?^{{E$^7;.2\qoCgpYga楯Ƿ(뵗egO*\}"zPWO3> .{=WrUk?h.޾ [T$zNP'LRto_ZmFn=F[?sr v?FifQk?p(bdUpG=j$$c%dK.liS_mT,&y$$/i{Go]+;h#IInKJN+OZ~u8^nU Ӯ\x^~BX-^{4pn * 81/2A'ɐ |Cpx* &|T">I8`8FY e̪QǁxPqA™l*jDO#sFqvGM#ґcՑ<OnwȪ\[0WJ6sr ۧӦ5jthI 0Fcf`ۜg nN5{zL=*ݢ=uŴVh t4"i=ϛ =$ʻÚebF7YSwv m|:j5fGy/60r9ɎtfDǿ>Լd[!lJ!v8kkg 7g|!hzcWc,Gw>9Gsu'q5EM.<"w.=愵(A5b:ܙ_(ƓUkf/C7pN_5bogXKxΟ-AGN `;;;jឯ&d!n3; aNGNab0m Lpɫ]FJўjS{1uhLJ8۵l& KrgV_Iz5;(w(p<~{ iyNsu԰ ؐNK=*kĎRg_z1|ㅸ[Ú?[.y-*w.s_F/dT-}~ah`EW;ͷ܂HWN8X%;};oS;\̓ O~8j!8px7a^\3sbGuw#?zt||b06G2z _.{ =M딥ٿ Ao G2~7NO ZJsʉ OO32u'j~퓫-CXlmFLQb:4heһq"=ux!IBFe5af8 q&Gcmc=N8O?_}GuLkh3a¯"u8iQk. 匰 x9HɪHؽF(g8aSG_ʤi%_v7'e#)+0(oIPz:jJMUJ_wB:Za'cgτ:$֎Ǟ@ˬYYHsɯt-'e}o}C^T!n,_t ^}+q8@4Av <ꙍa;uP+A c13R2\~oWsH^mEzt~xOl2/RwIOZx"+~K'@t"+o #'Iyt(Io"ƚc|}>koR::&.{`usG1p{Ƿ~FIa^u-_16{~S g:S?z~'Z3tQKӇm81DP*mF=&((;?|KMWpՍޣTcޒ= -q8b2 N9՜ܤg#B,*Vd)@G;y+\:qsH7*¡fϙ'n}终4gQƙ; -f]Gbt-1+LϿ}Xv h6a|x k-G) . цૣ\16ב߮|MXrF㜦6>x|p=̗ UZbP;5DI+d/=UB~UF3(mjVy7:syM-:_cŢƾ_TU=k +L:N˝ԉRr)5G:<Pbt" &M/| ]=`u b)h?>M뾖>1+X6~[%TdpY?܊kʔ̈RG=WƄq[sο_g; /?;߹g>K ԅ鋸WQb;k>JϟAwKBSƙ眍~Xwb(}+pþO`tN|8?>( ^kSӗ.B߅JEEv0_kѿ7/Ϩه{5_A}FyO͖Q--=^Q39F3_4pm63X3j?5eǪ$ԌB\p"=f]}?C;ogAoz)lܱg2y㏰W!|,W_3_2c[6c_|f'5o}{ߋWk-?C+̦f)SGZ =J Vu&q8~ߠ֧ք,ofmD43}}zG.)Fl'RuRџ*[Nr{c*|nU3dJT3g4Fpy{qw(XK@U8~cr)Ğ 2 e$lg.gDZ]cXg[ut乂Q3y8uef0: :_k! {*ޥN"AWFC:"NlrGFиyg'p^Nu|3jNMshf<8B2߀`K'n:~&ïWFN>Fqp⎇ũ_?1 "Bw 8ҷ`坷?W=koܾoC7-] qqY3f7^r {{l|SW\wd:'կo"W_K߈Ӧqp |b4 _Fmj (OMy!sz%tUxs_F(Z(k2lځ~3|팣6-9fͨd:gQpy^q8=fS :q5 yw[<'5wtk;L;{V Mh|QRFOwQq1"=(f)xfa6w&B/N\rE֍ Rs ($h.UThǝ#mx:0AiCuFT4SWʯQט+I߄O^#9A#үO$;0Ǔp%p[:ēzJk>|sHb=yjSInyǙxH*J%gs>z S~"_9E cNFr7LWHH`t saMy}Td7vO\c|7IPU^>WśT<&g#qxyx)"J#|]l[ UZ+*29ߴ,>ؒ+6 'E9Iqb&!7!Y*<-n4 H?;'xw߃Z0^"Kt2,^?~SOAK0!i_%peoœ=D/27]-8+_kzǜq:hktY8hYrƙǰhO= eG r @9]XCRtF݅N>+, `'cg0Ƶ'GʧQɒԯ u3U̪W6uUԆ#g f/Sl|Ցk)Vf-IVǭf653P`6 :iHkDNWuڪE{`iRp*+͖]G:ҵ:hDw[rP$cf3LGz/-&64NY6za'K F 4"Ո+3_JaC]wt3pacu*hv0A%HPHu1:Wd4q+<2uRPn&b# {RXek{ 1oV^w$_ỔFϩgkJO яzOp2/ ) NoCv>IMR>JG+_V]5%}0ku2lՇiNIzCf1MU_oo< 0g[i,Ϛ % LPފ+ O0?H_Չd5x"j:7/=O}\ fqΘ-p7nf|>w:m\֊EዄFGP(䶬YY3P@YG4l=T8)_aۦMXz‰o7ىqTYV7 uنGVb]p 4Ece&/w<{'Wn5̦ѩb{wX6^ NVI5ZpMU 46Nf y.uHbtԧ&֋ٰ':jC |oY~b!ofO=_z5ܲYS4iңBJh/ -I.M^Nrг;jŒ92펚YRwOWY6^Il{4k`VN-,|~loqnMցmϬ_~Kܘظ 1&^9Ğ0؉{G;_!rEl{a8&f9F;yaYb#+Bx^}b==p˟ğ _}փIK'%>2Õ:ͳW<.t&/o$i0&jya:&my˜xgdϘǤჾ]zt{w>%ҳrC~g&IQղ J&#$))/QYPJrİp2l\CQkd&a} 0BkQ#a+)ԳmۆPMI)Tr|ρS Ec'`2|ft6dG܄Տ=aʰcr?Ѓf{͈dRTxYHżVq^ʃV=i:ǰSx;6=rG;uԀƵfʬ[E'ӑ)8;jV/Vg5Hh쨱_h|3j4`6iwԄ6cuzfw#5LW(PQNٸy##> z:gQ'KxHHs@g4 CC0پisiam?xX۟~ڱc&`Z󻧛%+}t;lŒ.8EKF=n5:-z؃"i2H$ӹRFH3xq:ZKPb"_ead ?oVOJMh 49/yڥn^$ek"9(bT0#})'V U(+{O8ÞQOU6hKDi2m1ؙmM͙3&Lno"9OdwhM3u|u(\I#y2<{ WX׊Wg>&=˯9s=WY=k+o'oSùz*j0EN+=C|Ө! w8}̧)cwgԆ|r.ޤ MC>)4e{@ZDԟ:lIDATړFa:9!{f Cf:n ?D!ט)뤔a^,P1d;e3}) `f T"km0=5}LP[0FA718fxQq|>ԙvV@}zԢl!~182HE@K8b:jȑȖGg fڎǞXe>OQГ3SX?ҧ}q65-:Lь^Ձ̧4$%_j5*QOZk/}ڻF~m/TOf 5:OzF3j=֯rG訡3KwnAC.FM0N؆۰GqDIN`Z1yzl߶HrׯEy0uEްZ< tq;rC4@a} 3' |f-jcID[RYwG+nDi/4 Ј}" v MnKpʻޛ^&E~"m_,/UO_"8JFQ9,*MA=s]ц%Yo?Oz_a/ 7LԔ_!_e14utʌwؤDFd U"뷕W|z7IϘI7i7lڝfCUnՉ]/ g[U<*ޭdf޿CZy~Jȃd5zXaY9P5<ӕ"=8J+2ڀ[&!AS sIR u)\5:FutG2K5u,[G8UFS- PIuuS؏ 1Q$'>ҾPvxA*&*-%R/1 _9V%~w~nx) +u"SEs^Z,)xpX3ߵm^BO^Hg,U" R-76e]21z,A>]Ue#'5"lt8y kdJʼ,sm\s/=n ֒A/4iMоD,7I{,k:M"?DwR TTG>Mͳ_\c$!c/}jg>]5{F˟4)FPuҶN=ّSZ;v>0 XWkڍ:iЎ;L({z^L)1eN}2a4$PUa6ZO/."XNlfaz de-qԬe&LUʗsM)7"':w9P_b<Q[Doޥd̒39)pzV=*!=SdX̡B$%巏3(=.i̺yz '!YPytmSUNSDE2}A +^*ER(I 8aeHQX.2|Y&>f i2ċVw#EzX0 0nidX2:( R i0]I^gd])T|u>Ih0nSX:f[M{_MFȓKR'X?:MRѬ-}SGRcD4b-K Gٞzb18 Yxب6IO, ' V \| Zbp泼WGiY͘)QqMkiQloEq7o.*Z!d(|'`hm">^"䷭J@Bm]njת sZ*)E,'GRI^3;VUi6}ώk QM}ƩZzV?j4=^;?nfg;avM?1?S83=)ЧrcճdJXW/z>Qo/ަh Jclw.Shul٤x"M{{{唣ΊosPצ2vo;ߴd94I^KwtV#/KkGZS^}Ynb'Sb ߕ>te!+|ԭ.=O]^ ;p69yOB̓_3\'+1,G%(1n.o &*$ 3)%h;:1z H*(Ph$4@e(x\T8l^ ?MōSTj>xnf,3BPú(9f@h,hplCi'F̺)S '@fz #1'{( ZIɴGMfE+~J路Q2(?pyيRK QF`y -M&U}]$I=/F# @M{Dói*rS l#y_#/+$N_GY1 @o9sPq )34=FvBF O3cj` t5w`bl~U߬&BI{_-BSX?~L>>*M524 @bk,J!r9cDtPJlI֛h>GX(eSV̰dl)Sl fSC5Ɛ:llbν, 'a2cyCȦ2rh*%*D:#/4@М 6ȥhDRC~3釩PrLv=u ϳ$l6 fCt_<+(Tvi*zw쇤:ѷ0 +Ar e|c#.NT/v xJ6]'6lb%DaoXgכ0'A#EVF,Z Ѡ' Az"T$@' 5 e0 !uRhɇ@~kP$LP4x*nH!IZ%>LYh/%^OTV8D#hٞ=Q+(W$C ؎T$Pl qa^E!Bz0C^+WmoB A|6uOEN╽IEfOKb7Q"S?A*1u ehh Igmdi7uS||>ABA/ R/6ILj[嗓 Qz N4pY6KRHG`v Yb ۶(dky͆rC"ӗɧ YYfSRz@:A髃@bsl|*y1M YJWK*LI:tFN% w1>Ŵ[(WٶI,63@g!Rx<ĬyI[  faL+Cg]ՙҎQh٧:nKeͤ oJYQlGh\hb)լGæ(hE!G  J*"k*0#H=O]馎no2䇖PT潱٬M)5KTa'1:\ }rA]&KN{GpXnsb#}i)WJX?=&p(̺`)A6T b黏C ^.+SL-_aRGFf7lbl70CǰɊoҎb~Cb,_I#WIP {_>铟{/ι"^ $ KcWO,T R"^ NV 8O.еxގ+>v=},:Cq+&qu{FFN6n%.x0T.7}8W]K>I\~ & ߲eڏuo}+g,Dz1kxG?3.8G嬷,f}M/A>>I\ᆍIN3)OBvJw%ذ3 u҆t{h(lxdi: 45Pey -ͷ>IK0Ŷ}E12#-GY C Ɔ *~I l쇗yT?mu\@.R(p2 yp46YTTWXmY v 5KTN{IiֈуB,dd01: 4iLQ{W&(|_(C^"иk:KƆitm$Xs:g̀ vʺ<ALlHۇ{( M$ iVcZ9-%Ƹk2mzuF P^ /BAOu!#E1]UD`uf;Lq|7#AH{6Sv]ˣ`MH&( q k?/A+)\&p8jijYI}$FY݆C#D(e_w3e$Dw,ĩr4},dxr̒.QF[Q[K,iKi:g*#B4`!O=z_ xIuNaD{zߏGxŵe7ވ|8qYg་/A\Ac(Zک!Aαq4#92_XHOwuRb^*>Ty}YO܀w~nwT{YXnM/,qLJ3kIٱcьco-l̖RpS6}1CzjJ5dfͤq8I/?a`\hN%jٺzNYW4)'cYvڍ7>kdz'] p{VkgU~)^|4iioSLxVWNiM8\XNbZr%L1@[Xi&ͥ1F;?DYP=Qnc8|؀$REbzs ~q`u!kaʞƘZJYi/1pE!$ ?+=V s(PY*I*3ߪ*%Q&VHl+rʷ} .I=5Rچ&F]4oPdZ4Q'X*auʨ*\J2u؍SN׊#gdz1HvMcǍ}Od;@VL,tM-YDIq;ĭ7~7E9,'`Fc 74b$.0-XsaّG3ΤE v`A8ͺY 2qa.EA p𩧂*%a5(9+5A03% 0wvBp[%|ɧpO%>`)AEe~Ll<64ws_OǮM!dpoB$2gA6Sh\` ĘAc o˵l)ZgAk4D[՛ w|;xb\t8sO}+.x&~ћ114x?aCDnikdGh?{$nO7i$^j&ZO@@)}k_^j(42λ3::Hg6}\̙gTu+ъN%`8FN^P&P2cx,{ʙ–.3" 6c9p/B]Ђ4> ҐE)XNeԮE{ 7[?]By80CQ8x_~Zv%8+ލT:3b̖hcދ v+{ q­H&r8pCyEK>W;1k.SlbήNhP.JK_u}f;Sq5,:xvPi cVBFk؍×ἫaF#ǫEd|N>7G\J`z;e*+^pvujLPư\s/FjtS=WK=W%ѽUmZM=nRhVJ)+z7~\w;F8rc1,By߷ m+]͝c:eZW}#QWPoLǪ-Lǩ7wwٴ5y: ,ùq[/g|bE.Q;=.E.ٻ0y+1_;ƨd8B], $Pmi㎲>Ys\-%/y~ēpFO}7+Oeii3k01 aX-H9lضߡR^i3bhh0EG;-3QA:@3O'A0 MN8{?0up"bہH [[-:2l>_exշ{FGO7f`y_ ; ]A>VG<POk3* 8NiL.Р*p4

(3sRNmAD]e$#fLİg%5`*(M]G#7(MEkdP^}q~ډh0|ΌtyqxO&F<߲^h3fϦ5vԵc:[A]ӌAlhȟf$4RPHvi)΃c80~*l ~-R~QZ1Hhh Gfd{{c#IH|+(s%B45{Pm@ӌhhxOs/3O< G: 4LFNʢ´&)6AuPj0@6:G=^ttEt|z*}w W}FnSO^7݀s.fµbF?V6G]MmBMS+߆$NuÚʷu;j[bΦ0k:|H?v nT\/ !f<+3a,Z[1sIqƢW!@"Ǎy3"@ {Puކ&v8#ݸw㗟E#&G:Az`>`[ 44|ՠ=3o}w݋o}ģ8ӌt~o}؂ f#J`mw~?G5`a=Vg+!Zk,Lh Zל7G X[΢S#Vm˾9T]K+h:Ⱥ)H{SJD^tSc'e*bځ m觝{Өxm?3N\F8H W q88ԏ xWgRt0g8{bطy30v <bwA>oچl2:Ikt[zfq¼ۗ+5X9N!WM[%M|-o-nc9vu~+շ(X<%f4^mmm&-.?QAyq2BCth1~ۣ" g4ZBXT{ ѱ2`z})aulR^ x{woM8niqWL "V,-̚)fD^̹ĩȟܰuՏIHC] (!5U*K@kv_ƪ/kvĦ'ڼUPj~S .@Rs凢xznʨ}#wKhJtEf|Ϛ-Q3'uqu׾~+@cѵkltِF^/NL3x-"sgk0_.%20y$')=t}{1tŚ}{g!87|?`έf!'>:UԢW!Va$YkVлj-rY7FCr)x8#cޢHlN9DYoSC{87 O= (Ws.;qܒ GR`N[|μ*+g߫Fַbg`8-oĒk^׾S[pmBmĥx߃Ip[mU};Vj{B_(~ ũ]( ZW"  #>(~7S>կ{!R}X`"NPM8=}h]hM8u.z;qοgaL[N*~Әd)2YCA=,ΛDw<.Z vx>5ñ~ YLa#UZsZSFraL ۦ{!p__aor]2^z.pBGȆ7᲏~۰sѝj*~gxοF\7㼷ȴqo3V-' Jp6aqƄy͏ujP>򪡖~*.>x$_^."[)ÉUH k*$ r^IWuJɀh -040X*@}z[~oCO t"x.zM8r7\`@|٥}.㈣G zt|c->Zo2q/o8.SS $&`ڪx՛ǥ7+.nz]y.AݬY8KpK.N@g4)h33yaͲ57݈kzw㪫4X6M+])K<݌Bw~@&? 4/9-A'w8ȺzM(Rg&|$94k[uͦ C2H 78Ŭ /:2F>¤eKhmw~u ~z]u/][Qk.ns0%)gWtN*^vꦁFdۉH}qވybaM"YFӟH>nZǏG:NlOZ1f/X_-mԎzxr9]YD@}Oa-Zコ/6n2;V_E{V+V,ms8~e,[ ZF:Wd}`F3Td7Xv4o)3f'u^B_&gCCٙS'񧘛Mu-WqgtE$TriSwCMgbg_<;on'9;G/?O፠?5_Ś{7,1 Nŭ_y05~__G#4dY6yxft"vFd)'~lE,9$3]fo Zl)p4Z%] ϫ}HNΕZٌZNF!ç(([K̘ń$|p-GFM2+h1+y˳|X ؄#0ťV]W%XmeTCF -_@O7uDЪCZudCع{v8VD*6`ʴY@s 劙wX">y1ylD"R1= ԄB[7n@KS3N1S`מ={.wߋ;|3K/滚Pt9s>$cظyY> :Y tKWM`4L>l|g;K1c`uo`G&H1. }}ؿe&Nqoԓ@!m Z[Ecce4lOY1} %JMJyrz jG9# 9f1p.]xlFL"mT,;̼OYOs'9{-&_*|G^30v\t$Hn:)Apxc\i톷 7Mh2w: ibApuOWK=q2Ѐp.xrˆN  XH߫BA4eSf$;evEkP~y藾w=h?=p?-~Ps2s:4 ˟Ƿ>80n "+4͍h't+6yQLbAL_Lwc}fMeph8Tlڸ?j1yj n' Cک|~ȕNUPFNnF w֢uXA_{Gg\Ft.mF?-HVc&6{w| =Um[~^LZ. ]{өC}s6 lg?vj4Θf$f`ݣᇷފ Xyh6:hj4n pجS櫯MAwܼ|ߌX#1cLJJtuwCa]Bɟ2i8u`R¬]aT2t ~q&85y,*ok@7Vۆ6L_q <,v o0ӥZ {1qMo1|xG?ߋ`pi'c͞]h;ǝL2_;Y׌vn3DW!,ntOlpSO`1y*W"h(2OCӏ?A ffY)`ZȬG Ӵ65R 緻$a7ӭw̝}] oݳ W,͈x,o5h;V4#HSכO:8Z sϾgv&Na?i< }"&W6+Oɷ)euG]:-2 ̣G<3y:.~u8Ʒ`쬹Xo@vU 9[0s_ MbFTZ$#CE+k2Zu7:t[uHɓ'͜Æuup(hAS#"h%za ,OE:ǪyX 뜎껔IJɠy+~?1͝8g;d\Pz}<ؽs࢐":b BHgHlT()S69<`5g㶣 i!Q[?y>rmnh>S1%`صq+nOdB(=Ͼ ߻8p)(u$1lÍGI=}}ɗo| '?~0IlSY6It1s\\|ŸKJ~%C KTSo668kFT^ MҠ yf.b$b?wֹsqKąb9ͻ^r\KM5٩q׮] 8$A߱5j}Xz="v+0ybѨI; 9yfb عyU+C\ڤ5 l7rvbڸ͘z gSo~,0 ^2nUwi'SOe&Nܺ-EoAϧ?S]TvZ*̻1LX)cv!lAĩC]h$O  !{c ސhʤI4%ߓ<͙˶YKOB>mS'Vp DƌnΥ0T ԻW>9zF$1Z-+d2Ok" S^Pݠ9r>ui2{k/G!\@VoN=i|D7el5rBg zY~}( }A"g/t5H JƆ0w>x#̘ϜȘᤞ2ש<ĝOb)'C0mżJ8k3ɛ&O2KW[o3o{#ݕnj3{04zÿڎos3xqfpZ3娑|%cن:oC'Z3TGv"[QAd/cul没iENVg*i)F\8BDZ&h"1@0IfL5ffK>Ko~3~_~ʟzVRg)>Tp8xYl R 3'ѐ 1,D++rVPbLJ='Abo Wx> .,4gLR|s(+)wArMmFmN87Ҕ)adH>Eto-ߢm̰|'Vб|%-?0ꦛzZDh?\:5vQ[[[͖ۋ!DGCؚW% "sS0 ZРc0Yu^*c#xɑ&3FֱMF+:P9xun*Rh?j¸׎7 +;ܺ 3L78q% {Thnƫ/z5yg֡6 @)A4҈mX55SGdoŃ O"z{+Fyvx>øKbCebƴ`zvoz { @2@]Gcaܒ߀> (3~/G"F p~wŹhNPܲ ͩ>sq9a~@j~t_6f,1 6 ZԸ+V}5 l l.4]SWªVo ?\\t <Sy˖ܥPC@WKLOoqᩧᵧ.AxV{~Z ǍP 0E3лa8<\{3k6%k1~(-El[)  #K(X*'rux L[ʏ(R@%•_V`r3|0la?؇kO?v VwV8Gqݷr}Ca7j["z?y;PiŅcF9FclKW?ƿ}?2C!\|ȤҠS c fΞҜ?W#b>ǟrȺ)<'VQvF7f)AǣirF(E+XǺvg^I o? ǃP*R|it2yWw3&LBK0F bklEü)1P}'&.;'?M7<yC> XHO~~nM) jyD.Rc(N8y@Okq yHH/zf_4e\í_<n$l)g;w;&.8,YOw'?N<2LY0f|3'ҋSQF  b~[ܹS^68pt>e6^ʸxj[#S>֛pͅBww1m‰3 4-BZX ţ;:+Mnjf,y9:`.T(5E]Ħh8Ŧ{1nt/лvzݵއi|ahۆ-^OX ;ôԟ#b 94ÃH! a?b'DSrouMwc#rDկiIL8L8YwrČ%lv9'v$cXr1c#~ٯӧcYRy+C|? _{ބo~?B{mq ec 1GXVqEb=/ (^oٌ9\kv\ | ݁q^Å.' x'':ȡ]Lr[p|g\y16UђFjy%)ئ5QlEsMy$;-]r;(ZF9+3$^{};PpO .g_S.ҹoz*-'O?浵cX6g&67Mշk'k׭>L/V 8~R4R!x\#-aMcQ_W˶q-91S`R4~{ɋy䫮ĢEaI'ų۾%`dfkxENaLSTo`mHS -W&ZƶQd;`. bɪS ={pŠlq8NeʮqbBiƱ-zʼ#Ff; L̞Ӑ6# ZX\ԑ>y\K &/Y۱gv uJ=e 4M X$̿2ng2v 8ܳ)B[cΆAw!ʋ bd[t CQ\i?m'^I{؏NY;o'a"Yv̘6i0/lm{]cKf:L?3]{6^Fp%U)*ӈɎP_3źGvwv?<:xZGH"By!5c]G[TS&5Ҙ$>KZOgEޅf($u icC6>$u~ 'B2-5htL}S =/蠡)evG]bY^M$I8\/Z|ɣQa DSOM8e;ߋ7a-XwY b}xxa6<=>9Az|X2GFLO{vÖ5kY<م8q3kq6mD ؿfYM#pAT:߃8+FrC ٍwh1Caapv㶕ѻu a[7CO,fޛMǎ%`c`muPcw#Hexfz!?}l{@ãXq|l v?5FXk)rڐ*4ib-95N*܅ и6v`[гQhf/@`_jj1ر󴋲lѵ@O/iI#S?b0_I6$4Qg^VNx?v1 Hvvd;vRZT[gʑy_kǤ8uȬzCe8ȃعk+$6]>i &b,#֩^qkQ chxs/ĺ>/."޹žˠB,Ĵ3qϨeb~SKj\ Q[U ) ͠}U rYf@;Oeht~rUe6A#t8`}@~?{PT/S7jq5WaGyAYlPI×ު[`FKR K=pgݟ ԘKEA$"@V J=nq  -]qCWs 5)6! I"`KaƌVa[mi7@4aA l^܉Zqmc&abBByJ 㚚ZѰ< QuFcc:#%Dx12KůE!ʘ+Q >f 闳ft8짠1 rŒ X5YJt|}4Pt<̢!"6F0QYIN&\! 7> F"5RV] ˯+/>|AsU)t*k> q3w7cμ:|߅`^ Y MQ865^U8̂j[.q*=w)^hC:#Z3{bLsN T)҈, Ygz~c,<Ԩ=WЈ)+o^$ ͞eU Z @IQ>[+} 8S`<_B۞PYLά S?A6%pW%wd'xtf~&vv5Љ :O$RloZ\ob9бgcN!ڭ!h zP"h=4z&9zP4. `85԰mĺп j$eIU9)8[0vz)oR)#9G{ÆF(A匐q R o[|/~NHz=WMp&Yg.=?)2j^)  F7D[K74`86LHY\Fw͍mf훮^4 M}g=;Ff9Bä/#wniYtPw4!b8E]l2yiO";B#{_*(炔_4c͈KFuB5ZxǪ&d ٝp fd JF$hh%o$OAG]l6[;Qc&t0&C0xV nԭ4@xJ;G %bT$@M}za'V$m"CrK <k Rf[^S]{0:1me3D>LD\/k$Ӱ< ~u60=r[k',[k%JFg$o hڃAﴞFB5F7뻲 M! EӕBWMu ٶ2QVXOW) G:*1Q? lώ"qНK`̊ߌp:Hk]j2~^A.3B-Q4  wt E׃e˖ζ᡽ٽ{>`fF3ɑ/Wʗ׍Ȫ1!xQS1Ozo"夘ˋ 8|w/h[/x(cĔĭn #/|$D}qa|Ҏ3.c/}1khԝE]f1,Ég)'|0/]a{AؓY>$עf Gtm& 'z;0wh, MH;zmxWSΆŏ4⏽-> 4m^CAQ*jsO=9{ ÄQ6$~JڨA=@vzhpܹsF#iLb0󬎨:8^[٪UFH RI:I9:Â5fݿGyx됥=g6ك||P)J12MӐ/{5ZG@"<ֱ[vm7գ#Qp$rE̺'BDq{H]b*z6:&kdc3ϐ@@*cF}lhy4Iۏ$A 0L*'U HRԸ|(k/ X-I$%-imD'x*G ht qNQ "^ "ݬR} $3S.-hx x(L>*(m{a4GU_F֒A5RT4‚˫~C rZYHX%-И`fcN @ '_Q5 sֺx/!ÃLPR*Ryc"A[l84j=!FCp 8Y;먐C0Aa|XD K8v鍵upl9-T[K~ ri%#?jݛ#gޥ /C:|IQ5y+5s.~K|cgIbP  b34-HpickwD -'ڪV ʸn*DbO h4w<'0}h ́z>BW!i+'D*"'{u5,66jg;oįMb5~r(XƁ#r&|'G=.9`A0|mE;ȿK#j|46mFN,8t[>XGJ_Qk}1 Xra#:H X1Z:$ɟԙҫzQ+C}CmPشƼaoQnɿS00DC1BP8dr ^pfiXh!Cm!vQNMtP礵X|wŐc[hѰlab $F@=5{Rl2}e|z)mIj=%NʍƦzDi4h޵(cϞ]fb#H-U2PO/:n0!uyenfۡ2[FDz5cP&5f)qvohWGՅ4n@Z\ z"(ISPSn1uUҠVI;e;h K^m`PK):NI 8Oll7a֋p^|t|~2uAWT 6; _hX}5jHz~YOV"Ju?~LAN1T`YN S^e@:V8. A'g#sh",9qfR批n0]ֈACyQgYHXĺaVi؆VvQY'^//MR|A?˴#&6ovrdvkC,ۗ)kBzI&; Lx!RK,o:qa݄%4}Ea c#e3S@Mގ6c-u ZΌNCtFb;Ԑ߅ }kmTlviK1yO6}Q$4bc#j Ÿ .V,F2,]r(ޤsHu0La7fL1T(}Ÿz4` F(+4e剈}霓tSJ?خs]}3My#Lk(c5cߴ~׹s+mZC?M?ء#FfYpl,nRnGzq,(~`ݮعۨj vʮ!;ѽ{u.T(}bS3ie)'eˀɓ"nsCQDd͛D\*ȹ+'d[l1#5F&M22$HIVa~zB~+sK@)s]UHEf R5Y2(u9fa?4 R3qXFȤh~D+PF͐9T^J8Z^`G})~V//_BAEJ ]";͇q(KEsvPn*Βqy|voi°Ed񱱬AgT|l c!%փr:NB-1:Zu.:=C#RxSmu^|dq$`V@AD Nҋ4xI]؟F6Y.J!5 է45ʓ'W#az2Ewt^֭$MظV'!z]y`Lɬ)P!hdYWS\Z~]] jkj R:(]T(S4&BF^1l~Ro݈v{~򩿌K~TjhRoĆidR%3xL%hjhzFp5ye{zMz*rVhD);5}:(B6sDԱ}jmg9Q"4&h|-;]M˧nC!@c%U\5DC'Pu6Y|WumR>彔=ɚ߯ѩJFio:߉džBGCzq(ڏPK !K~m?і ҹBʼna4ZIA,,!QiPk3ب5]3A*`c>Y^4A@ M!=Y2J `Lr}y*|M?* j+U:oy8ƺ*'0*oXXA=0BѬ${ae zEm.xS`Z|g%X'^g*#DYѩMۼ5; f:648h< Ҽ;EX~SV!d€irhL)Q`ݨ1 $XWڣ8#Y8HLϨ0G񔙂# S6駁e;Դ.?i()OͲQrR$G Ah+.!os/xJG z,:Yc22գcͦ|VP_CC/H]׃tJ#nHL5EyZK) LwTJQ>iÆp6u"wyCԱ."3ʆ@xFپ4]/14@=cɡA$PL&wE-sPy[lÙ~xM=fʛRKJ6M=MfQL(QoKʩ`dt3(V ]$ԯ5ErWg #fQʋ$E'[35mfMє.q^20iEPH{os1,ByB-KVGM>B`.nj֩h3CvF@Yı BJ Y-lTAHQ"iF㤨4 UsfuOxO^Z$&6ulEkGG=y@  ИbQ 3 $=4Y\< {t,0b42Y~ GEs6 ē GYyY;ʐ5AH8+Fes-Fe/fC0׆i(1=!QF9dcv12L(2.5*|W /:J}TmYGP4 (H.lmV dLbWJb2S(S/='|e(l,P!P6u..کguڦs2_OT-PK\)R^ٸzJ꤭[Pf)u=C x7تwj~33PWWNq;HauqnECE: j#V KTc;ֱj +@MF!-4ńunF=rh(-sMoV$ )LP 24Y _ލC|ӆA1cp[nĶ'`75ME%Qe󛵘@I, 28fP~E`!fzy]-"AgrTZ 괧^2}MKeh|maԑ>Y3MJPᆱ0il$jVKFzJ4M5w>4if}Cl@6QxzQ Q: 4JUgySFh(IkÈj4V-]f^l%QP66L6ik<];BOH`wr4bDS5faa}zbٔb8 鬺[-ZM= Յ&| %MKv Abpe5JS ( C YNU$ fK (g|ćU>4o$)ьRq6`4TJ $]jfJl7Z"H ԄpdPkZsi7bnP"3o@m|\gZd4YzzM¥>FY0O^tV#!"`QX걔w܄طg?~%vxYL" i13N±ń[ɟ2f=ʁRAhS]M7S.uAUUSĿ.OO^^H\|62hcB}b.O?G]jkux } ?4 776#m9i$[%Oaui&M_hqO@J[SddKQa/| MY*9jmsY h`--L!e'GK Y~zĔ5Y2:Ͱr*#nDRĢI-E4&?{*O-A)zCx@!#TB WhH%:t]A0ryψ_œAQ(wA] ܚw^KZ߯"1c t{,L9JTINFw8LÖ/nUy mWS#3k՟Ay֚Gk*h2)jx}x@z)A40xC+F;ExH!GߠBXPQabPyg ~%n}VA8SV(h@@YmG h mt_fdXjL=Ȫ-F9ՋE5E is۞Z~s1T2% _8r0OG`)N?Ǐki`jՈv)XeS([ J}z`7:Xzt~wXtT۳B~=k79*hVW_cBUVA6RuKEx |?EMZS%ʸ(;H>6<Æ#$_ QA M߭(5۷o7I)4cA4:?ZO請>r!AP` ܂'acMiCǴ\n C}h1RV\lP5DUPurt>Sxn[U{ynqtegjt^A혒ϊnq':>rȑEJtJׄ =hnG?Q1_ h.>6 hWHo{[Lg’#XH, r _'4U^of*:Rk*UUCӋdہhΝ !Ǜ>?$'zã!5Qo/lS|a\vƷ/TtR򝲈 jl%ژm#rE)˧ohYO`k [9̥3%=#@X| (xU 3A;N+yZrT 䜒L';^5zu {x֝^[XS_l_4uN%mԫ<0~5JαLm', H#jtx̎O2Q= '*Œ{#C8uVt&=Qںr'II*b .}A!u=n6&'mn'eGۀ|9gxW;I5.~Dn*o 趣뎑u7hlxxfٹԗ-#̽N*?bfX O`i{8ϬU%oaAgU,CՁ&EΩFJ8Q9iLD*]uG8m f ui'9j,Gd>k l,E/~)ԁbvGi„ y3<P]3a/#jXP@CB:@!g94^lH3HiiMW2#.7H >L2=:=RG+뺥Pu4ƪcGհt˖ҲFz6~XTSF Pz*rJ3; ` ^*ȶެQTM~͹`|T/#a-Ig%0-:X*2G,RzoFC/:TyRȢb#%kBd)7|n4ϝn[%-ι jbOsU0H W]ΐWd(gGcWW3A@%@DiXzӣZm !RTSJ:+M︓s|46sl{4jv(XM6Q#e8IcuX\U5Nxhʜ]s(GM}:jƎik/ީi&¼#n<;;/FFTIlGA$!,R"A[! cկn:;L;7ߌu=f8}fxL3}U8c'Չ)Zˌ8j(UMU&Xt̬zr֌)94*U!V/`[@7rI~p>ӸY|uUz/9/дM0;n9PBMA´AAImQA,19`RUGi9<+Gz0<,ﳗ6ѦږϣGΓ URTX+OT7TmԠceg5PVAyig{UBu4jW3:7,P3fNWx*3ULcAkeNX:^2~w.#x 8c*v9Gh$^^ žt+k8.2-GzNeQ]c fѢP,eISCygؼ n[K;J~!CYӂ㧝y.t}P&ɮr9 >0}h!M)$q yiA.LZ1oz3JOo?5D\Ѧ4Z#|ȋC(yx9ny[l+B uzEq-j)W RϵnYl-AP.xDGSU$5t-O"i+ԞR'vq֓'4sO<҇qiij6%/4 ڴ _=ܸ.N]rJl@HyqLh12Duy$dL ]29j\v*T55{Ў}(m);4Z0P$3#=%DIaH#$&RrL f'G3VK婑 G%YϋόRoR~G+u+?+9MuZ 9^Y6e9~rXA9Vm} ʫZgz*I yK7V asِj]8fiM{ 5#-%^NXgngn=RgYh_rT₄dTllsCo5.G,A@$Uzݼ|uty[ݔh&rwWjW ųU@QG=*H5qXVNJ58^tN ' zFHRVN"50獣Q݋tԼ@S)fDM8i[q׬}Q#E+H-F jM{D%U(ˋMX`ܵ >xq3i4zv4$D<aֵkM3&*.]=y"DZo?#<*)DN)O5?aֳ#?ߤ|FֱyKtl:ozΔiEw7˜#]kX/6^CP}sNC[md#Nu|Er-Zvw|&`ihSGm]jcN u;ˡ>KX-K0T4ݔTwGl,g00QW*IY0^abZO~aʹkYgAVj-Kq=1a=|.":WgS7{+4BvɊekkF߾=h7TVy,oD:Rѻ ,w,jpAm HTɤZNwgSI<wQMz1a4ό~|s!X:F \S:cCuAmAKSYo>QfxmI<&RQ(| fgRe2t1Qu{sEz4 26fjpF̘>ڥs3备fZ_X&0 O;9{uur[:HK/HkT=nGx:X"@%oyp@w/u SdASn|r$EM[&meTEdh/ ?)yVV/vy?tmv#ob h4cva_)ӯ8K;8].ƫ1g GҤ$Ϥx5--aQ`9X狣b1L{QNJ\5ZǣQ̌c¨/qފ҈ӤE ƤVg;wtȱRIW>+)3$jʅj,y)vѳO3Q1EQTg+yH1Yl!*F54]Y=T,{x4?#QCCH,H`!*:p;Vp{~]FμD^>^ 0O^g**>ams/gP,eP`̒IS1#:ӔQ J%$ hmE{=FǣύG6hB}*aVۨU:dևz E#ChA(A B8JR=q='M梮vD7)ҏ fI_)uf^]"9yB<m2%΢lS1Z AeW )ۼzˈSo0T&{~Xy/LK"my g` p(@b girG*XËIMoՕGXZ-LɸS1,+|̻yo1/aT=* b,} qc(B1ʳ].tPvɾ)iOhCFi9^~}8:H>:/ǕΉ^ӌJDEK GQw6EJ -[|Hb7钫/GUEn{f'\vykq~J>r`ؖ h)$E%yq$."7e5e4,Y14^aS/2u+:8N)SkRF_f,y)iyǩVcymZ*bƷ$Z}s"mE:)U~[+?{đ{Mx,#]yY9ږ*ST޺f'* F:\FH*znA9#ݼGvyoV<⹑ZIl,wx_|Fu{\|uJw >yW*FSPm$) )CO'!X(8A9Fq%C1"f z.U̲hQ+ss1 zig V^&?\ϳ IA\bqz{[m:8\뮶(ߒ B YhjEU:g0ޣ_ :҂(uP̴Sr,bk2$A*/ymLQY2R(k}ka㨯A!f.FDKOoGJ9L$]IQWBV9w~m`0v. {wuoQ?77SoI蜍8ͦ2C*m.aFu[ԊG#ϽԊֻ,&꘩thcaH YyQXL|j[ONe:>:6m!ӌtױG  /kԞ=Ϛr)<'PUGϖW70`Tɷ[b+x + v%QdY5^-K;gڽh3ZξRﶂ堑ѩrbU1MG 5F"Awy{j&ֶaǦ4͙ufs5Ư<aon%o"}mf*iK]i}wߍo'~yWOEFe9({mom皚Gc̙ƶE;?Gu,zHNSEFXR eG'{Ax#! cY|N[Gjg{WDYCf0--Uh20mNbS˕Met E./i+%SG l FW Gl3Bɔ1RV&jFF{uG`E[hE\1NA;J88rh/Qs`T^4۟Z3eS'SoDLZR>SF:*yaEccjgQ3z2ύ:ԟfp'mܩjtfGؠ48Y)YUkv*R.QgXQx\0-=x <5CF5+` TqC@<n0lf:`evgh$qu[23%"f4QxLF^1kXvmÕCs|m‡0uR?5}ǃ, RYLfG:մtߤNt&_J&|Q R-r]73h^?E`0P"@`'] l|)ot[ߣ /~c=i~$c5F3xs^"EhKpΕg|F, Bh#]Dff/Y[rKke/:jt9׼)[%zX srP&H뷈mW,|\MMf1;~˨T|S}OB_yx|x?r\d>ZG_I ^I$QC"Qyķ _a>]63QK2$CRj:9+H+% ܠ$ICXgːdҌ98qT_qT4 % jc-u^ S{uiϺN-“%;KNxH034t] _REZX4sn* !3{ylW`6btlxNNюp`}c}!%1DhOSHX4QN=شwM-$}`6 3fLmРݨh PNLo?Cvh6LcZLD4Cm'!9vQO$Rq G*RuLAe7~GUߠo_#J45d}HԚ6 nփYk(S-j]F"_WU97.T6mXY1?FHaoFnpJL/W b۹,BE DYU]4~=@"EAֱ^D*y Ra44ÍMl vZgO0y,,:~u+D>FKC 3@ItCF|Ad2y2'%ʱBYf=GgP.h8kftbpzȰ|څ.?  'T3QWj|ر{A/, Oeihbv ɲ;Y6ׇAo6&1pעpA ImXWe|4-c\qRA:o+.Cìiw L=-ZGPۄ睁'q0e:h:CKLw8!4aÞF'aɒ:O>`wwo&Ǐ͛ac{uMUWu[_S]Lbny F d j1aoK#6ljvQ6-:,pm>͢,` HT̶hrַjz4SMz }Vs@ןrMFSI3z1"IE3pEzagw&3់ +V?,&i6H2ϩgN7!C _MA*;9W\)`:Hvt$u֌矆ge<IĶc'嬓P{,3']p:7B¹Xt}|.ttu Q(T.*M{M]Ƣe' OF]M-N1B̙?q"N\"Fp"<I/ dw1]l9&ru6#sc0eh5}g\{|8ڛeV.AFsH61U4`O!`Y2g6X9 0CnLb,^z#88=Zؗ6@{c+ ZݴKmVǨvy?_N5J&g[(1'd1 !޶JE,\} F/h!S'!],}+o#3 Y.fQ#ka-c.!* ;C8ƍA Ku Eʡ l4*] I 3hG7],,,/yr}K-Fט5j>^s42FXFGutth[X#g Lb o9ya>IJ8SQ!rcSKUG~hIuJ|`~>sErh?: Y/prEй+WbeU_X =јeߋۋ~2uw lv<ہJCrzyO@  Hџ+7Aq+x(}8LpQɐ&Hgp"ìͩ~MQ@g!8dG&d%u|)[7:TN,áxlD&H2'7 6z}%@;;1Yy9(QG)H qE8+pl߹@s2Gkn{7ގh 8LU1D݄pc.G`$t;kaUWċ/n?}7[y p6F()ֵ᧑( >/GUQI̞ó}{##/>fEl0,9Vu68Wa%VGČ1Xz|pɇ}È3A/Z'O ׿\r D9UP{*۲̀)Sp mZThpd($h6 c n.F߈ `9,a/Y(*+5H猎u|0^B:VPު+Xy*93 G@1GIuRb꣚HqFu-Fi'H[ޘ .a<_S iwx;i5,^gw0@AbRniūoz#M<ғ/zCز/Gh|Dр&r4݃ |r2l4 *u\`5BkI+輳c|ĔQt6sl fX7O>L-4"Wmz򊋱njUU_WA 6yK4:*k sШ_ sՍڍ)rhm4r\o_/iˏUrhaMe&*F!9zs Gاьm)\ Hӎ ɴFnHL~tKH5zF:|D*eᴥTo|_ :_v~s]ؼi;&͘y'%Vc|Mck_ID܄VxY&MCGЁކN~5_n ΅}L z-]. ;Vk/ⱎq)hZ׼pʛ_6lSCqGއ&cMBy8-aWU1Ju83z|L947>7OYgi<֑93p֍׿P6x7v j(8 .|WvGmCuMdEZsk5olp`-mdFij<ß ;W~4DfOc9᳿)q3n;dL'r9'NwumG"|C:j~+5hSCf`Q3'*?'|/|~L[u9'őM[oã_ Z]n>;_V|7ٯaNOA`^;?W>9nvC[4x¨wmn³Nǡ?17pŅZ&Csv[Or4,.Z`x3hgUtTA_pcNEֳRVⱞ_jD4ⲥ fp }ˇ?o0혺j5PzCx܊yH^Tt3;9KΒA#3 ܝ9|f=deas<9ꩥwUz{¯~~[vgdl6U߳~vӧhΰd˺!Eۡl?Y'iGz3{J.~}zRq2,޳H_uׇY.BnްѾo>9m|>_VLtвU6(YI^I"I[!M{7[a^7[j~ym᧜lWQgjKN8ޞ<s$;[6Lbk}_/qz._n<1vf֭_x ?ĥ?yϖO=ַٞ)>Ҏ7ີǺ.'HO? ˩+ ^xlaYٺw(|/;S;lXz/p'p'aj%>]ww }f&-mŪ>ю>h忽r %RV]|/cG^]otiٶ_YgSf[jAxm߲ݶndGjΐI[{z;acnLF̛tCsӄy7O?-d31Jb 3Z)&S5uP~zU.ޜӻPK4B?Gq'Y'gǭS;-BfnʓVZ활%H&뼠ktXgas#{XUFmi2mu["W|nQO- 5G=c 끲6<ͼxU ^ZOX_!9lfֵuP!nn]bl5($?OְEܿDDY\/cء;ngcSu |\$]iLJd ҿ~CM^;H|h91x ''9؟~w?vu7ڒ%zomf{׻mWGֳ0;, 5G?ofŪ+ݹŮ:۾}?)VɖʶdJ)Άۯ/8th\heAˋhM7f^r2J+3yEV.Uͤ2[xe'%4:l;t*KZc.`UT22^Wp |_wq<=5;V:y'/|]dwR}ⓤf,]em۾z|/u/|J ۯsPǞmv;f<9鶒IG?_o{=X-;e\wՊ6+=Oڲ ;xg8ØhIX6pp4fu<)f۹V@Gh{يőު:OV݁͵x~{p]}i;&jCYE}l|&*JDMs$thE, Rfz,?!?^ŏ~?~lͻUqٳj;be(=%ϳz;ş?v|SJfl4e#,=̬ mrζ_{۸¹S:}\s_S;\Ϊ`ؒЧ֍{nmW#d)uOݪ%!gYf144@{IwNe_}_/TR]]%::߿U'D:L?^s}3+{wa߲~Kh,~$#}_ՌfYw-f;vٹyrz!9nG?m?\xۏ~obq96xX װ_b{>`-ēO_rw]nFw{_+CqzշWm˝O| 3v3a~ի%dVEOV:[̶]6lERIK m;,. ֩\\;#K-zϱG?vm>t`깼ʎPLΆ=l6p.nqӽ~WExot 7_k!fz_3 W;hqt&ΓYȅZL79@G,fFJV)5KCV+le*=jcӖ&Mъ;w -ӸY(،%kY,&fYaweG~g=8ܵA[nfm֑UV5tZQVv4SSS y8cA$HN`yo`1G5ĸ|YQGZJ3 | +vC"LE %nSz*&AJ[0;Yf|R[:ƞ϶| 5]e^+IĤ֮ܲZc錸4dc_r~Ŏ=dY.'d)~(s:GU9>o#.,.[6o%)+TlM1kw&FƭgRzk9>OX(9 "Yoۧ;e,l΂RʢN=inس +hzV)줓On^؇V?3ΰG<,wi*%iF?OnGiCv>>X0wRKm6>1:cGkao?ﯲ'>鉮fs!]Oϭ/QwͲh!PܢKk%N#,'CɰWsvP)-&[7bWvg>i}l71iE=߾ӄ@96߾6\+{ߵO~voK- ZE3 >UX~z*2iK;ԜոPcC\VeX+(ikF②([C'{GL7l~澖o{Y/|wnW_r&d&Z>3kdIp}j;}$=} 6JfGbٙ)YN~mWG}~ۦkI×h;S{} M&ԓdv׿n'w܆%#U15k&}^mf1|yj`U ' eAK$4qNDMZAkvFϫmM#~?cnfci6 wClS>1{_![nE.WYDv%v^fJWX;FF̶컉̌F[,j]}gf-۝]u>^6`k.o,bL}_& `bm^1 EX#]$"e $Rvuֿ(%E_vM2 ֗pK5|/>7)iF v-nviz'=Ʋg?]}uVk&&-&X9h,XuTY_q[>+617eSA;͛,;>aC]j/m6㦛qum;[`tڧ֕-Q&m7w>ߵdsy[E2EKs"rDv{z;-~I$Gj'ʅiqG D)s[畵W^)yo޵nu . Ƀy7;Bj{ ZTۺj@r^6Y6tr1eܴ"ItX*VjpdGi"{G-Jڍo頉]6~mv% 76:ff%;dIɂmKڢ cvO.[.Fv˯lނSm!e]e%+NK, |MZsՂ͖VjwUv&Wru/C>җ)ѯ^+YL:)[4S}!q/ &]z2l;xEf)km…{ͩw˲^jmK-ڝ.[2o;휳sxMn>wm9Hm{f']YDa7ܙ=3mlԦ`힒]5~Od&BPx UGZCַz_]qolm8l<6f'lQ}=QYj"{腯'k㥌]FcbBm,uw>Ƭlõg=LÆlFqlΎ@Ӟa-V u)촜EֶnصjBk6mI ٙlY| l&_k 96ʹ/ CsXUg|^vfQfgYF_hȻl <w 9?ߓk-,3Ock@/~wIEY 8ՅmlJ&-ʌkwBXv6Xmvքڝ+)}ݩIN8Gj4kkRFc+UTzӺ x zaW,pLwOlZ}}l2@q`jEVv&'']]IfՊr[=$ 5"!u!S1 ź |%|U L'OlkmRٯ+C'0Zq 5(ܨX8yqUbQ Ѫ($^ `נ[h9T;0]ՠ5̶x}EС.i[cy~z&4ݺv߹Yٗ_/}ƶlh}yv#ϱg><;뤇XnߘE9Rl,k=ɭ;ȳix݅v?bG+`8ϰ׼Ev#k~*ڒB8QGǝ`m9m{F5O}^k)kdCnKSMfٲUW[^zD6t RfdPe9 $ ٽ#f+W>k,I_*6On/x?/xmo-6_u6^'1d>ηO{'ڝePsf1*}8|kR_X#hƮ /;RXi c^?u׽vw.6؊.oP0vc֦%͆XG`=j`:iS{eoZvRL[PnJetMM+#&mDB, Ն ˗4ۻFvX8F," !o5ǫ{RhkO;`zt QG`d(KTk)/-\Fx:zN9.V6en]n;llEW-_ض]spB2)gحW_cMR;ª;ڏud Vlzψ-OJpu[|jƖ ۯʢ;XP5VXqrʮ{-?6nF"C"&onzvܾ1z--Tl6#E ⮰ubУ(2 ?eR~ȁ<oz>Yb}^m\ (Ǫ}eԕΖ?awڞM[,#{U,+dni8e\k;WXRHy쿘`dlʍU=v/c֬S#vo/nEg 6q+j,-~X[6[e.VkK]`ed'glZvb}רW\cMlB8ct5J }7m+]}۝dߍ[Rlˁ.` =@Mq ;~ǧkɏ"}L/qǏxqQvѫfIM5ó⑉q[*ؐ.cO nGߚ@[58"8P:U ƭM'ٔ^{-)^K8y]-![ܦW[*_*y5&BDϡ=cH۹4v|Cݬa<|I.kg'm9U|W5T aWֈKDl ˎ*I)aLׅEAT>$'[XRvˬ£;4_v[<`:_ZdETg"cݿD/"pzj|VVEŒӀjŋ]֭~,-\L@ڪt^6 Ԙk|kl,AwWh);ϲ_vMa1M*1(ymҬ l5w)0b`q),WȻH,je42b/P Q΅~2o:tr4~ӘOrgtn8S89FS?m!D,pxHQe,s\CK\A~OL\[Pf3mN/}. 2XxPEr%> 9;Q)wdÚ\p곯K?y7cm[1g\bФ;YRMWKCڻN6fp'_2HtaUYK)Eo;6{ѐeϮU}G;- '/|=~ZenwmB4 isxEox^щSS/IsZ:rvIIvvJ(H\*LXE\1oKW3O9ͮlZܜ5+"*B6Oyx/~eE}[v {u[mJ+7Xï zޛy Scmv;-cWJ/pAK?'m̴_O_ضSIK&_cxqw.I Uҕ6r#G౹~pݾg,iwll}8\r֙p19a+߈sD/ˌ۲Iٚ]/ϧgf QB% H!2AUj6Pl0jR@A9&RbT.XJ4H򄤷sVZUBx 8s3"uYg$u(Hߥ ]F~ΕyR=֧07-j|u艹B%^h>`!1#Z܆;+l z&Az3ljFIDAT_gaIɣ~Narqκ;֑YTV6kn+~',e֦)NKiBO"jigsu[Bżuω2EdiUGHg ,x]uqMbe.Z".[N}6M_Y`bFYvdWX$NTBw3ij*z>i ɍ٢>~4>oT Bm#D94+ YW j`3_Q޴5 odž=j\WC϶K6EuTWk AOL}O&q8иi L<ُwp.U9Vr0lE\amJM$_C6[Z!;,(YBIB ndt:GG#7v}:8 s%Dσ|ߤ!k$#qr."[1ĉr6=1iK/vG$5“6r,wRC﫿̀%,z?+D+U8 G#e;WYG!/pG_>@F.opTI QVb wJttVy5b%6+:2K&8QtV[nq8>߄a\5smQ+|rǝ8i9TSp801}S! RRh4 ,׆"3 Y)H1r er)8id벤_^Њ`+*VB|E=Y\^߾.)'XZscQ囄Waʇ!LSmݗJXIWivJRmML7 Ya6a"f} #AߴN[:4Y!! ѽVl+ OH9#!:*\,+0g WäCAJ -&xp]}8 i'#yK O}}9eNp2GlY@7;^x.mp׿~t?:e]6_|կ~un&_NyYC/" F<(ă䑑!@܍ /J҃hQŲ¡u<}'!gC͓J,'p'(dx;QkEg9yF>]:9ᨛ|#?ƀ ɫ4V;!?NFDD;)^\d]yEL6T -8xxo~@F%҇߂mUl`Y15FGo>w[;&qC8OQ,vcU!|9u" ρ`]!$usm'0]^!BQqqvtu`oe|pyyN:t sF9g:Zϊ1NPݝbk7E)+Cg_7qH_jgHWNyU[PVG:RM:xOE*O=r+ t7z61Gۣ]@m^AFIzl:_ECCR2N`DC~kՄ.vFި]M}W'&c5Yz{X vFD3r#?R(=J+2cE;V=I_'PUتִ{r(F}xޛ}@} ķytJ]Pͫdaկ~|K_R{{)Ҽ"[G+jϷw]t;"oW{{WgG<žԧFIwy׾NV&i ܽ,!O0{q!>*=><;zb{NEN"P4^A~ے}z-/+*%U͌ k\L[CvlUo@RZqBa)`ijmW]aX<$'ppD^.Y:bYg<~SQMcVlWNvV2 c1Ct]we]xV_s|q_=e+QyZ.5氆U + jhL֥5DUk.t(r]A'ݛcSE{nB/d?=Pg"稟g n\@4> %Lt,tfwN^Fm5N~S6C`W!jah)Et93I 3_,5a$ijqP(B5E|\׮&c]>-8QKW7y2>0B _Wi694,RqG lZ\WaRF-hw!Y{E-^۝+9xy^I/-?VRA8bzMU zS=}~!?!GNީ2h#Ŝ횝ARjC>٬pIHYMI=h>/v<|QNڨ`樄XtFڑUl6.}@}ŊE{lVs$m؄;loNcQsJ}9%\2R<"ir@BH*B(b McKe^}6ϸEӃ Y`h1-ZgSCc15e(1=-_paM.9# z܁zE  *̽y +˿|zk{ {,M^' =϶wEΈfQjժU)5FgFux5cKhXh>qXܹ;qX?K?, C̎;yq眨Qmb7cos?VT!-j!yv"=sW/3S؄SIa-zW{D3~CC%Ja^4Fo qc\h)+otquaXOJ^hq7Ӯ!ݫpT]y-=lZH/m훘u$; ;d6Q;Gc8!њGYicxX'  hWSb䕣/}K'?;Gyg?s͜tIESOU;k}ĝ|p'n Ι3|r=ShW۷m5;#7=)OWUg<݅Wda]W'P*9PK8#&\]4љN֤lzvmS_mٺŊkѮ5MPjY;<{8N|vU"~EMJaybADknYHG>va|$ktCﴕ=#@u:x[2a~鳄"ұv)bXey#pAע*lҤ#JY.qCy!|]^MR⎄x˝i3&}b |y'&rYɼg,SO6VdSqթy60μ `݌}l[N$o\]voo8l D8Iàon.XdlXgG5"%V.,ŠH%d{Wklvz YG51aMJT'G* ::[񚘙+Z 3iQQ\7kYkX&q p%<7iT(C] yn_X~ZLvj$xߓh0}]>xZA  mBXi,8閫hg[rVoM.OUi|E?{Η%xNz#\⬵ɨ! K^h$cQn kv_#,ł다 ufL׿jeoUo)콶-w}%T1s(;#OD& "B*Z"GŲuͨo[P"vLs?[URʺZoіXyīgT3?췿w{ӛNŋؿgn!թ=qvgפ.~;;c;>j8 dۙ"mkˆl@=d}Ko\W^&IW0qYWvyƗS}2 xM]tw,(g֒$IQ)g=>/خ@>߻> GꌚMfP .xٺ4 ^,1Hj 2IM~36Y6H#/҄Ŝ34u N:÷s7!w5@eNBƯuVܛU4FVe8q68hyQcT=6qu!G:Lƽ~mC/A5p23.?dqx; \oĘ oF9_U=?6` ̬&~6G`AbNvb9^S{~_@BmZ^<pq|O.O'w_eaݡZ8kO<~wM|$H%kCo/{߻lE9'NY8X=]??NiYngb% :/'g/|A]Jݜ5 v9^D5"Ym}Q1W{m;OFEc)Y]}ҲnqߤQU/sܓ>K~WXŠм&V=W~#f6椏Lt2k߮q#w?;0PsMN6~,̐Gmfä}_kO=C'o$3+{kG#U/[pqi+dǗrȃ.C>v69pD[f [q4q+,\-[֬BJC>\)oi;c˚6ZD<D,.ci4Aycg  $y. ! O.r^-3St/O}9 T0ߢ5Pq:O-,ӚwOto~0)Q"6'(qiqa8> |hB2,Wr  G3A9B1r};ӌ=x\+~jsPK79YơgѬi0鎶[o%lu^_EϷlŎQ;t0<ξy΅(j kƥu;S7ƹK9 W-679m_}]`3f۱%=* '(m~;Wpt-|wiZxOk}0}>}tMzp@B(;uWnn6Wٟ|vVW% v5ڲ+mxxV?y0X[.(G1,^ML?aW-.C>98BHrL0r("-SO{r6ykj̗^E g.A >C~,Ԁۯ~+wo +I{ӟn}c.?A;s>{eO=w>GI3t;昣IK/;b6[8OO?mlA_QLnI[Ik"UhRo?jeV\bq-^to1_p 0Xt,cR(ivKLWgy~{OZ t@hA'weHQl3B4ϗ#4I]U<%8"&" Hj ۷ڦ[7Xyb8P]7~q,g,[/5Ū+U,׈jҤ8Z<,ȂC]B06H?NW#t 5Oi Hg#TUVp5~:1LGD+~n? 5,`7Bg( )иͭDL6_'=y:%][p' >~ixƕ&4D X>N~sqYW5 $$0pfSx*(t𞞋B b)9 czyZ"i8O+8{J?8VP +X(D0ba{ZtCB)UU2"Kk\ 5 Oh#^V{Wq<a}T2"csˈeU{͇i[7n?%kؙ ih%eNiJ)u' LP=lq>ogi8mwi xG5nayo}9O0(oDxCO3C61XM̳?.[S\-bW|  ݊ρ ;XXy+^v6nhyk':0X`(!)! Wv>񏻅 .'wXB٠GXG3ߓc x5.԰ -#ԅWO[pg)Cd1LF3<<6v3gʮ.hŝ4]iwY&,7sKY+<7np  \rYjg//?ɘB`nz{mР- %Bu, Աd)L)nB)}2^Nޑ}3Nִ߾ qVGkqޭnyd6'$}7`. 4f%krBvg__4E9ZDuKij+  >Ir i[>wh~"a`#k*v1as*یu0.^u.YlF`8GcAk|rB⾜s刳sj= ػ߭ϱ5" $\ ÅvKk^:8V~ox@!Ч7_} |>G7:d4FaX:/, 9BpUxk+.uxs'_:PpWQ }mxG57OMsq7Ȃ/0A26}ynY];+FpAæ58^ηY!^a67̗ӭ}0LG쑏|e܍%:=9묳/ҠȃdGX!Ӧ4i[i?p3v,4yC95}"BM!7 5,eݧ6{6޲ю:X',饃EMݧ5, ⣰%KJH8B{ᳰ/'/,>*IT/CB!p9.r:DW\VBQp(G~'q/UusQU D.I+!wXF6c!ـ|朅M,JC{>" ~<Gh }M~6BBP #.qhTۙ[Jc62w"Ȼ{"SlP׷Ol_u>?8|Z6h o+qВw']&ilrb[K[ooX¥I r!@e#qo~,[G"&y.nɎtuOAӉvW/|Uﱔ&eOs P8w8=q`68q\HuAF gNW/}nz_prQMt4)k,j JM+9.[q{G>N RP'5/w 䠓Zcכ/ !1I[E1T;Կvnmi' fxmj{ob(O;V0qp?Ds-#ʍSN9o|3xK^K8MYv8-`\rQ/ׄ(G"IjPݓN,\p;+c]_̇(LBN e)1pikAiZz,se1P•$'_woSxN'?uXa{'>j~]j} N qYBVa:v +8k;?SWhL{86;0HqwM`)$^@C}R6' Y昋c+9-&y#0yBn]i=xh>p|N#l+.K?Ckƍ~ > 3!C Q@ݾ<8E1 [6['MN<1}噰: vmMA{rn!MObsPl66w[ $?~g1tDUYbgkͅXA˻Su.x,쵂3 5,瞎Lخz)+ysE+ѩ\nω`'7j%Eq+Хozӛg\X9أh m yK%N/v3P3OԜ~ D,xOʵe;Vkr0vL%B 0,D/8 3, mGx9=C'N:C,psjxP+I4. Y<=v4+U<l'y#" UrkO"8KDH!yV,6,7eg.0,ۉ8cPxE4/ ><nŸtI$lrjmmoC -MJz~.vV8I>Oqn~{Qȃǖ+pp7ڰ/ygfg-ܰ)=x;P1| `c(<:zTEE8X\&r<%)LNVͅV荐8TC]+gSb-ː=c’^dUBU4[%hZyI%MCҿfVqQk@B  9x6{zS\9'44:( !<RsS@.6 69:~›8.bf*^UOʹwp4.Z?WVw{_yI/fIq^`k/Ϛ9g>#4>ե ^@ς K~N‡>{ÜQJPV(Ro#z0ҟ!/J]E>(dI7F剒Q4pDJ 7񸞳YAby 2_А'Í OͯmQc۷ c47hSk{yzF?F^;h ^]v֤_˵]UsƍB.GG5kB.<gϐ=.؏W+Л/4gÒ{"}]vcc96l0?#'lG0OS+&iW9z1wh;GWHpLV rM21/ؤ-^";/J#≊x`Vi&݃ Œ%*=Hu+e 24ZѺ;2LbI{ Z"ʋXhKi,3'Akba.hTC/m8g9)E9l&f}-}zljh)zV/""c þmWW*UssU: ~^8sivVnNꯜ(aVE+[^׹4~ՖeD_QrMP ?~Yɬ^R8ޔ(|T$yWPl|^EHXVܫOxQm ssYu0ѨK8$,3-[ 86qة8ŨpI#/<qےڀG!1\[xe!'983͟8+P/|:Ynfڂ3%G4M;YKxa\pV,;;M޾RJW2fW/.;$e88?A1q88xi~x'$4]U6޼W0 i.'7 5_ M2JFIgw >R\0Tځ@2/wJH`R/x({8eC:N)z,,t:'<\: < BĊ|Ř!ѣ/⨿kyw\k+AD;3LX g"y9)Cd3 v'ϽN/xnDC^_8 @ Ux>78xP8 3DQGmERtxFW$DYIQly5(Ӷz#_&y6 Dr&1nz/OÑ8;p?eRnPepEILp/nm3BۤT|Oyފ)Q&7dN0(l5/dsbDRw\hG0k+ ˯}M@'jh`ӓI? \\v嗻VaCihV8E-#ÑiCO.?;u,pA"RW\ag-oy3@9͝0,NЃm9x?Q)X? .Kڋ/H| H#O I[v)fЁAQō7D+[FF-8_iyBfvxw!V\[xA׌Iə_]G[n t[lhWu£\l ;$ /eN‡Iʃ~/|ָN7 bdg,0vBr,3|~뾞rW4pnT8)Gw7M?Tgg5`hx -ه? 7?eeẀ%ӣegۨn#tuыEX.GW~fr4y;Pցj@g12%?&a&wœ8<l(촆I!j" -x&-(I2yJrf6j<4r͍;[yO#ݹ $~-}{hw7z:H∓Gمs c8y(ہq/[~|.u-\//rx~}B ȖWMQ|*Y wfh?aBW'4m\\eT[Yd1 T&km,%*I_k")7 Ng?%䦨^<(ǍsSl#>}&.iֵ̋hstQw-4,B&NcVPwffQy>-BL?دHP1=8RR`xBcq NNBH`'N]xN oC}o7䥞t(C>'vψ{ bVUJu&c#|QT,X{.$i44٩t‰0:t4we%q'E|.5'!V7 ]ڰ#=Sx3yF]QƵUix3g8z`DGG,U `WN\k%O y)+׊}8߿]<~6? Lg*|h'''y»c&jR<䣌NH21F d!8!IXp7x|+wٹDwq5޴?G'48#X R+)`v1OL4`UƵZ:f᪝u9 6euKrHǭDYdQAH}Z-` <).,!qN+<}EdZۜ2&8.za#n&Лn"QM<\~nůHcAexW<}=ę4j%+Gz^~<8 ѝ"):epx5q5*k<~X޾xRJ$+_[F?E9qo}\U󧰈0<-L57psxҏЍ_K~ҸdQωʨ~Nc4!09j*l]vؙk~mP CK{rna^>餓SOuX?-7 y+_1vY+ GҸ YwwN֠YЇ;jxv;j$qY ty8`;B1Ǟlmqs$+*BrQ<^ڡgx / ,{l-餵/x7[s&\`xyGx.62Vr`!(]M46 YPsE=*.LJwaHwGB_/Z' 'qt_gg"jB^LJGcqSC{gc|2|.,9Q-4_on 9y9 2;vvȇ qi-i /GJ`\_ <3o\VkwuP4;/&k3/E$Ԝ|`6=nw ;xpBns4~x'\Q/40%vOӒ6h7.E筓!ʢy}.; v6)_c}+l cIaN m[<DMBMʗUΎ ;.@&U'jHq$JZA2lWM&%5[L nu=w1L4D?.6Kp\s)T+Dx qfi?AsJ#ENօ3x': ȂMפcKr[x!q?G}i3)WμC~&~n~ N9@x8\\ﲟ<=͍:M9~cSvS/xG? ۝лg6~»s3y\?{NHϘ>1c#ng̻Ƃߜ;Kxq>O/~po8u/L vq6'ݰe :*Kǔ/esV :ꤾ{r)V8='=ɥb &`.]q<{_6K+?\9a/EIMo8ln^m7SQ=ϕ&khNEk=x-,z5m' 5wܼN8Tk0O ľ7)y7pF=x~,'|KGT/ QGD)-HF,;9tH:%ysjU$Kj蘐 kk\hm|?=} mgBaxZx3 ~{C<'иC ;&|easp6JMĒQ0op7=:=ɷR( x.I'9zHopD +y)OHYlLNYtlb[eHf;jR,аCq8'ZB4&(Y,1x{RBܜ͕r`ZDιeJ;+8~ϲZƤ5t}~cQMdir\$oI1 NדgjT~,DLhY!WdrA0UpͿG>⤓tΕ Rp9/r{Tq Œ4޽V0iѧ(\hxQҜ&Тʄ<q8"Q7ɓF{PYUgN>~{ܨ`\)Ss5izM%NW=$ͨOSetųχpF0 )OgzŵS._(IW!/~9! W2P*|*j{ZRz^p%48 fBI8E g vf&ǻmo.߼ϨMS t!vUͦ Y?pqR#?mn$I}/Zu 'Q'OMPљ)(c#mSEYpg4Ȱ/)OV9S+Y^㉯*P}ri}qF_"}TtaYYFe<_OkkުM^%$Q[8 AŽ96g qu_8^bg, إT!z>+f ug{(^xNP? /Y͡\i#S)(5Nr*( ;r8 xO0Y8=Q1sv6O8DS3NhH;/.G3TGqal<;НLN( An' sF%dƢ3{ /JFjn;Gvے%˚\pAcU3c?oV`\dRw҃aE)/e3.} HIs̼羈8'wEYxfD@1ʹq'=$܀MlL18q#]} p-xF;Kla5l%h</xX(3+]N/;^;>c_S9h,D{z9xmT0w-NE^t.S1xd4iX@s `t:h0݉g>N_SG7N6lpe_Ա.n p?0W(Ϣ=4>"~J9=R&g{[@./$윥B8 ܦ* ymȦ9S50e5P9E%I6-lVa5WHr2zM 'sokPyTwF>.%0 '`>Eld“x=Nֶ,/ۥ/Olqͷck~3Ӣ9BQ᫱yuY<0 Cߡ@.9.4eh iM&QO: [\zMN41R`C;GFi;y$"dOē6>1vtp:]iS6%ŭ+.#nhxk&MON7^0+-w>*W Ϸ wlýF&Sgl|WZn -^|2]{n\za o%>"[CGypeawy_>ʅ+cX@9N{R3<Ngyġ=Bohe[F0Nhwv19M x"4,~?Nj.@^@eW^n?b:<ة<57,p"ˀ ''_|—D =՞JZ$rn6pNMh# 37obq d$#GnAW7+]‰)h/@gA8vo]3xBnڿvj7 ;vl+Yg_ͩ4*^U/{D 5ȓ F:xZڥwJ4힔Y/S_ ]~7A xyD;e:2 ZgгSmEh¤O't;ݩc YeMMOࢯ $ <'!?&rv@BK`ӏ!z~㮼/XÜ,ቚN]*iQfUptAS p5r8x{F:KyVG;їsb樣p¢ +\N̗5 8D{yK21D;}X>8#qi߀ɝ|h>9:f?N'ܹ۝ދ|_z;{|<߀?E9><opdq  [`6y! Æ  :@m,p[<ΑN ŲYwپq]AYNkEm7n\ kߪ`_^V@Sd$>) / LUfE6ɘA31GmɉV~ܩ7&ٶSv }o*쌺;ݼe`[Q?v; }O3r~D}զ~YP?X)O#p_p _G&|"?n1F6DzWQuV1m8x@mF0^Js[!#愱AJYJ#hX`S{˺0p00 f}}2<% ' 4Y3i8Eb.NCú!&WG:H'A +۵KDzsA<5qV\_)==]#atlR$昏AF]3N ףI)mlh=.p!<0U>5-Jzu`Ipa@g!)ZWWt.uB?n|rn߹݅Y&}M\7۶:Wpk׬tKUt#V&Ƅ8 >s`6c_dG ǝ)[4B̔+7 mw }Ū*Nvf ^&_ G_Q iL=Oi@ܳwцv;5>.m,'&~~+B޺:'#OAQ4kKyK^ ^);g{"vqTggof&uA@~ŲX>MPXxQ;Ӂc߄LҚ&$HQjb@$dI]O&3Ncc;(p}rӿڏqlr ͯw$x(y?V6'B p2v16 "'GK}'9CNŮx-J۞고 ERL_y|'ڳlA/ cLx mG ԅ3c~x@v d!|3p%r|}O<~_;q,яN^bAno}=d vǟ*Git*8_\j/z ݩOmk3;\d pi:Њ{rb.dE pgn>uk* wιX^tKuwtڴtEG>QKqԘ/Wx2);Y.,8}-wq4[ Ch:"2m }b ;w6M==MN݌=&'ysC+ČxFMT 0w?x+|F vٲ%/lh{7%O";Rv|lDDCvIwf7}C}n7Zf!6p< [/c] ,ÎqGHE8o&2aA/ ,D/iDʐ11)GQl~7]0m}Oҟ[M?/m8^"ܙ0e1pBSGPn͝xO?'`[4( );iʲҍ,ނ`x:DC^W۹'8ぅbߌq)4h;ÒwW,wwݹ _6V{/'k$j}ݪO]uCL9hXh7| AlIL}[[e7AX:+ƔׁAF0i7#x.Y1xM,r"sgCna{KsR9I{<6@k5Dl6xxraצr66>~O ɝ;vk8%> K݅[ovp%hn$[CvnW[`c4 ۶pz2ٮ9oo~8zJ+ʶ{N}l-C)Cx7>M96P980:ԯ+/]MRp6st4&ܽ.}9ͻ{]b_ј%#V*VS6kG2mقlaٛ|vxPKBmLem![}Ʀf[BUpכOpTgJAIU*S_uǥmFvӄ܀pE}J$m]t{ff-9:_ xWK]|dbʥn| d Ǒ?,p'ڝ΁_ы|aɡnw|`OMH3 !wz#w[2@alMIE%k3ƽ C}Ȩ Al9nC J BDg;cBnd2[jUMZRUb ũf' -NUPImrˈ0!MR2-^,..*jp$51ye*!avA5;4`KX%X2d}ū*_) IQV_p3> Z͛6ٌrQ&e4)ֈh^l"0͈ci88)[.qo)7 絥^nEAwmi N~XW~?V ꊩ);u=j"zI i]jwX! l"ɖ|?W#Vb}b`KuGi# љVΥ+}Đ KHџ5Mge\ nl-NYϢ!;]%>gˉcGO5 eöC];i?Sn><µcB5`QC}>?;V>ӿxïz;6UG |:׆Vrk^{9vCsvr.[!eSL,îH;8g%{!6eE('ܩlVT8nRG?ʦF'5QXl , )eGxNgF ffrsn6)P5gX՘^g{qO(Շ*ɀjiGc&}cepk٨sq)>ݫ-Ju ٪CXb, N۸ K!._dUMowVHnrxbQo/W -4JFMVC 0ɏA,ޠG)(?<(6&FHC)|QN9)fi(: ҁ ,t w [=F$<8{0,9h 49#BƳ>۽.ga5" ÙWP|# q4z͢x*]pN\v-v59D /M)$`L#<>Oq S Mo|}E{5˥X؍wPZb$BV3[\ |^pd|j|tu&Ot&mÜޱ{|J}Ә. pk1U/qc\݌X:ak_,"H/M|nيyI5elxG-YՔA RG_K; nih 0s͎;늶qE)cNKUorJp]7Һ2Fe]}vĺ692dhW{sȮ=.mͲU֓b&od[gje%CKsk%2{eh"ӛ3N>##8'uZj˳d`U~&ks,ƃQ]dcuĊlR˘ρA^"\7hkzS/Ëx:&\yf$7i7l˦;] 6Ѯ*]ʀ_Q2{@EvԡGcxI`zvۜ4DyҒe+X -vhPpvK[Es>Nc6vUm5qmV 7d%kڡ'm@ŶMup{˖jw7پHvݝ^YgvL֬{٠  \JRzr^FцIFtj6Vح;YّadgX4Ɋ%-&\K, ^J^}vLb}+VQ>T57AX|$;qN M#3hukEE_LZ>br)%dmXUs!ɨۓ)j(}]ٝ6 #Yۧ|!xS%YB9STOHV_᷍6Hrb0۰kF;‡pEFl!WHdRAx"_aSqDl7Xp"<΂<|}SY~^9.8#KNaoYA~`|M]Y! δM6Ξ֠;30i'A::aA\7t{bxRq5MTD,6iI$mc=432^dI!!  HGAP"" ՀJ$ dK3~3wɰ;!񯂾w}rsnU0[zi<-Z/&%yh)15 w8`{t8>qQ%DB~ޭA 8q\ ʤS#n޽kY[G-Z?:uk#c{nbe>$-u8j7$SU/^sNGS物苳OՈ`Q;sXJdh '4௟E{W)_e}?*k4R)UR۫Ra֬).%Hl>u%U1:ϼonE1x8H>LֶoI*법+l/#4Xc"a]֒nqFm+h" Fy 8J2p޻{MNGRו$V|%]{=^ǟN{Urmwowo3d I!WCK;J(iPB ΊDNJw)֞QKpn{ϡRv-YN<-[Fkԇ.RgNp\8IR NQh?ķ0‡zן%uG!@PI`# =CZd‘PW 1ܓ$],CAͧps|g]콿>h:q}{u]gi{pq=[~ͮdkh/| }'e}k_.m΅l1?rGs8!sbG?ymlkgkJ惒uM§'Es3nvOJx}RPRWo+ )fEp HsP}p;ŏ+{|G,Lҙ:J]J&۷ggO{͓# 8EAws-N1161;1h$%pm)qQlٺE2;m+goO!)PiZ|b8wsɟSߎ2JY?6;Eɗ\!g=]=8h_[8zh".:=p I?|4M*{Gl8 5;[E^IW_t!_vR' X~qFɄ҅'J(ǍZm RvwGt/@'ŋt N;L&_ZBN9>Nʏ.GR р_AǤ˩>kWq8'cB:4@LH{qtRcj"7̃fYYBR\AwU:>|S3[tK4 -/} ̀ :ǰ=_mn%vSwwں5~CG  \ܷ~ p,董90焿Cvެ3N{Rz&OlW7ϕ* u]PD3C{%|1nein }K8m  y|'O5FHo\,y7/<=;.O&9`"߽4,:>)Be k3mlwEޭ8ίyTa,2_t]6%X[Ĥvr5=x91< n#./OjVK,?qOVYS]9FU[>c \}YPt>W; JGmnu) ?.yu7O{m8q<'Y*?xX N֮?_8ٖ{lprɴ3MJu~ɮT*+q-~|hs5`umt]YxE{gt]VRG-X$+y!>$d@S}Lzg잞~ ixarp^oS_nɝx;2/]w:./|Y/iM_;wJBF??qDhzW@gh2үyq=>Bt tt2,ME/Ylנ#C /7Їuʆ73C2{4Q! 7wCIW֭[/ *vIxo=r䘄=&ϊjM6;%V.^j˪)r53tA)&_p;g {vmf'LM^_E1Vh~wL|q,oxS֬Xm]ըN[deci۷CC- 3jgז*"I[`394n1un;o e2BŚ۾>y :|'Dsܖ .ȱG|*6^',sV{ʓyEKTcCa+_sD?e:ɒypRaFIu:``%/am(AZ. wy ^~kWt૒+`-<瀗 .HHO-S2 eK*"|vA8kFب<= cEWm|y x6{ݾ/;c5ĻX nˏAӽ>b1jC}6Ɍ-f8Oi|7ډ>@t~;y6O=vX|ZJN+wmVC"woxIY>zOϮ^Zi)t'-Tl6o|/ngVϹ|ߵgj)[DVlb㥸EeZer8|=6u@i&NGǠ 苾T},]|Coe%.uEz slVA_鄎3!;㖲ڒ-N锐 ~#g[K!`}R\JU۸u>-BX}9vxdNx-Ia#|P <5V" @|C#P(A! KADϕ8 8(uOP6vgBXOyp)3`Cz,":?y/}K~1-P@>"X8 J(oL s>e eC{0 A2d5qqqOI12 ĽqVjvq'W:i[7orwZiN`΍,-g]cd} /pشQ)j]t޹y(DY_bwC[:m>ӏ/\l2cK,qYe&<_ād <.=b`ԁ|s|dj;5R zxA mS$_W_x\3:Ϧb) 9a Y=zϺ(ΞC8]nv _TҎicn/\=Q\i+^ZJY$X@~-Ё6CsHu|BC~|g*%Nۯx?e[61i;~J]vO,Yj{?׬X߻ϢOcwK֩wlns#GmD  /K?T۾>HgIf[+ V;|qJF[Ž>le1Yv#ݮf]v~?"8/X^&"q; ~ҽp aQ^,|l|>8'vn( 'zSROgK o+T>'pUECvL e.-6yMcv@UZ>[]i! 4pBLhL۶qU=˖oĻFضZE^'bPzli.1n#އ^Ft[苾F}Esa"]8l/HB\aaä9fbCcvX p?(Et;\P_jLfoD:1gaªɽm 1v|T %c&ubuTg#] (̔3;(B[^P笖0S307`-Z8 4KY;khp-;"6lmֱ:ȇ4W* }%/@'ƫvFǎ:zL0pYwkms>y/f)3os_W3zb1|@%;ٚ;6ceI-\܎Haڽ+L:zeW:X?S" l&IE#-jM~j_@q$h=~9%W^}D%|.JN+/5ι|WHO?= ō'9pTQ] Q t֖}Y5>~oȶz>_8e A `akTI$ȋ4W_GU.wWRyYsAUc&}om s^,pBj(vaA`j.Ä‚wVD`GQD0J)Jᔋ0A0F~#Ƥ(J`%.uy`#%_+e!hC^\;WWk3;jx#K<-΋\V uW'.r/ pĀSҰzF|r$Gԁ#~ `e] ԕ|qO2pc2WT xU;)9'Y5" /ZJ1-dUGr~$dC? ^X# |zzn%7adsNHe}ў(W"CoUm!A Q3`w,H٣oJ)Xxi(KK?&C/KwKv?x#ݑtj"YfR>A!ql۳SDo.ؼI3آl sż-\47JϦvL5JxҎ}qQtjbG{m~(+ހW.4GOzn qt4MkЀGUЯml3nٸek KWZQqu{;&YѪA4p3]!/mޱ;Oܲ%q)I{ htݷulX/!rZOH611AGFY|]mE=/;XT{|baU8"iM;rq΁h*eZN;I_0q`ſĪwbRU1t9:6kvs~qT;uط&D?Jn- y^{7?i|wZ C'&/mr8= ag;w+L3߾kM{zA7ۺz 5(}Y{/::,MWmᲥNKSB3xPWsU X:z{ItcwB߭?ڲ<ΝkjvX'^,Fq|`&nd2yF6Z .qIn6&ݑELx?#Bz;2bʂ"HG4O&Ļx޺ۺ<ͱG&OX OGŶ>IDmgC '/Pn&;˩%Γ̧^){]bOqCꄉz:5=$|º>}D BE!yqݒDŽ-^~<.cta$s4&=A%Sg4Q$+󭧻vd *vuyOǔGkKRَ'~Բߓ'ېU6^;OhZ|gm.>lRcErhи,I~OJ8jYϧE>i/s&5!蚱 ;I diZv@hqHGEBaR0~|O}8,ѷG_!>B\Mҡsv7zMxNFtF`$ԫIW蜸L+ K`;1O+lkҠ~%pt=~LL/l@0C$. B&`>C0EYEIy0 @ i@2 =/ CX`,kqɓXo 8 f6zSLCa`A: =`xO=u'=a I90_IUc+d8/āh(6)[C[L#,Ґgh+i/F0§L x|Ӟ>ih|' >j?;H:WØ7`'l)SP׀ڐ=B:Q.\CG>I<ģM5 q0̔6' [b鼴BLkf!:v6M'/`^L'.Rym](٣1aK*^S<<)(G&y&.(8iR fN;P|=F5BK9/aړɗph|>ai[G8鱄g yP~pehTqfK/dՂ^3y7*BDž5DLp)x2a&a>OڟO9˿Kso_2n<>O}wMo<^{]9JC/| ox SA<.U|x]ñqQאָߟ8ӛdS4Cpt-߶zy!M#/ ĉoоz.A kxiO耺)pLF@?v'_ʧ7ߠpEq8LLԢЇ-F> <)7}xx k1.PF  gXe'Q"mCt\ ^I "/gc) ;=a NyR?p ,$d?mI=xlDX#пtS6q#m\?  @|eSvWԝ4!x(0:/x+a/ / ~\ ȗ ,7XnA$2(m|ڇGS6c>uHC|hM8Q4Ax4!e'q mHӾveMq!?t-紉&3?%>|>|W\? ~xԏ|Ȟ;_;8⑌7~}l\vq ]Pe}N!_7/ԙɘTErf Ǘu_W6W ;rXeYia{}(Xvat;wv?ptUa,W\B͂QጅW!.~ˑ6;b-||zO(o}LW |\ K .` )K'D]m-6UN+WX$]dh -EJK%8]Ӹ@t鑘% _Xb@&Ss]V.-  ޥ0PZ;~R|zվUupoJ>tUU&,nQIPz^RNߐg[0Ï. `zOqbsLy34L^ ă@*O:%=tCMX(|_74eC~#ț||u6GC{6vS~PP'Ąx6'i)3@ф򔀉6WKSUx.cu:s 1@k$BuWl!R7폟oN\V -|'4HZ%EB|Qwy`r`{׻ޥ}؟ySI)GlmvH'#~] 'G[Cm}hc⒆o@  ɇv~c/K|Sq0# qc0߼O@ԁ4#qHLԙCZS/ȅRP?ȬN !+oIAI|'a<C| ħ<=s!?mȓt0k?&O<o^`Ǹ8 B{S: 00C:`OK | 4I^C <ă'0lh[+N;Pg`D| ?8K C €C 8 }r e%\dlLN^NE3;8RUńn/d@yd}/9)|}."~# r}=WxU3<\Ȕ #B]% t<~ɇ2+oaSߘbR[nwRͥޖʓvD,iD8P.*~6F5 B)KY3i|'F_N@_NN8{zpodt卵̱8[vIᑲ\)ϴHx,[c&(2 +Pysz,cxxJ5LY&^~.tcڕ;FzW騣z+&Oz{/kgMcU-h6`i37EtˆZMiKiw  |1ƒ)I^Uub/rI ,w?yџGF.9"M*3Ut"RxYhD*^'B.3\&'EI1(ݤ`['XLP!\70A`fɃt *?G}MٸCYg7gG]ce(/C>G4p`:N!l3|Q)쁈 N7i\`p8ol~:l OFLظh)Cf6<|ю/cMNO6~"'l. CS4 J,q 7!3 溠f1w'|Gc|Cg .~^.0S ^HA R,C8ԙ|!҇ >ːGȟ|IAg;_о#ƶ"-T>:õ/@Zڊp Ґ'aw;|'CCO|vx5`E5Ж.]鋫MW$C&>E[,#ImkWׁnEvq2.<1 }vuM7Ї~e'#l_n/~'ыO}O|)`g8_x{d)τ?wy= ɋz}&+ع. c L]-|;\.*|;#CAoLOY)+$~3L1p6b# pN N65?-iN!Ox對?m -]0,|o!_6+%>Kѕѧ?fMdV XYq1ӹ6'UE4 K0lߞI s#lpJ(T,@80FD'<*F?Ѥ &@86|'o|7HŀLx#opG8 ظҁ7:R<'>kv> a ӓ2A˙OLp< B^Ff_]`Pq00tGy&gՅSț0Ì5aK:l\O|udmjH D,@P+Xq^t%}&]TZU!7G( e( }l\3" 4/A9&o ӈ? ~,yF0n|wL٤jQ]S*\s1lUL-[i-7*;9da$[sp/}ɕ:vu˅x:J;:% ~zHWO:Ȥ (ذ 8E&Lw87~S>07N@O|8Q癨A: J'!/ Cٸ's&cgf6BL\c}ͅ3ĝ\" U>=_|OY|mL[ 8HD\ސ/6!\,qB>`$ aG0z K<6wL|^r 50`C'RS}h0{y3p{!qگ}v2ݖL}L:|%Cv]~{?j7 LAb2}aG+Gz <dGg|2 lȃLou\5.Y<܅aBO[ Nԗ=/ƕG:Qv=Lө- ڷ4! |4A LH(LMoc[b 7 |o!)Q᱙ j6kRc''T$C"+*~~"8' +,n ܈.7F2svwqtɄSk+ gAg0,3;}1Ci[Iz64Nڀ[^;z'퇞NJM|6n# :+R ΢ʴpO+<.Q`I1ؑÖ+ + } et nP@au BO$C=E D9?|!W% xp)k6|CYlAif.WP`TAbHC٘er)#xgPn0'ģ|,emꃣ:5W4㧃4H[:F>gj_! Kؙ-! ͆/p!N=]=ML#y|yȯ0%'m{ũ|"Ʉߥ `)?w+X21W%:1 e5gט ,DđS Sf7"/۰9.\)իs|~r;^ K*w6ƅa51 8n1qvƄ{X8Cof9DL0V_$ qxo֕IҠR=^}?\8':`HDMhk8l h G4%v zO `1b,sf{tJpFNMp)5 w;qpkP&{`6;MgʦPs:x>_iB .~) y48il`\a悏8 wVٱ4[ё?M|ŋAe vZE~cCq1sy4icwh+PVpz >wo!_l̛p=?y4Gy'niC2јw#X҇!Ncc_8 2l&{ﹾ o`!>0&6!_CɃ8mcc!8'o bHF&;]V:a.f2cg\R|2OVr:Dg-;o`މa;Mab'n~|b3,_=Yəx>&T37O\+U92v|ӟ>1>9?2ۿۮ۳0 r{рoo7G__bO}3^,Ƨ):_6Ӹ&jQ#,bစ;&k؁3Z΢t$Ж0?{FFs# |&Ya/:MrBeGN>`y<}31؞D!vp wpyRh^Y X~P 'eG@K>4aKK#Ƽ0lC'|_ ?><3` TlYfW/A[gx:N$tmS+x r/NL#]p'~`wg^SZv#Pq(}<7g>c;vNb,pӤ 2K؊CG[brlWaeMKI˝j"v!Msm?Bp\@S$A7ʻpQs(?'ZBJSa*$ VӠLD[&tPÛx(ڄsC O? | S.?WT֔'ς?<>ȗ3JA0@u .v4pkip1qCqC8 1_7'SlxNSUզOT 9ES~7g8U!~=v<;xK'xL3x|6lp^ǥ^SkuI`]vWIǷ)*]Sq[3ܤxFAG\;PR+S/9&+]}*xOy(pg;O:H2 x)iU1RDMDn<ӎrӬ&i@7ΫA} 6o:;\E'j4?AH0$ "Q2QTm y!PA?FVYcYCFpeo+zɤwpy.0_z>Ƀ ;p:e_M=&ΎF4'9S=:n~Vl5; ~Wq7e,© s#;CZ4/|Cq83nͱ'vaDEOMdeϫa*u;wu>[On]wghb  tN8~џL7l7ߘ8?|s1\!'k!L]tv`A۶OM</PE˴/7s ~pЏ^b\ /ߤS^.1}~_H#~/Oyďa\T}\ey*|)x룗{{*ά^_w«҃. ) k_C ?N?|a\~S~( t/It5S.Ro 9?v?7.p>*+>Z/Uo q'5QJvTE+jڅd&y!A[7u~c``6g'z&bt9qbO,%/X_xkX@#A^=iOW_mo{|Ș29lf΋^"(>Tg&#| LԄO\O={ |/^q\N>"3S#M@2}wZYy0 -95oOxT0w\UAz0pID@(!ZMw|(\F+m{~.'S>]^¤ET L֚Z6D[;,WTxaªSio̊&Z]֜M.ƫg_2H]A 7 = ; ' p .F˸pv~'./g+>\bac*„K*aŪ+:.,F-.8^6D t sJ #^wKMX`oLp$^I29JZ]п>QQ XV(%# 7\` (UUDM(kJ?֞[<`{Z[-G' *"@,-͊3jΔ!]5qR]F PF?!A.rC8~ɗ'8ZİϔoDp9KC~uUcgw*#t|_Wxʛ߈?@y 1~=)b 'C:ZLhz8G I8=]^FO[6}xxh\,~mQ u:Kʎ?#<+p|| >vS|V/^rw~_hځЮuPN xuD̲e*uVMޭZBaqN(mBRڜ.3]π?fŸҔ#^[^ gNgrCU<'+V}Oʧ\x6+-P^c:wo5S']1`h)-<c{4a-DQSPh;d1gyY.[#(Иp([QPXx>J+nL޽WPa߷-Ow%l@Ȅ Cx.؆Ls4Lz0ϓ\ BX>AQgdpayp%Nu#$c3IG]&'39U66^?F>ԏ2#7O-Y^\(q1 WQU=1Yă"w(ȪsdYSWhja{:?Cyom9}ϢG:@u >۟x]ʡ&oG7@tnB3 >x]?p[h^n5 ?vԲIKXF|"|I.$mQMSW3ŤDWҞOƥF7qC8m@#W[(3vWTklr?oBTOKFG(G%#')KOÑ\! = ~t+?/'?v*ߟuyH=gE-ǷY {K˝{DӘC˫YLz3 BLA~\\xRB;EfJ9fʪKy^^h x ݝOcg?w\tvF4p ;fQw8gMIVij_bu9zdsT|Mo~~K_r5'xՋ^۹k]tEv*;30epb~;q wp)>ySx9$:oku !&X|A&rQGaT 5qq0; K2Z(Zƍ)HjMmV5o,aj)H|'<ҤZ?a8?q%(~QV,MdI#zHQZrqZ2\~\}HCƷʟt'~=\TMO1RJS_*Ky< #7<-_/pP׊yN^Q2\2,&'zKK&nEM)}*<K8, |#5`C%xw>t=~c'io'qiGer8,<ŃZ&|cRR5(0\7_߰NZΘjkD& [JiZXXn7g"ƴjʌTkP g2Sa~S$|\S^ fy63;lpԉ͂g3FÆOR\ mA>\s8fCzlwv3w.wϪ|KXȓ=o4pcc4FBQcȻzQ& a Og9YVV^؁}άp3H%}lEB[<&lg3K@wYCCiCFCzl]04,+z+Z(xDF+SMBhonҮ| fz8K='>dG 6=!0{|5yͩ "GXcUQ8.ښ1(hQ(L1ĶiAkVȋcNL0np|VaUϷMaHCXGOr"u mil_Vnݤ<1u?ByONeyNu|bW5+Bf',GV(J03q|A|{&:+1U)5C1-.%8J4EU߰Q nlѭۭWbvdlț iB=lLuk4npxg8FÙa qyF,ux{>)ƶyAV)X+|SYS0u46p\~9_OmK_"-y5#6V͎AE#<\gK79K{s4RT38K~e(9GՒp t[~\K޶g\ q//i3}?|R.(T#AZq,;l֭g>6lI#//}_DݗlM~T鳟sL2Ǽ.L%O`׾>vϲÆE_rrd" =ر ѶXpGbQ; cŽr&;oϰêtXTK:j; 9" : x%h?X%iLv7 &GZB!OltHwh[U @M%vxxNK6d''lêUR;)%l*7nnIW$gvg' ;QXBj[رv1;9? ȏ|gϽ|W{8!#y ? kF n;>~_gcd.;pyȃ%Mu6w1!8<-Stu@St~P+f?~cSn۾i#9(h^J&0^ps[ǭz$[V2Z *~:mLlVw{_F @'J># 4 T, 0 a୾g৳oB|L!6cŏ .ӘocޤybpiD5s4:5\Bŏ`B`B?LHۘ.a3UƄ xn(?3|u&G}0@?&!qCF}+NVb yQ.T"l6苡^~1ܡҕBYHJG%8|5IEglEfp$^jLޘ:`s6␮1uão-=g#0[HisӿUNMiNI1 /噬i=dHrR,bkeϳ@Lh*'&I'$D V2C0|םPʘ` &Sġ=ab$ 1j&g8fp}3J"~_HOJ(ۮ!+x+;CÝ˄vLmKx] cyuEuu϶xM@ޔAFn!3!M(L ?01p, m8[O7'f&jFPDMUyԒS|6q HطHn᭶cݖhРNIY=R~\4F=;1L(3;M?i,3Fq0,]&syws=9˷m~AbH2CFXJy_P&ȋh|ѐ\U7ŷp4op̙҅o+1]0g w{ [AWTp&ןބ<7VLaBw9w^)!?')ן:cŠwc0!,7&G~ h?O8xPv%Uex%(2_$[!G^c~"S>x:S/Dwax Y,i$,RȇIHg-fps&%$r+b A&yOox=?:7󲗽xҟ]}{|RWҹ#L찃Y5 gdrXDA&q0 0|C.1sWq7>yC ԋcD?KR9Ŋuh>~r2\y6?`32cK)3=?& yaf$mAXOxh/ ޘ/fvX/𛸘FگMrkrѪ=6m4NT*ac~je+m-?RRҩ5菉f7{:,'a"$||S`9=1"™ !ߐ|?o!U.5=2c&yhЖBXh?÷=4@?:q'L<zJwyWO#ÖT?:x\8a77_S~)H3l 沟i v1wir'hߒ"XkvXwg OWP8AcfiM"C p x<#3q041$("< yz LPp)N, DcS+"FG$@;ƉNq# Ї|Y- x9*3l `΅ 3# zj P=B߈! !eFǛ,%`k:zL݌SbGiQC>`Y4YQoM[75N\ȓ:CqOj*;] ;Džy%kSI *f~O^R]<ݴmRTt#mkc'G}U@ZJ^٦ﳭwk|:շ/X_2YʕXDR9 fJ>O<;a~u(4|# ?ߍtn|~;䃙M+m4MG )m;ܻOdW%V ZDMpPJۤåԑ .ɳus(|ggx{j[9{S\vq*Q<oV g3bQ*$ag4I=F?>wOs0G}[ aa)3dPLȟ'|WK}A C0.S5R41ǤႽN V\4Ь--?~zDɢmOlj-o|R[48:SYȚg!bCofB5Ä< g0]t9>a4o`ibZRGN}_螕;nkm6<6Y)$R(*;jM1eOJǬgsb=ȩ&gP(ȌcrYM;hyK ,IK!WdS{"M_6 [lR\.q\$4~,8 x3;0r :CAgp&Ql…yr(Zt)=u , a|BHE8>5Os|7uiOIv[imyߪQ ND)3.o0/)Z5i_ɀ%5<1ѡXxԟg7aQ:8+yajt6y /ʲv6~"]UwybځX ~わG(2xb0?LN&ޘH7RN~ yCGJRǧ^~HyE}ʧ P6><#|G!.)*[usȐ$"(X>43ECh3~;c. oh]nΈ qyISvO۪_HHݠ&%tJCg)P3}4誯Vc~i҄eqkS6;M¾I3<ٕW_c/۽eujlbS"F3h2 !_;(AjDxsB c7TVIR \(\u~ˆ%!ҩ, 03Q<\՘ɏ QF+ Q rg:~X 0xJ=D:%psl9c*li.Tc)ۓ, M)KV_&-r&QZXȳv4?[xPfJب.O2t墡7ESt >$ }X&1Vi~~¸t|&IӰra\<ǡev&ʓz0 +) =vf$\]~ Qo:XwםH(/UXkVY}rD{9ko`Ѵ #NF5me=zI! ;jӘ_Ad r_rn'X2ȤIto&ӊ-ߐ'o}Z Gi{>זݲ:u\O4s?FӌuE?\pL:Ǫ_g-M|.|V֓t,eU/@:1{ӯ#G4dXb+j] ŐcO,%Pฬ*LGq]j?f1ZN8 5b`.LtN$ 3p\]'GB0NBB[GeHQ|*|fu@q)_ܠ!|K8>Bf!LQķ)@|I[ɼc(}%̩z>ĘΕ !>_7EcSat /!?܇/g[œ<) %2;[!%l;jKAU)&;ҡABP޲0`wITE1vEuJ((抴|LҴSRJKV-HԿ\/B$Q5I}HJ1%FbWOz5śmgM-q1i) )G&!L%KDl` =C7B LM>8O0IB4wFQ榭,xU65Dk6?2ь}_U{2S ֤]gځ{mTWV9zmxe\)ūHEz4~\3s^ֹ|aҾAk}[u _&7V.0Q | Ə6 m:M̈́F i 4!l ÿ́q\ܩ&^8D xE~'!< ΈgYMdeª%2V˾j?b}c}b;oˤ 6r8@=1O|c~ +0о}o}* 2UNTbfu\l};߲}v%yGVwݪwz;E/;j',#OnŎi&W %j<#:gŗH)F#|6 ͒y#Ŝ8oT|:..\+qhb4 UpJ_}3!Yd}B6%8O+4gmd#vAY{ax = ly?o{ry6bЮYJSL TH^Jd#2ZRބ,T=wun/wi ]v(ⱳ[ZxhoQY7;? b#.k6'D7X/[;jhÃg!W N1`Hx//ң cJ/:BFX™L+BL9oW1@Mnq^GYqwDP<܉83xydghW՘TTZF^Y-lg8_2;ڥϻޏ_0Q&:I>aN~w_Uqzp]Lp/OB!.&jsxj]W\a]KWy;55W+YƕR۶YGDMg1y&'YL=j_f;:oߧtʟf\tvDFӷi]114ɥrǡd"ƕGaIzT/=DMnbxAg_q8 }}B&V}G#b3>9ceUF0\(zz{  U[D8U*V;p\Q?w=]()*JIY44RLH\Ep+*'Ĵxq%z)%Uva$:GXD$dUBE0JȱMOfD҃?MګM!F!]mAmrd ܝ}~g3)-?˫B5^6տC]CϪxtp+|j'0Nj@Vq]B¹Un^ɜN1,ageV=e--#dJSbPSXTik|ΦEQ l⛔Jc 7!zJ.,M"C/ݔ`Ġ&qJʾ/p"&{b|Ҧ:lyKl=w[i.k-WCAVYd&P/Z$^yI>eV;XMt(f+N n\)߸[{YM &EkYp56鯏EiJe5_-ʋבxli}C Dl&$Uw&YI^pJE &]` ;kǓĘf h\ Gl[EG⵫mRv ˩ {]cN);.*-r]e m,yl3;i.srt!lx-qrEGfCPiPJur@A9eq&.GY}ⓞ aW\Gn?H$h #1>wӏy5k\fD)VQ0BQ@Q0~QWEyl~qB(^}l:[Zm9^㩓cG=!ޙM- ɄI?K*,NNGlN-^_-#%8Sԋ#bfV ʄ.<ڿ\Hr ;!Nz{$|m⥶V9:l1);040h2/FN(&9ΎD-'_MLQ:̤{E}NlPA& y) 8+i XQJ(_xQeKv$SR~s6t_ %SvxkڴzKFerG+iʓl'*Lnt4g1}n\It9-y\:F5)2+"L:(<6h,UF3'#.ʠrSgp)ImzER\Y.C6W ȟ&u=]oLYIG&&O]BqE꟨-21# 7J|'DW EFD?A|NčW5[U4)ʈt5ApAKu?iv[g[kLc GlE2O#OdԁcSo@ Yx%aAAWdA?KjL4.ZܶcMI)?] 5(FXu6Sב"'9qok1)svMɝ;yKW5f1Ӹ7ʣ~Ɋ"K( Bz:r+>SwgruS>놰r*|3p?:4ƿ.uklU`#jS嚵%pYO4 c S L9y2cC̣O>.6tڊ|vҠ瓎cf 鬜L6Oa[,.#qÙG~:u+XidVQ7L4nq˳1ή$g~}0*QԣpQxAA>-DQY\61n Iv5nG};.٤D /JOx>;^Tn`jp|sS&H/ï|"3;z(6=U 7f>_/)PLUj1';%G 6& "֒[`)f} ,(R;D/]j3^krA;(_|}Z~wH k%|Gns(T*eVK/?J9oX[ ;h5_G*c]֦;Hag:#@*ʹ\VwZ/zw@*k-i5pkUW`'Sj,>>[@Syr'3Gp7O٢l-춤$t'%ҢIzPxJgWy|jy` 8;}&sJ ܄Ѹ¦`y:>!v2D.[ٱs6_}A`ghJs6 7kLvw3;] (X:geZ Aq_bla!EeU~bZ o@tttvJISnEW =]_m|Ѥ/O Lb*й ckΧpLs_$A5r .UVK;^4!LC<*A ?$`,EnH#v~=~m ]/](b'?6} 儣ӳ u3:ɭ2c1:E5 EG_X[ϔ“z%[Jh]7T=|,7<$`Ylq҄on[+~':OF+P*+29)eB *RVа)}s6DtZ-M'guE{F3%NZK4msIF-*e,xƭd%+1١WKVUbU4XCyՄ\5ghHx- ~Op*if)`MLR6Ij.s]n²RP6l:ho)aIDڳ%bvۅqI@3_T,g3r>} ~m[Vkcoª2!;pD[$ BJzhCܠ\lp΄2B: 0p1lcwcr zXUܵkDWUUv.1“g+,$ G{p˫ \a2ĉQ&nڤMOĴp/77%:5){f7|'~^ijJYm4%R[-ȝP#qMԄ`ٸ7ܥ\?nY KÕ%tժt'lIzRS/ L]1)XrDzm0 %G2\eƅܫA\&fILNeBW|1u&yӴQPxV\U;.geYEDTo\r!vVQY^* n^]5 O6%Clp͒˜fcOr'%YMX0r4,7&8W,Ldtdᢼs[|\r%[,4w%$ Z%3G\2.UDȦtQ S{TWpZi-%"sBLHHMɏKq6I ~,ŧYIoYnLgq6QDw<-hFm)Oy:sn5|JǑj%d",Dx٫N,MYښ}D}"'=vH'o͢&ьɭ o;+E}Iˢ;JyIʤ-2`݉$I7+6J tQf{]Qᩉ+="N)Uߨ< xn-ZWGx1kJR*wDkQ.P3/y8*We⏗v(|]PMR#?Rt!^]@iӭ\lS&ҪHNĭҎʋ+WJ!nS]kˏ[ڴALD:qGH5R][hbr٬[ ^U`iNYz Kඝ~GMAߺ]mvߒ)Y&4~k4!7~87FI agtG x yNgkD/Qe>20 E֤Yh_H̓^eGxI;pI+2D|dnٹG#?tئ5(k]c7oќe%IbKY+\\}Å`UBmӺ o:,T%Tt5+m[lrt'D8~Glrx/F%T_obؾW-7Y-:OV^+ U9qRH -_A:TIqjMVw^j#=lTqkV\\\$Wj EɄ&ɏ`YS]hfmB =6A`+>/<ߚ{6}5ES~Kճښ j-X.*UQlqLI՛XtR՟G oQ{VnUfD\EMGȪJ$7=$L??Oy) =CS"4F#o|"?OW"EIH~.3糅'CLa\)q/@ĥB{㓓DWRzC6DJ=Xc7l%#ꯑˬ[U?(pJjKf,#ZeƪLC_#.} 2,䅝4gw `LɜȔ3K̝pi?b1y)#1xVk4A g~0Icn\آA۳ _Չ8xQqO8NݕWc6b:$#)(I\d}kWȉ1賅 ϳW[r'Cyj-PUMէXNQzhgn@ZCxp L>.r{dbKX(&P&(;ءV1{"^j\sOp10GLUvcI&[xiU~0]tϷ^QB }s%m&?>ikn%Wk1 N1Gַl͛R]6)>=,K,km+/K[C31Ȓyֵd-z$ďcQ IX%H֤%O瓒)U)&X X¿-okZu""+8Ǐʁ*YU?i&mAy{&ACx4 Ӳ5ɷX0 m,mр>j.MGU Iz 懺u}O r]ЗרG/5rC<ҠKi㉴ڒIYzx{V)W<[z^2qrĎU c,:GBrնs,e%wX{E[ZRZ,*|f9LMelfŭu=^g ,LghK42#vLU RICӋY >vB?7nD\r.ʹ\vZ-<3FZ!%kLդ1Tw7ݳ>|,&Za,>I$NE6@d# &=Lʄ U&Gu(e-}r9 5&t9vɋV~/_&|L Bo.. 5%ɋfL875j x >I+daغt!h2E!_lHd 2^BŦX~'Io81ett<\&\a5W{2SL|fR6;K~~D>.i}Ȱ%#}dFgdLQ>QF;Ő(~LBxY1RV'|gZ G T ym[VC@ B`[ `~C0Yȥ~pa S=?ؿ`sE־t-z Ϸ. A;v=Nd}r"'F$iٴ"CZ1}/WjٖV;x3R$%r\m:amRI &;Qzz_MK)66W "ܒ8\*٨FW?﹖]Gy~yo^ ^MUPǸoaۻmYY8 ْj^ʒ'=2}oK5-]qlg[ض-'47.x_ [W[Vmo_\[[ClkR"_~Evw;;< ɠ6_Tobs\,;j&MKyA "MUSMQlU)A%|pǃ|DWgZ缅֯ڊ럦]ݱcE[|uֿ|_ޖ乖m6?`W=)Ed-8w3lyo~u/]i筷?Kt=,TvRz=*:.`{'wY>WKx[nͦRz4`;T_kZm8_^}sȷaϵس5 0Ja[+,/~ٛx#EVQ|r]e 9I}UxKkW x Dxt^=E4`sE.a([nuqBؑ A`ER ڪ*h[wܸPŽ{ma-Fŕ4MM ].D;jT_]?*2z6]iWֳjm8>)vΓ}GqkYĞ߶g^mD۸{ˏ۫~9OVZyEy56;Onzl\q/Kk|Xdڍx;rvoa]_yxt; W<;sUֲqtvJ09B~}&K\.&V,UH<;zlHKmA^ф9JbtX[p#cos6/J'-߉IKv۾'ocJz)\{݋^:}6[s,5Ǔ6.t?Eǫ%K 7ζoiGXEeJ??>j;)mvͻi?$҄C9%/]I/|-zˬ}^ }:^-%S61JzRv?';jx_䉚;W%'pAd[o~}Ɲ;wZXɯseȌ3{Б7o|dHSKF .wUZ 4XJ咆zժCD$Zۥm~>}~.?}#;?ƺ-\by/l+\l:ntb٢K.kl";ٖs}-B;)\ 32j'XFyKp'l Ycֆ{>=k /*ߩr[c]Zݦ+lrW]MBT S}= g;vWۏ?[}o˫٨p~HʋM؊sHLs[,֎Uݖi{_gSKnm7fk3Y2 ﷏|#fOL"UXejLD6FGz2e F=e}:$M?~[so|}SK.笵1xھOn﷥|-^βV^ol7ʍg\ge'Ǎ'd}mo7[ڮzM{ٚ ڽ7-Z^w^JHŊ|;!RlZїeN }  J ]AY-Ds6N!7OHghfp2Ŝ ? 8;]eCŲΟUMV f~-iꄥ^3+0Lx\Q߈}cyo3T{-JB84|~w{^o.[O~w~o-wi/5&]ݼ_/oy}ϿMvtVl>{o~cn_kVq-mcvޕWZ\:_I/zn2>ݯFm#KvU0th9IZ AD$G@щ'+|ll6.|D]Vr_٨jErwЖ\|MvXy! ՖV[|k[ȊM =KXٰH7۾+]7^Ji«gMmvL2?=8Ϛuu9һ$8;GC2NJW~z>Yߺ ^mh̞pحk7voڲ=QՖ uvH)0,SXuW~^z풾~LcJVU*yJgD3c e4;a [ ~X/@7˜9 3YZB<3}Nۄg;e<#/3vɤ?rhrXr'lR-D&m9+V:l2LtuX,E{>c,?,\gvP.-bC+Q?\`y5+̤3H5])4yыb{SԑI0Q az?‚`s}Q| KjH˳3<+ņL=b0Qa`^a"C&jd\늍U{ ́h 3I#E qGcyܨEDU#$6%-t5yj٬=jntJм̞ڹ\c۞f-笶vϰb׽vӞbO|[se7lc/K_q=ncm+dk$cɮz+ʋ}Ov[hOo}{mOhؕR7ؼ'?r]vĈ]7u?.~ZOWf{/n?_i׿ּhA勭i|{G>lOz˭my v<φ›o2[EFRVѼ.k~]~5vo~#6zbz{̆'%[}yv\ԏmu2Gmĸ%XؒvY,aSO1{{3QhA,32uA oVcD?d tE+[ELշ(F2?QځQ_n_tXbvl̪GF-9N{|wRMTn b2BS01Zbv'l\xgrlj`KME5\v_lצ5worL#f;Pe" ;b1տSlW_ q,=| >9=ys [2`ehf`y*\2; y.FrVqD>!vڜsN X )_c9PW?O8ۈ~/<]ӜtvHN5OTl{_-)3vstv+hv]9b-L-YB"rʹ t⸔a +%;xE9[)(.@rСvO0LTJ{s>뙷Ė .5yGt2#,<1@uH]ᦘud;=#Vَ.'zlD8qIr;~Ch?..*?=WyϿΞWde?n|l m?c;j+.k[VW/;_R{Gߖ<VoҩvV7ʗړo~ڂKH]إ/|-]`{t^=կ;"w]kQ)ů._O_wmxً{%/HGlkKg?î۹O/o?l^Mvjp26جP ,?z+;E&X\:qdig{[JsM4KnT9hUOXܵ~|묿~tַ`]Rlv}=a.uz9|7s5@qu,}LA?vSl|7}Q?Xn CL 3 TK?5cUőoF:jǸU1'=Ftz$c"vId56(ȏvPDGFih zXV]6벲r<\I;LJl<31Wg vϷxtI;:50OV6^.D"+pfK,ibw ]16(4PhOCy/] WgNo^b' 4WDԜa`:g;IÝ5\v q-H÷ٿ!Wgq1M_gGeEXV8C`?4勖AoG/*'Kѳvv'>Eػ>Gߚe26x}jh=a>*[v:}_GB6n,۸m׾ڡ¤=Yc. 7UmkcT@K_OɟZX_l6Yk_|vOoJ"n ׮ 4۴y}c]ǎO}hۢvԟm޴V^tm۽ێmj?նK[o_n-lڵj&Pjh҅kVk;Uf/{m[ho3B~-V;94b[쳋w|twJK07-ZkvHW#m-T _nяw|W_fyWmS7[I+LXuϱ}w^7زy Ͻwwۛ^Ffbsœmzl&WJpTe_zp-\`A{'Cq t[-+%gh'fKg*2a͝8KI'(N8/zWXd\'F?L`uSX8Ūܰ,iT7xL}?ks[nx[76V?.JM$ӾswgikiU+V趃{ %/WF.}SiМ+U^m+^{կd/VHxK퍿qڋ_j?6=[+_z-g;pw6rťnٚn OYURcU;S3RH]p%CdE*>#bǟO1KfLIe[V-_rw-n[ۼo~˭}RZk^>_8|[weVW_>n=ǖmO%n?箷3_o^+lѪՒ+%?}yW]n뮼ܒ3XCҋkjt|")`٢Ag}׻k]'۶҉GKܢYǼy{ûm''>0ك[wXUz[IrFN iwnK_}MC;-tvDX&«c-v_g:&坷Tcu[tܺ#-֫[,⟰aU޲.WNW?vt6۸sؽߺudZM:T݊UAcN`t$wqN cu_E~4ƑhJxAۍ(q Fe6 5M$aP.xFR=b%}/Nؘxu;ԯ"筠ҏZFK%ۗʋwwZͯk(*~^ewU*95{aj8fJCvtbe,6hd-i+d&e#3O-!;:]oP4F|'_c[ptbxes1:k4)"&[;i{v`_!+grY6 wg4L0C'Oy). g00 ?\|b g0 ˲ |}~Ğ3St˷GcM(ߣiJ 656a-߱3I۬)n#᭻7_7ӬWh#=jlǿnoÏٯ&[ܲNmRT?7>_tګ_> Q+N;}&v5 jǶDھ'kzۺGvc;vxNnIRk.lg.YeعˤptС;O:"bʅM͟x'>Guw_q/|S"q-j{eA=V,q+6Q-Κڬ}!;Y7kkR.o/x|߰,^bwpF"R)Փr$N2gb: i=4.OH4PSюNMplLT5e&hM[e/[%e1=vp^X"%6>Gn+Ѽ8u##V=~o~V$pa-% #ͪaf+Ie3v -s ~O_FLƕGa1O.l4oS]ӊQQ&h *.˧SMcC{vX?4*0۠b\in>}ʅ*߲`00iMC rc?rF?EΛry[ԡQlBs#d@[]#>VlWMeThώo/ڏ%[V˟$祊ͻcU9a/Z )q%S6ō+m6mR[)+I׉F*V5h%q3ުߏԭXBHT}-.\&_HwIUO9tNWrHrDz]z-H_=c.;BD*Ŋ}`e+c{d6mZ/~zm}bJt3}ox[EsU+1۱_xI\m]lr;}mٴՆ6[Wk_wn{ꓟfx;Tef;vۉG-2R4;1n+mlQ^mذ]vS?zg ?jMc_˖-_n՚띷'_Ӷ^k[nq:&c#{%ַv81iPנfCQ)OZBzGXc=8^^oz$[d{ƘơLO IӌM17{ozo]IDݝ9s' 'y |7bEa⬣OE:9DrwIJԐه,dWC2릟KGo4֯fD[\vY~HTtvm';]6ƞ) Ii_v MLrdG_J筑3b†[̂ZP+( W.Y#ygKr)U!D;lFzMW a|x =|8̾F}66[Q`-Ϙ*ֻzP ŏʼILm4q=3 W &:HI;p=6)fMiV3NRATFotlq ]0qD5M֩$A"Z8՚YU͵ml&ۀPNj, -e(Jy+bE6Am"\#KPΙ}*;As9v @@[zY.ctdZelq#Π1GVoXৣ%P Obdt']v KolJ Fފo~ G?"x|-`/#0x$8As+ r|hgMx|3ѿnAC#b!}n6b&G 1|C&U 9hhcvkmB`'OCO>{r?{1oښ̮=@/_Bφ_t!v܊!xvj) c4f~lٰS} cUp:CalUW%:[7+/ccU1h%,wۿ[67j&Q͡qr!G1;x;oɿ[}߁?CH ?q}Q<{sFFt?Kĭ7?ϣTՁPOďbUSQI #CS6DdK9$A9!_bͰ!L묰xk"J2H?EZ(-kۍlԓ }k{~ tldN?v_Lritu}.&&4?/U:64}&ֵW3j4wMόtX^ ";zB绣>\tA㛾|M??ԁMK=G﷮]O?I^4/N/n!oO>;#7ZF>"&q#Ei/IEhʈ7@@OҴW%OjҮt7~KT! !M" !H'?M1L| (7cnxl1s8yY<̳cI|-ТMfk4Bbx?qU7|ወ +XHo9gϚc< Ab /- Ic4 kgViG1ۇRN RYr0*ɔ)Wv$dna//bwe4EI<rC#hok;6XgȋI_{o?!';v1K>RLlnsO== ~~Je#KNd(gC,Ĥ gSv׳=ЙV f"Xz^*i:).RQ)l<ʑYDȶvlTAo-;x,;ĄڅL /pM7]?!/p?=xc=|vũ] sfyB>tq|3y 3ĩ?vnG8+Oz ?jڨ> 4Odv]r±8=_>@憛o;op||Q88A'hǩs4xӓOU4@@okHi2224Ocuw9.|*ߢ^ X#An> 1@C; xć mhQA9X %* x~FA8x'n@˄6s]4 9܎_<^|N?\) CK&΢nQx9] ~p>E=־2/#N9 gp<[S:+/&tW7123@FZj$ e߬u=h˰-2mzʯMĺ-;XsIӗ~ !j|7 c/0¬h:a*3*M(eC8b$wS<=&v].3yvQBYWnxBJ$p.(}x9&(/[-=_k\dPDvؠ!Kߤ]JvL03x+HNa;k(rh46M?vvIr$kSh覱}v.`f&MQZm%MR`Bomx`KD}*&ݫ'D<yڠZ2.<_qe[WQ| M~?\ wbr#`AT@F3o܄6,;р\z42ChhMK] І^}A!h׿9oȓ/ɮz˕&eM̊l.BEkѕՆ>R}pX/ o i @]Ú^<\* [,3X 'L&#I.y6hv'>׮}M?ٗ]v=I={"1D-.;ҏRbO/&y$; qh:?wu1B)ycʘ'Ѥ4qR?s. ^ٸ+NbVŠI0 ~s}*>|q'S'!b| iUE?4ptӦaڵSV)\hEyK7ǝ:fNč_;4kE\sƹhmigV$vbH ,JJ:oz7\)w>S_-gVmS's>+Q&ΡqHGU:>c9,u$^єNmm0KY͝ ̙M?̅^2.*~0 ~o⶯=^}fY6S>= ׯ#l)]Kcp 㩕/Xq=̧Ox?5w0m<wU?S?%^]fIMSbk-1td! ufj;L>26Q?TկQ#kPPT]}Fvsپ};9Y+XaxdHnд b hA9g)!*vtM^$r C6#ӵҁ ;;iJs2bMeTD)͎0%鳝  D@)eRooކmކۋASkC[o@ƍ U{]8c1uB'('ٱ^x 4Sf|;Nx<,cGzO#ރ-͌ySmX $vlq-!6ۃ T2)LƱB#lBb t Μm[6g+>M[p،Xxԑ"ø뷷!GXO?R6 tΛϗ;c;po{yp3 [V+_xLKu$\*s6ScݍfubtFoTM4Z8=&'QMT`L&XܹUT T75@46 n1/?4Ξ9S'?މOa2zX&6%|F̛c{cyV ˘[yM~f591i4**v_'tk>픏0ҟCx!t!A[puk70*1c"2U7)H rAyl%?^}Ezؙw$@REbk/&tHUOٯ67`󹗱mzTYxĺY1Q#N: ;{v` 8ݘ:}+T(ue9H7;"ʏݸ q S ;&6ʕLj5yl]a_S#Cc~V[d4u ,xP-4wvO]qwȤ5-oK# @NV3g0R 2W [ jFb5(#Uֺj/o?O36m9e VY/Pvէ|{,b >Vz@~Vz a+;z鐔1e5pliV}Y2q)DmvUo2]_E8_9WrT&^nZN-;<(|8 +(' TϜm;##-3yZTr fϝVmqb B:5ހvud|^tpY/?͜ցJD@S0@eY퟇f-m(<{?ͺ|bd&l]Z-6O:hyك?/IP,#_%E+1TUD Ol6ӭ!?m؄̶^>pkQvAޱq=}4< tF"t,ǪgA*K[ڷ~ ҦÏMƲ3Xdֿ27n,EG qҟ#V<4's4̞0ѭ?)|l0Z3!;XLDPX^Zx ^񧝎Î9E?ftt"=kct6ttu`h5{}7i*^}itRn_v;ڱm:_GF#J_qsy&^}3.ČS0{<0;k`m1zβSX܍X -U7֮zCۥm̟m˭vK [|a1uCb.=mǎBev"# ѦE`>lfY " cj_aT;H/ ,m~W:5:֧N6nڦ)SA4Kf3ZF`X#?g;v8}i\*C4Zy2 q4TTrF _r(|oH@g63G!-G[Jg1R5cSaj3QBgzV>u1o;-bffx&Rco7%3J`PLk]݈veg -gy&OAʚz`_eb~2HL ªʣg|C~ΉsgzG3;{+ffUfK:TOW3 'lW=_S̼wMU.}"`dPDND]Юi!גּDC='~r ij_y2Ykal˖W?Г$=-;lY#(v# Ótg_x>[H SOB/{:@7_rvnߎWbἫ뮹;žM]XI+Ҏ캛 [SYw$(XWn/woc}A*Բ}MO 嫲S *T=DY z1P* K#{ማ]{)Bf`H`ȶʤ83̠t B`@ ҏuYNɰɎ"A{ga:4Cp}2X[=lۈ:-w? ?τm8KCZ4˂+ wInu,3;]Cgc~PǶF}Uo>HX^xtJ"]^eRVςg>^p󭷢D[z9fKk#DEx-3#<'p%/F?۷H#>i >K:~; u!Gg\{_.76; YB^% ^\3(Ä&wOG1 Fv"mm 6psZ I3kf"kq?ӳpc_u_`աa#!sMX9o£N%GuL؍n$B ׼WVaC#HPM^LO~X]x75ngx׿^5Ĝ>$*)$q8?/>قdЇA!h3Pզ>s'(z)z=_4^ /:i1t2ec`g̉^ kݯ|뵡yY86#CO7(ֈb{(9"BIq!*( H IiIdcLpY5ra+J<2T2rdxg(@ea}'a_EitX P+LXJw}#&X/'SOn 9֪*_Ք)G~ka \MY+;vX8)<TvEcS׈b_q=J̷b= [tU|)58\̛gKy[)s^u}ξ^eW>.W8@>XM^oJ $42LY,>"\ q.(kPS~gYr4W@c5A2"KRLO}eM'UK+/ <婠+G:pwy!<b>E9vl#_S۲MQl ̣9@S8J*gSRֲHaz gH 㽩Bu] 0Pw+jN@f]eskjNJ`_\kdcLCV9&)ʯɎ $sңj|o0o+3S~xQ $I6Z-V_c?[[ $[Vֱ|e_+壠WAv^ֹU*/źF"J"#C>=XӒQ4 ԫD^_>G!b?)cŮmFM;DmE 9}ڭ*4q[(J0Es#ΏESw67㹅8FLc!ڸqF>W$ʼnljqm3ݢ0y/ ҞHbqqxuA͆aY_N\Bh<4Tr$r6R̬% 8 U7 Ny}qqbhyH:o%O[E(1R L+uA%)DKYnyud4В}F1>Eeϒ͐fy1/=OS- #Z.AN|2Lƈo`׽ JlWxe/aķw ^J>i,OZ,B( 3Beg/ΘoŅ &џȚ4E1T̢{4lyyTy]?`҉~|'7ybYbC9yL 7И2g}WaEHmG:5Ven*'}v0q,L:dxpKxdrhǺF/C?x?K/w WۉQ zwRn:+S{]gp 6܂XN"g!Z9ORLIg"2;'剜 ;Jƾ$hwzb3ҦB/R0} C'r:E~c{G2;w1v_G94$G"V~U^Hƛ#eђOEXRހ 3o e4bAa_!oe8!H2|d{Ia݇M yf{j0J"8nnَϣ*S3_0͈xu3ŰM&Mc3"~<̳N$$k`E|wҎ$RQ$K#Hv}<.ѮyRq(G/$Q*FƍK8?r-.R>z&nU~iD&X N-Ɖ]Ċ^y},<$ȯqDe4:n,H%Rqw\f\tnכBp|i+3m/q%FǕB\S)fH]׍Wo)8T|{TYRlɸ^fdCJedy䊚mD_åXj0l\/r^T94jvۗz`؎R@/S _Bom io&7Yp"Gݠ'?wiLhBp|%(s-֭[/??SO;g'mHmA,({h:]~ڽhm@cqdNX5Gp٧S_k\Ivq;Qx0PS+" tI6l}W&;ST'MMьס!s&hŒW-LЍKWWD_̜CmAJKB{E*]8ZuRM;JA+ȎPC+pPCUINzApA*sLC[`kB~c'>w}?k|Jt5k "hN 6T._kTDO5Suok+v!@.FNox`xi1;YF^Hb##j|%~mqXUlVF.UST"udrD0 HUhKT9%\7&PrR*VVlq}02t"%pRDN>;sRq1g7oۊjwiý9\%:lZZ~k_C_@q+؎U56(fײ{a3{Ho."K-d>f,aD}\nzd-ٿ+}Wߪ3 &:|M01_촱A&Ӌ#VPަ.=B o-= @\B Z_SG94vT"@_ϸR!&Xca浨͸ԎZ:]k$<|N8  Pnڼ"#'A 1k{e;}&}ϱq@dc_0A>3sbu<|A#=F.Śo`ܘFAa'N7$slJU_9kBAb}}5j,|'ӗ(%RBY'V=3 ?AwAf]̗bqx+TzYӚ]A'q=ilG֯ovJ}=H+eFvgmiOjii4*őxdm*;0eb#yotH!C'v }{/s~tO\EҧO#b0m ղlp=!}X+ge8TH8yԄr>?׾U|Kí?!z~t42-rGpWa(1  603q?(_ ]FJ.>}gf&̈́f"nlL}i$HZFAJg Jִ=I3dtXA,B7F ̍"L*1FjXYfeH͒(N'ِ{ )ئ j鵄Yӑ@'Yu_d=_ekH%ǥM%c_cQQ *t]=6TjzrwQUdgfdXBrIci01MJ><-AW@qp4>'r:|{&}r]w<!ɋX U/"΀ȕq@ %i` ݫU>ok)+H/-YѺzîAD2ܰE$ r%/cFvd;t-כM] PA<1ֱk?~;u$/Fyn)bSϑ̚"~#vu\[il?>lOHK؃C*b[46'i 7m+l;iu{=Skb4FJmW"H]#HnhyzNF̢髨rI7Fx\ѿDΜ>O綔-@<.d+G*rOyQ/쪯#NKȐ m2"M^0q1sv=˖5<Ѓ!g.+}\~6z~S.cޙw~kwƶGºիpi'cغe3e;<+h<~ipMheC_[`JGw$3 F(呫pp=OϳKtѦ844C GWia?RyD-s6)#mmOgPKoujHimm5i)xtҰfݺufFG$ONE4v-k-Y>J`$#mOeF"~bJ/S* Ҍ Xi2U*^*C%{K(Cj ϓ.=!f^I!8AƤH9g㤝^w#(24,I>6Β+N2_4eJP2F)):cѳSWZS,c׎K0N(?ŬOI浤P%p_]zdŠO]d]t ,Ղ߇΃a 7S}8eڃl|EvOq@a)Xf52ɔ91L8C 1~WWfJ9]bFYƎc$X!Ut,kXm:B}!0JHTX4O{MBă1؇~d1fyˍIqv7g$Kq\{PQlC$Li(1?;,0*ސ##Y{٤Ex4B}%fVg)ilc2&g)C]ueE])?6b+C jc;~Hv8CH՞=6N ?7RN'{fȍj7+7ca7xͧƤew <xϿeS)Ks:ԃBAK0ll-}`l4(^ٻ>ZP_YBLz‹o]d;][@)%Pln0bXW0r%\י5;5橄" himG|LokD_i p_o\ݨb#'7t8r6mY//>Wb.s; 3\( `BCaD:1+PO>٭;i:4p*i0V=|Z75;`JG'{<9pU6\?yJ{) $f*RPb`rZ.4(Mc) 2w}IBºF3`suO$)rhL4F]#7gv:QT~%*f.ZUfuiO 7F ; 5 34k)$VJlfC_kPɬwX&bb|ɐ9 $ ȱ1K;nxxNsTϱqatŬ y\f&c,c냞 :%joڠKSYt Ӛ h!f#ǛYY k!jDdшgREk h #QLaxv@i3i 6+ gWIZվG:HGB}R*/)(o&5:)6_ MhǪ#އ7@ߎT9۶l1+͢SA}lZAT_JRћp+Hnc7ĺl_3;};Ys/3Qb~餁d{hקA3(t gIAuӮOsi5h#9OI 2]*.ʔLk>BGc5 \y)"H A'eRCgQ`˒m&+RYWblP<[Jջ񛿟ǵXAeߠln>lIڻi'E*&}^*S>$cQ,z%m"a+3 ëOaK%#>D&⫯ĚW_@<[/r!2K9Y嵂I7\te]A W3y2㡳,''*(P"/NQQh'ۊ&:K OvR_{o _W} c˅xSl~\3*K ZaOaov#MN|xֹnկ-.3j XGA|u]3uy8o̮ _s>6Z/7(E#󣴫Ɔ_+_@1Ϭ.Hxp/ZGB6G/]\ٻ>D$DH_-b^m등d\r=܀ؔ襾_fG׮O~kSSn_0QO-㠍 g*GjE>&= {D!6^Zyxb-<#[cǏmhjG`zI'!˘`$RlI]"Jf@E#OM7Oďa7:6ǛҚU,[+W RFMh)KlS蘓qቑ>d"A!e1Ŕxu7fww}@ߊx AaPlقl:c]Im[Xhm~fWi!OyLfjpW3%`=(d3J9h1+TmJ$).?#8XxGk>K 6w^xgy&ʪm5Hcvaz:JV Teceg*ʫz[kjpן܃t5P3JШ2u駟kEPq@xaHE7PJp·:PS-X5!+=GJXG5x}߱Uf]4]3 iKuj뿽c+Xy35U|@ͷ݊m&Om!sYýhW:鐴9*w7Aw2S kd%0桕ty|^%:L"P.KԚEw 9a+O~tQ#Yt&bhI ^>T`zxhr1UNLeҟE *J2]txcdm0NR=06>sKf=カ4mFr~߶u2sg̽ç=[׎vZ/݊wX|V ͵B4H׏v?ⷿ<1 5loсc pr.1Kgyq4嘽jjV=w[ NW4kϫ*:s,yķIoz H]3/?W̞m=uj-CQ}~̞=zyJ fFCFksiT8Trdd'9KȦ0z3ha#<@QFX䩓񾫯C32##(tUJS-1wR(3nqX0l0+O8 I +ZuY!OC*ʦDbl}RnݠcMړjT_M0gkkr 33F@ 9\ש ZM(gA6^.EEU=_۞y1\!oa9'GA[e}M0`XIp#DA0dE|u2Z" CuHNUM*XM2ftboQ$\VFQ_Z7Eש zx"Y;ML[o^ɇbH/]&O2d]4PS"߷8c`xё &@2[ 6 9a cSvզO+U`jL<1A}햑94{׌3pQ(5%o~<^!드NXzg'Ƽ-=Aʬǔ-n F -]F!3mUjK >iZsoʡq0=WYoҒQ+`,K ~* BrJ"Zj>3PzDž..=;̀\y sYzcӦM;@izw7 Wid)sZ8Tf^\o(x+cO[j .cۖ~c17.^=3J'ƆA`nP/&Ghh"e uW`QFW؍, =~&k.O5fF.xaūhv np&Ăg>^A ugJܴ5ٿ GW:J2/ivkX3LϧwΊ APnV 96bC;?0%D4/ l lߦXcse =t ,3lCAAJ6VAWl: Bvϱ]'\s 3^ʞo(>[}@:ǶқcM(f̳|UϳcKߴYza<=Ce~U&f-Ɂe7RGu|ֽ $滮m>yYB5X&Kf#?%&2$46 :E-b9qҵ' j?s=׼4ysqmFK^ۺRh+e/y䐬&W#x?ժ@zɯF!7w6eQVHevͨYߘ(*sgؼ]<_7;7iib^uVWOu/F4F 7}ʹ, 4zEf,I #2c7 Á0$ig6RJ8ENAeVӐb>O=~I}5\ɡ7ubĉHU25syҧ Ek׮5C>tU,+]$!rZ4'^i OӛO<'YC ]XW=kWP84]i0-XxGbP}qxnӨj% л41:@  $֛g 揰?'^ځʠF;\оQlײV.>o~n =@l^PHw'd8ڑP :uK%YW-Jԧ~ڥ<q5?HBF"ƅ0/?6--)gOx^eJa|.܏vםܭِ@]vA־%u`b^XxFI~vh{'1zGѶx>~Dc  XW泥܅%CZ#Q/SuI {exL|{~}}̳)Gm"/pB:Y:J~3:Q_y_ce?C5,W9l((|$/7P-XoOYv*Mz56fO~k إu0}ޭ )5Z5PY5ZF5@͠;dfE 5}l EjΪ5hʡ!S@kfVJH"iO:^R?< `v̏B|MOiClAhbas<]ƴܫ)~f*XvbF؃hfPk%.W%^Wp<tR^H]Hcv8=cJ$&,p#p63XfLu᪱$'_M#Ž.v{o Nla&Aǵw`n/lΤk 멷 &k7 ғҳg=-Qߎ <@=]kd_2j7 7JwPh@J%nF0f7# qʴL.KfH2$ jlpfzc_3xO7m2&%:ؾ]<fwSp$ffzrxTqBfOAB:Fds^:y:Ek#c?7m]Ud Ig7J{{瓈4${zh_h' X"xƭeMWMqMlf&.,lOG" blF'RVhI! &&)"Hd>|]<4->E6ڏXr(0H7EmblcN+stCa&J)]v8ˈى`!:Xbvĉ9u:U0.)PJee[h b1G Mlzj\WqE'{ 1xR"t64N 9'b00s`YQS7po7=Ib7!|ŲÆxfrQw"L -6YYM~Fޚ5$,@Sg$S5g6IUd^S&l*]g ^+ؾ΁L 㥋X<͑3jXGllOrRMZj$ƌK0*]3m,УL+}Yn-Pj3̖63k'Rsr2mr,@M*5jp_]i%Hsm%ZDDߋE*eYʂ^r<50c6Pf UvݭYHAR_K$Ym\miMV5Xv׹`&:؛ A=-.\GCTכϝ45ӤinNH"]0v^*H"Pj*ކ9'P >jG?tWDӋp7ȼϞH>V"jż?(P-Q!& TdJy3e:R 1{))81y"!TF\âP v5ڱ rh3š6.ëY}8smGi5CedB㱋y([ڽlW?M3H~I%M+ 5VHO 4{ !7ZC;%oBpXյ!fIysȶ`,RveG5/6-^EnDI돃>-+td/l)Z_7rKKNMq/A GY C O~y$3;^汋rdHߙQ<VrͣH6c Җz,/uE{h6 ;AfI-_3O'(OAJʑ~8mN.0n*r-}&. M ~{/mv5%֢}nt<탉 YX&Zܽ8G,4hEaƺjƑCH#{-1&c3X{um[vVۆk\5{hl;?Ax$fD *y e|+-vqiV:c ԈX+s0:O9Mѹ,gYD E/SbfgOG0_b>ބăj1+"$R%mNKe&-By*S{zi B&̕K %M\1?^#LuJ/=1WZF& Wd>"ڂ[rB9kzޥF3GSŅfrY/XpI1]_6 }@vXML1:D,t7-Ɏ^A2hp詧҈g3ĺķrIvwk2*6,x-YZ> a3mU*?^̖Oo1lQ?,Y)`8fΤT]R3xrc/R %vddDT\Ws (e;8:;Yf}!ݫO44! ,_/Ldq}H|X=ImĶslOX.˔i>qw7Cud&my7 @ѻ,HrtFlO`byʤbgNfh0E 0. E#5 pY6gif mG_3{3#WXIs30BǦ:kjFGsW#tdԣU>avl ~c^Fւ}<6@ ]M{J;Ѓ]W$7ʾ$u'(b  %F͠'H&cmN0`i qj{/C6< 鍂tL?؟sεb2ug,ꓽ##^g:+#լD:e>`OE hKدY#_)f uzQ VJBcQ7CmL]mi6vAP\u嫑 XSwS̹#tStW)b4gZJsRUV_s-P8&-|@ʔ4ŝ2CQAkC FyH9T%&-S&`M=~ːQYM-h_9 H1k)0pm.j-2ExP l$am(\lo}66I/٘=B3_rsi6  <~Rf%RMJ48:4$\+MWʘ0BG+y'^7Ղ֫.CCS4b'[`Cl{ ׽ soFhr7eYC/oɰkX ߶*@U^d^~ȞG;֗%^)۸}"ؠm=a>_K~(]}v>i$3ƲcoV`"(S7TDA:wX 6m.4l*Ah4j~Ɓϼ BQ׼Qier.68ut.lj]^QO0{w;| k2FQJXJC|&NIZώ=zBCA3et/1wYa}iaB͍ZIa7ʆlj$-`hdCA:Mm_@m@j`C hʹ-[B|a:ļG7]~CGY6M'wxu4-Iښicef 45#CDx hCae PuD b.lj,pcwP&jd=< rs̯Ym@(7E:%A/_α@ÎyffQR9X0Llf2iG7\^ν¬mQe³T6K&#E ѩ51$aJFÔ ɳs95vkP3_%jҖNeϾPշd`Do+<3yg4! J"k]h螈 R_:iA87n=c){[T\8-mf̐aʍR9 W:]OvvrLhh`-E ].ۣ佟}mf7iH҄{teTйx^kd^v92>BA3xvtNhSܡYMnY tPmodݎ%̀g@5素JzLb:N>7y"̻wҧPZfoAe3>B|>u5U5zB]f0!%11zoh:MR7r*yBsGѫ90DR1jTfZ\X!fj `qkP_Yu!GVZn_IO;f5ʈ%st{Xf)ga0eŽ{8dY i6!)3iWe 6  ;9O8eK샼Nk8iNj>"fP4n/8nff&mba;3AP=ŏe;E76G8bc+| M3d.8a;&a(BU,HbN颻P`zr`UK 5E\/녧ZKOY؟ɏKneʯAPۮ{"\]:e.e!ұͿMT_VQɓH.^c6㡭4i{nmkV5Q&L Z Qrb0)BA7fT Hs|Υ+KNK9I{y\$Zqcgb(/ָJ3+֏\yя h!6 M3hl P'²6kʞd:Iej1|v9"/, 0tva0 uc$'”3Ҡ9vH )v+$|>f"PdXl@WҢtK|v 77"l%KӘns_?A!2VoKl2 R^M; P VlʡhF߈"Y果;i 8ir9{~$ &wHF~9 ({Հ<5X};ת_WM\X ̸L7qB'Ax2QFEU7Iٔ*.J).#7!g-+|l~qHG0:ZD ،N- rGpqѧy䛓U؉ INsfl29u/|M`m))"Zm4$Y* Ԉc<G87|\\;eJj4z#gcv'[d !ki^Mf5Sbm]]8qYg!Ѐt|*qW7򕠎Joi+O<]|K9cXv1pDkV XR^:VE mos@NmOקd˸d/ m/.uu"t쀓@첫ĥgWc!Ua0e$I#]tů!2>ffiļь'uq>Zr;}$&kD& o8~~/ٯǟBC+F~ 8\.y4%Q:^㸏܀>|= dqm\b`Թh@~$*5䦑I3$~S$+v՚)s$fWeBX6iRyc\v \)[f:3 Fo1ݤiYFh1Fk!уazf$d3J HQ0Z5T2jWS Wzo%X/oS5Fz3^h qc8խ.͎1M-LgO;g]8㳟eW ϣkY8d'ڑE+[o;(nE- AD&G:5фyqEͧ*>hW7 : m4Dw|ѧEGb(t =fJ:JBiké_3yU,9<>Au8s`sÉ_n `SupGq&ԍxח˿eN4c>\`PCO߈+>a{0sbOwl4d ؊U*->e3@AOawxHXe_273lm>&'X  t4J 2skH6Ek3*yL-^|( {ٝTy܉LGB^5D&?v=CU.^`M s%镲dJ" "f\}}O:T;$/V%Qkw']t{G>|]C>#\mPN4PF }@JxZх ~>Ic%GFi)H+Ļh>s09Z\?ϱ9iu@`$@/^8k6-F5BU R2]<}`mVt ldz] ߙƼ5z}uFN֕MЖ[.ޓ>{xpz}h)F e@Ӯ'7,"Eo[>MS&#~u`v(氏"ͳZ JL{ P7t[`OKnj)cgY3ѓO@2gg@aK1EvYdg"zH{i'z' snInΠSyy%= zpYg*犩n yŶ 0v5zEL9tfqLdҍe oMGRՌEYFϓFWW YhgҔDh5#df 3V݈x S^s>66ԋnW+5nNNk'%>J狠u4Yv/ݟ41Gp%#Ō>{ At^e){Oұf+ }"A)C%DKӢլt԰6?04vt\q!ำ瞇vm1-1fy4.Pv(xiO+:/x>i<4N g d&@M=;\_u_dL7rq e7~~qy1s'k |8`5w}<&矋 qukO/]~Z(c?4s.*_ )iW^w38q; ]|F89,LLL mn`BMZGeOmgKAN;~EXEJcZK} Dέ@{E*Hn/Ҷ\)]Tod5xhEW6^:Wߕnv=,Uн Й@H%qbÙO“ṳQ̥ w nM rZP,!ݎ[;Xay٣,]fւl^|h0F !Z'ncA uubom,?hYu(f5h2I_/ifMOonǮA۞jK(4V"6QZ70<2+Sc ڔk={G u/iFJA ar9G ,pR.AMZ)hOD/LS@EYxJY8Ky<\Q/n &i,kA>{}r9+Wv:Ùx )SC2Kfd;jG‡]‘2` Kmfh:HdsG%LY8( :;bv~+ &Ͽ2⳸_cp8᧟/> B#Q ڈ(lw9.*{7ɍMf Py J<:G90Z9YsJZG@Ju])'I 66b{A65<4e9!s ܊aA-X6ΧrhtI';܁@PS)NrM}5=IG%ONkc܆sf(6&VVڶ6T)wm-(ȗ=2Teu~,DH S9Wpon)bk#tDqU€?ԙ8kq>0s0CԆ'q%O5d@_O"E8"P͡C?+aawc/bg#c,䰝-n:e{ h*2MfvH^¼k^ɑxgb"ϔfl)rP&%o\k춰@&Q,h<lؿ&@z,XDs'()I~l'NЧ$SЀf:H˃;}߾]= &HzXxi8o| :ƛvuE.6N*F<#G]u .gq}G|Ԉn̢{ޗ{//rHI>BuI_A–~McUߘ?JKS&PN%.>L1nƠr|kzA%zĀI^#д^X;\exog 7}fdQg<'Em-}>zx畃6\QT耳7}%QҀ[Fyzj>[٢CXWw8}>uRiֵCTJ~6}^XYFc@}+'SJ"r!@mS'Œk.O_[cێ^ك9t<lLl96,(3j< 4~l3Wr ׋/9s&1SY}ʤfc#tLfNA¹H''ŷcׄfD?}=bHy^7k.D㴉%#TL#K֎\; ]/RŶR`TĆkjxUki0߆h˵Pxϗϡ-0uL"lY֭AؒM`{%^c6yEwg\Kg^'>~ μʺdz1[.(q;O1,ǖ@ܬ.kCu%d5Dj۪lc۶WA|} }9 &޽`6[lJD6O_\&i&vVZW\W*#-sC|Nc!W[Ȅ|@GNXf]Hߪy+?܀ C-COcӖ?~@gmGSX~RjADze+`R+4~!-U͘`JM/OT?M2'ŖR,b ҙQ^ȾL2ڐgl!adb"%ǖmeL P7l';q1KP'.@f N v%޻".yz7q҅o4opɘsqwѸC2US-˖`aKq}%K%"$&Θސ&k͖m/~mfJ$g2,j2-@&`cfE54@_?{ۻ?|FYN?T~+uxWh=~E 2[)tL(sɡ3J[.:HlnTN+:=zxd&V,,X4)&Yym`61 ݺoMfwQ<.wZy1uB v, ZeyQ  QGa#FگJt7΢v>>a*^qϟpiwp]"~81a,3ǿ ]KO? [# ?pL:h>C EqIE 1:=3e~̸n:@[3: * y BSy7.E"ud)ozcymσۉD.X JrOi_[ j,cS}xkB9,`b&qR9N[;Ue Sv%ۃfSϽrOK;]xvJvʩ8]OW}6T{ǻ(1֬۾q [DZ]p6uʼnW] i,< l!c ?1TdML2gҮkG)H h&!~؄)W|)PJ,a)}7.pֻ ^.:A"qi_jf>;;p%#> f֍j%N˚ j? &̜hc3ϳ]nDyELcZ8)3NgGچiēO?t?mǎ?UX*sڧL6_|-wþ"ɞbɟf)H~vu֛1T3,g>J,[ [#;-Rہ}l|ы&UtV dR"&[c\kt`b+* k32$^Xb6cMoTg&Vw͹ 2Y~f.>ضgp<ΡN;O5gEf2gt`'=E8ahF\bB^{FYUi,_fGͯIib? Oþ'? wAg=46ԧc,oj{-& ^~eaBL<|٤]si0F:qâ#@9IyE:)?ppqXp83O~>.ưDajZ5ea5bǖ|IwD}aa:޳F*am(m ;EawwGgg Tk7c-h#-aX0VlCp5㊏}N͠h!&} Ho}qQ'??U/E<‚0S‘cU]O<_4CWBٯIkӛv"1g~yMfI<7iДO6 ]{fvP~ >C+6 KNxxW\*k +%H:,EC|NN4>TSvxVc1v",'QZw֓Kc9~5Eov$eG?/\,q{ދ Ͽhŝ;p/+/<_|x!عa#:PN(h] o{,kC"HBn<أJbamՅsg!>gy۝H S#UJ7F BTC[z-s(P}|R=?z16>cdG6o>t`|kt&F,=jFKC#G7a-]ssdoͿók^>vLgC+V{5fҹ3l߆o y~lݾUXR ]wC 9|1hڅ)jɝp5̧ kc{r}rCt<ʼnQTJe kJz%,' ּ>FA\D]7._Pk1M@93#х++hG784~CdGԧef$DϲԡvcsrfK/)W϶9rá,DYh8W0(!a#O8^yy$i_qD:OGQG!t㚿$eO?=(; 2m2o_(l rhͩSW%Uv,afdh{/*̚0,=g<ک˖`ؒHmqꉘzaX7DYeJ>3yyq~<"pu'mF Nn< Rq? \7fP#4~7^?k U;[y;WA{$!>%2}E|♈-qѹsQ~7݂֟!=t+'oުWg*"yb~zZ{*@3ټfH HJV[0؎%r:E%""h>0ӱ4]ҧPy;ZK1V*'ikxn!:.qyC屝n>`r, 0.ZO ?}O/;+VB93hK=d Ş>D58L!> ,0DhqS_PK[y A|+:V}'hwP0d6tO6n@7v ha}Շ9 &ұ}ؠTM5mbtz(^UՔ3yåN؂ *S-ū%MEʹ+KVx.=>Q40K#LeE&Ⱥo74w"G}> |ڙ7 amعf-wZ WϝgfS&x024_\G[k:ZMw "@Wq뭷c4\bӶ^<ڇd'~+Z2eK+{W]㛱Q&?ᓟk}Dqȥ3_,9 ;waҷZjMh6-qCǫ+^%y(di)]z}w^̗B4CwG zO]jùf#߀><#%q맟gM{65PFArc Xɳ3`ċ>X~h ,ȺKAtҁ:em2\Bĉ)*ԦPmfh|y*R0}dBAZ~otWJH k'|)BhfM#h^tB<na2Ph{񞈵;6a ;J\+@}{23ԺZib_N E K<0 O&wGt f'-HgtrRb k -ٳ 8M8裐j9vѸz] -g*JYrXj[_@`s= Vse#Kt <(uM6GZƔ ݘ0i*߿ǟ}'ps,y/~~+zznfLp\]A7i ()kzy%y}"C;oR^l? ,<Ĭ6I(UmlϾ|? 45B>?$C lX@;|_񓶭$ -;zQdeD9~8!O? ǟkz?btE =(SN3|E3/aG^щnZ;UIo: *ٴY[Y em?yW H,}-68V.,U,)eٽo<6SZG}@= F)c!9[djc^q| ؿ n[y.RPilL`߯`a^"Y$jJZo!,6/$;+ Ie'}s=vFn@|4X&\'_G~ũ/pz}W^/HQe&4CC8nm՟Ł~),>iÞTϿS;iso[W(2 Zv-:hgk۶k ˜1[(Mh(1y֭F4~dXP6Rt@J":2f#:,hFBwz4zdfwH%iփUlw\%zdoJF no+~sӏC/pws(U Wыhɇx;?-2H4xp S  cN^(5gW6`-#g+Uʈ1c:K.>5k&cŪU5>.y8 qXSG0v!܂m!MC?wkYR϶@[;0𖝘muOlۉqǑ-Žދ/| G-Zg#ljHi\*>,$Pio+A)W(A{$lf#ذmYd1t"zY6:wgp)'[:p5Wg?ǪWW|,{N$Ś-ǘ-i*cmTdb_H $1YC0"XdmHYXZ}Cdɡw_x.gP:?chUk[/AW<dd9<(4Z$~-_?)7f[jʦ:J)"{t{ rD4{F6BY}}}"8S: N76662gD1Ģ3 WC%^"@wq^߄J-h_09>36I<)cNS; GPޱ`o|gqۧ>MMـx{3ƂpwƑPV;qs8h :Ă3O"X^̈Yc XP/q=0oD|`T=mRuqR18&wv:]Nt ڮ87H@ b5v1F?>qÇ1ivMTښP̤p1G!`>mGP(#pK)C#Cظ} ;}K7?pcbWi-&MDsk# ,gssAn9m,m\jx'u<6nd~t+%si4FI[n=G uiun/gG_3 Y^ή> i巾~G Gĉ魬?hAU~㩏]'Li^:spʥ~lfA*xvW!t9l?yAooދ_wͧ--֋VغblZcAlsԩS/@319؊._#m܁a߹G-\N,,RsO=\KwwΝۑm܉=ݸ丳py2"u_h(]MœHĔ B;sKl-`W;,ŘP]3fumK>}TqytQE(tu_^ݾ!<ixzJğbƱ9?l׎(qSޒj6lx!Vlŷ~=CM P,de}3Uv)硿Uv睍?W^fXH\ptfoۂZucִҋ󓟰\8өʈo?zvvmimXK Tu+/+yfMmvN7.nW|s v&x~3 2)$gQ,xU{i 8^u=eHb|=ǒ#ˏ> ,=d1>~{k/fk"W\/|0 At;UI0-n? M 8cP^΁Qذ8 fq4/|W|8UX{opߋO~+k Jx'H[] Q)<.Vo6y?@C}ځIVu+Mc}TjXyN'ZZ`A6N/wopafΪ_y1#KVQΑBA}* Fm>/M?Ε ztC~x9 /O*-}_QizI+ܫk zȫkZ_l4Ch g@ Q7m.:i7rE_nڻ󈧶dnTT>_ 0.uv/8Ϧhx,SeBx9Yc_5Vg#FH܁l?.ټ +zӈ 'УbC{|yKڈmۨh |!]^i 5y1Ťv| .53a?"R2ѝ=LE;ݦ8lL:w{Y{.<];r+oia롡~`cڤXGZ'uq,gę}Đ*08ĥ\NNǿ}_ŲKެߪ(yT¤dW3Xk,.\ӡ6)IϾ]OěRmVpjΪ]mgaZ{Zd Nծ nfL^hVO$/>n ?+?M^/1d)pT/A Y6?o[o-غy@ }-omD5~깍+WRw̄륇bk ZDcghB2fH<==W7DP] &ϝoBܡU_}J _2fm˭uFrq'LfT;Yc63R(teI:[YB.{LSSΜMkW#O%t5WΜ@v0hkVȺ}ɇŔ6KgRhm%h>c:zA1bC `r$×.Bx3+š'E¬Y}ܑ|Z O?L#?!s \8h= "Nmgyd4bHxF#;<_`pt',9>42M `Ƅv̝=ٳGos/ۚQM$QϠJ1邏۾&Ϙ|oKu)#Q;wbðqGK/2ӟ v3OʗYXP<;/dl =_>pyg!:g鏰~*4NŧeG,Eӂ&3N8'oϞz',)9P!/EI KݒغjWd( Yye$l/ hY,b˨XZ:^&͟eE x T33#*;;,c Q`'gBBₗl݁^:{18܏Rurk*egYLTY-OZ"a.ΓBnf.Ih{j>㨲#is$Krs8Hⲻ. d0l(gGS=-F6fTS+ܺ[imAIW%,]8}G#ղ1\]A_O?"\}s$>29Rl -h32mHi}9ww;}Ojk/^فMP=ԇg^}Hj~}'7u߼ /l@K`ξDL{'H`7z>#Xx6uy_܈C"u}y(<̾я}Ͼzc' #Q3C@NU49MbɗB~d:5 /+AުæQ>1mۚB,Į[H2 Y-:O {? N|duˌwvf˔y=݇b .8_W Gd6ГAرxuG dU(z1~Mhv"TyPsT` E7*咙{0}l~91!bD:PK^5X{)%Vuׯ̆| Lji91~"@{ MFYށ=;Iǣ~8lxax#lJq:4#=g{bZb]Ih{SCXpU3o7R{IWpb'wtۋ@FG9@ek͘{ ,=q%VηFE,X]Xv 8Kh۰ǟs.6lIB= s N;3VIOǜV.G&M1kxz׵876y ؿ/|*E&3KwO!D^s$cۥͤɹAJ^7i2DQBɨxefI;qxCZ a<'I漖g%y-1 U` رk7. jA8*3m/x@>G@Z-SbͦNc6;/Ìoyhg'mT?x;rvSo ^/VFUƨ[KF\t4; #oM}doͲ봫0̈K)bؽm+⃽ 0݋l})lz%I`~=F-G/9G>ߍ`O4Τ%INZ"k͆IE.#9p-/݃\_?2T>mx `Pz%Kظ, |{\uvdq*hC,@vɖ:VmA o g> Af6Pu| uMRjYRH \H>,⼷wݳf\灃|6ѿ#[}2f}/ay3OcPZCZ#hl_ jѬ,0j G?fR$%ʘQ9Aulj<6b٨iWdIh7ȴgr#SDwxSxS4jO& 9vawHx&hJ a 7YDa2LK%D-ů  ]f?IsgT 5'&Bl!ѾujJ%f嗵X-#FԌ}fJ:!f8jf9[4HǚK?x:p7S;C MwJI*l}RI&(PHA@t̵ reZSbM UR<T:%;{n*hپ$tZ]3|TV]~4﵆.Qg IEp\32Tf21x9[ dg A2iMF4;kt Ьz}vkW>ijI*jm.dDz45CEmC MjˬTR!IhdQԤ( ȱ?bD?HfC_}+Gs1PO^f){#c) {ϼvt{ed׫~D r5 pT0r$vOG=hݹl)v!E|!X;Y~gi% e~E#A&s~PC&C-jDz_Zz'+Bqe1PSYXē@$[5;֑-PP1 &8%T$}?efi8|)7V< eN;b"3/L7;vH9z~oMɚÃqo";fMt`#ޤB@ީCRi;d?@Y0H,VxP{z<2=V El׆}DuC؊jXը{%d[[Εb"%ޜ?u.d{ưg˨ؼe% ع~v{2}ٺa/`/E4C˷sfrixY2TkWWgX_/?Wv܎o IҽupF5XAܙ$Əו{I?|~pNOT̵}m(6nDs^lpPkÞ;lG{7ZYWcjkS8u3 ;zwO!Oafy>XfzAF3` dHcNoBM/8O!l }lC-mX#Mé~,.0H`]f/H *YR1 |r%~* . yagk ˋbYu*~+9ߒoUᢜV-ǡԈ!1! )?rJl3\վRi{ l#:f?5w5R,Q]\ϰh9[X@rQZ-}G ȗ}ZP8 &KyL5ј0LIg^>F?{F)gȾ"Ìf)fw}fbfhmO`DS$4vXcƶӦf3A*iC75V@BTuR;Sk Lov!W^ L`MP}6CVZFؕꆰoY )VI:VeުLb"̏eB̟Bx$av2NqQ *r4ڽ|Z&g(455Sl[iU>diqfTn]{dV ?WA# E2Μ]#<:R*JmvHoA։i 4S2k9)IO-EUڸYUbZӾTgjs>32mG}B0o2? cu&])2jٓIl`LPa-qֵc꼙7 ѡ btL~vriiQJA>:"B4z Yfϰ; 7h0 cLs3v#5hk6b"5|v'QG"/vʗ%HdxJtŧ9V;_74 JV`8P4t"<`\kϓ,xHX{ӘQuv7{HKQ)b?qPWuZ"yhH7ܚdhrLT8 <(x9 N(;r"B|"= MD փ?VMٽz#'e( #U. Π!H-J^xj8_ T ` ˗؀?!dd:;;q%wvlKu@m-W\{ǣB~EbJF)'ƷڳkVu[~ÚE'n*9iAO'iņ/Q31KO1)A"{|`Ahͥ)Sx,tK#Q*䭖ykNZ|\3L:LQZ8^*j}flρ{FS>A~]6W?}kN܎X,yx&)hƚ2Cj)e1;3"gdG#yZ&;u}cUk1˱8DmP<&Oa~Irʋx˅խ-'#'٭ 2/ɓ.z&',kee4QF˝(uO30bh'N43ktSf虬>6UM=W|Ê7Zy(W(dSIKy3cl<@Z%ˡ9JKkĪ̎R*|HQz}_U*xݣjeJ@DeuA 1 ȼ)5G dmX$0EHN[шC8G/#Df%!Scf[!ҵCna aj{ l5yjjhREN2HG0#1uc!#cNg{1MIc욶@CyMSʔQN)\-[}mDdoM7X"/7W~䌂Ȑg l}XGFx /&_J o՜`ѝU׺:v~eG("S^k*"M?dB6xi@@o蟿)|k:KIPju ԨGXZ߳y ߷,c' L7++dm;[}˼#uzN;|~BO."A&ׅno(}P&.S&$5#,`jUhgz4C= ;3?ܚ "&̘6Ja?bt:>o5HRlXa]Z17WJ Th (f#z MpHC1Y W4k/B)Eky#-֒.k֐6&x~ly$ 2WNf&=w|ȻYOGhDavDba F ]|*d)5[k{Ic([> x?04BCCu!qˇu^_{u$M;)$GӉx#rsA& )qyPiSUSTex:BI?#e9vkkֱ q.8 lO}`tP@}'OƄ'f:cSHGr7J3GI=[ p] q/C'IOD ph#ȥJ}֤$ՌNi}X 6]*T/6+Q~nOrLo䗕+c=r37q$LLF]p䷋߱jmwv])TTW6&|=Ԗ}vv 4r*~L2ʖ"#)2hfutzHY4jj1QF%U]Y~ksMrRtT#dLє*Owg<31;VqSQBúdA{Rq/X>1/ WK1এۍ%ޯPo2P5L[cɛ&} 2*;5"h|.A6Aߥ`}H+a֟d8roGV;}qwH;&]RWk'Ywn/GIIDATbn%+#+ @U1Lq$\0}*zv5& 3!M9\,a8wѡ928?+)7zG03w┿ 7{| UR@sοxb5x>8hA0ڵ7}A ;X%H- ݜ,jK͔F3?挲eoKej* "C$PBp(1Lquw`[A4jd^#zkl6X퓾 ~z*?yb ήCMP9S?^Kct'S)93ˍ1-G]<7eȡ>)8i6T?BZoo.>)7+_5[Fߓ7|94FМ:4/=8(%-"4׀Y|M)Z)hț lu3yĐY DS +)17'|`OAb&ϊ2 EO}EE +֬+*^z3Kl䞇dj δif CZ$`&}YӵWIR}FQЬ6[&Z2mdʣo*3Kī{֌ˑE#f0|zJg֗1mN6,L`jiYR\.|.i]ۥ}"%v-X$S GJ1.LuI6hzYľ$'"eގc Gf3zef 5uxק?}ûK3d[19\G/CH%|J*mJyC^k&9u<}FߧWޞۦNNT7.+iDk#oѱ[ˡ}/izf L k@.ŵr^пʛ^oߩm:qMoӫWg8X˟tfkahZ紶#f%7r3i[};r6i3WD%f \ DD!'O@a6GjQ@s"9v#"0Rؑ\AJۤ>F|AG)nϕoPiy+> y_E^s$$3 >O S'(R̿|)5Siy!mʣZaJq6fFU|k$oʷUf,WfXG{.1;yV9 ᪟4{iןi/^'Y$C]ɧG\9s) 2 &϶W9fu򩜥.pY UH&8]!˟!fR)NP#In0rsy28%+.%ьn$P,p:R|rѕ͠y ZG b`5Ĕ |wm~&Dª cULlqggӗ.Ե';4kI,&Mb9K(1f]}Y{&He39IJ8? _߉gX|8)z- _F\?pzOeٴ(e"2h 0ļQ8Grfe)o\^˩Nm~iQNut^ߩnF׺w -Hś[ѳ Vk7L_ҩ"u>g-78Ujv`K<[Fi,* }zDy]~f\Rb~ Z>A̜LpћQq b{nĘ3){( E gp"h>4DћL M91oj ]s) ,̩_'@Dyp18Xv r%tu!6xHpȇP\*-qVuh{H+͇pXaaCW>by=shaQ[җmWvBT wUN'ѐKi2>W:*o*]e r7Qg 0۩ *.>YwRQtT.q204 }"|pݪ=7mm[b"B4}Kl}Kf,WU&vIME҉Za7=oyG1p{zG^vry(KU)uTY_eHͥ}7;̅-KXD@ Zc[!<*s^ 'nFc[ގSJ%ja"W. )'H3>aq;PqaUVWm->/z4s9K6C%3"3}xLQoU_swoՑXg+)#)Y[2SfaosœS0ѱߚΪQ%g-HGTp옱fI1淌ka 8͈q܊seF9ldy=9]C'LA /[p"!+:$Sd!PowY^YqJSN3Y^XTW=J'!2A ^}p^׊s}Q\ݏ3T=),c=g@u v4les{^ݳ~2l穇;dy]'~<^@v8TQ_i/гu/֋-=;y/ {ۄ)N2ݍ~q3|Ĝc;B"FP6}#pE` NU#l;ьf8mcQp>3J{M͔2N_-y )W@oG^{T .)U2IP pAk-*V}stC5jye&C+]o?T'\Վՠ H kf?EڴjIZ4~e6ԵOx1"sUݷ8YeX8;٩Y)7lqO%TWx!~`OqRi4`6ę4yѸ?ˏA0C'y3/oD=z-|'KtLr7 ~dm]cl).r,׳ws::̽,x_[>3w^H|Je (giCKӵҐ/gygo/Q/ ;܇^XaWOƄ/Y4p --,pP'?%3ZRqeؼw7 =!30qcqG߃vu7`ن{GvVT]Sm,PPM>Bz1G>gYvD964ZF&0jIdxR)=k%T9]0FqU[oCP+e[LXF\Ճnftgayy-]Iw]x<w"{#|o>~e|냈Ĺ0Kg~x'ډ}6#<x KęjFOŁo} ?w0efa9 aqqۯQ3Bhśuv[j7dDÇ) zbgێ%}%@Y8oU[FihO%C#զ/9-҄WoNiʉ=i&CL zkf"ZRĜ_R [& G{g)SZƤZzļJ?r%5f{T'S(O[9ˤEefQN4U '%Y}q$"U-2Mi^Iiy=`p.^a[Om>{mwq*B-Lią7h2fY6%:$Lxf3aɤrzy*7޻mm&,bHQʸˎn}.[ujG?a]O䧁&D=qW]ǧ>id}w܉m,Xk-29xKN=訤Hl&\Y! #P̈́7g7.,9bq|N@iZQ\F(f}a>W}g\)@&a_Kw1-,.5:<X[+Ɩrq?-6; ͿdXIWzNLeClc0OS;#ul.vzPDu2Ե"h7f#t.@J;eANR1fn7>P#de5O3N;l lJaaׅ<3/cmp P̕EC[i?s)Ä$5Ye{!lg/6鹜-mlOύP'*ֆpBЊS(W:6y :2\)_$+TR2iH+t9,-9ST'OYuZhc՗58Ȥ/3TiݗV'TL P(fL~ `QVdj_kч®_&1CeUk:+ oPX,*V{XA υ+^ c mBS2!A> 3׮A=;1at' Wn p<_"N<<)?AѺg`_<zf+HleM0F|f}߁]W}cj|DncC W\-'Psk 574G;2YN&6$jCg4 `D'~b⏤wуuԟ}C-$*lk1b]%`U&}WtR W?Ě~FmAy9iGލ1+9ҰMk6NKo 5gH:/2:Fo~l>uPҏo=&㨼5H%n'њ=\,^gѯli~~,i䨑V8sELAqlt+V7G~WţeX"ڿD>m1{P3%EqoPl :|9; \MS' 8[~}x~ 8@ߏ >ÈK?qD:= B/%7'1͈wKqWܑ+79wO>fʇiNieIHnP}8DJ#_+,ʗ"CN}z;7VEZ.~C*/%*axuq˱kn V/Z '?#wދ3O>s9B> 'KGpS< FS.Yfu_K Sc}7P3#:Ɯ?۩O˦y0/9w:XF7RGG lpK4'zF?{h'J·VPb;R uCb;k62,:e 56~FN}ʦ3hnn6X]슯e$~OLCCCHR֜N}}=ƌc"۷oiiA&13mN:J}1)nkyj$W$qi KϧU+i MⵋvwЛM3x䕤1:) "HTdMw~3-C  "Z y ۂůzeȋN-eXa^5CFu?&4 k!iLߥ|QZcJWGFo 5zKub(W*m|{eW<~.jb*,T T_.֏6ӿ_3oUIjW݌,6Ӯ6MD SV oLȵuO'd" kэPpv^e7zfh׍)fTh?7uPixXwHH8mB!?#$aR]z~! nA9 ފY'̵'s0ݬVTv8w1yT}N fp}L}BrKa;OpOLǯ]D݁d+O\_"L/ c"K,iYYgt!ÌȬU._e!.ԭsouߩr_9ry)@k?cеUh}c8C9=Jnv66J Hcw[y1qKWI^#n_u6ˍNEZ"'$qZޢWC)aRzF{UF}3^JSY|]g+eYTʡۺFί-ޑ7yuߤ=&f@=lxⵝW50>#S̘=-]7`+ P=%g W#L ӊZ %Xw/|?ŤxL!AիWccpK_+cLA ljئF*F^/[ G{/}煟)s#0Y0@}>!8B~>֏ߤ<9y7 ;~z7u Lm~k'<{GB淍5LlAwT7%g=ʿ0xp8_i)IޔM`>Ƶ{#i>+o_^T>=7\y ~|r>x/yx_y7syQ=,oճ&mykic*ov@ܔLQ"tzFf 7o iOEu3jN^KXז,f~ny~ ,DnuE{{QwIx;/o zqy?e:x'=w6"}fSUF(M6xX Jk%cf & 3*mB ( g2TEAXٱN48FT|@E2f-* ~Q-gbЮS"[.Q0X$b*oOQWS|`N%*2Ff#$j֥ xLVϲHH[b5#(kF`L=9{?:/Qi.SyHFhada2Bk]>V u urs*S:MB Mww]eϧy}I|F)I<F\[(FLI! oQESC2ԣc @tX"ªQ=)~O5H^#1 #H`71a9d x=S$PUD 2@Fa2iJɊ$DB7rdCgn^Yp4m≧DmxYga9{0.=øsïv5k/#n܊:JͰ-+isƆC{O0MS<Oʫމ933N<xetbGpg>Xq3M뿰r{66nG1?W^Nt؋y--رc&Ns>a!|ѺZ| qm%M y I)7t1OLr#P&SЦw)ez6֫kpĂa $b",hŏjGs2 I텉Eyz͖ $M?K_y뢆>]A8~P@54wT4! V@/>:]JfLXd8zb(U !HCoMeijECms0٩}>-`*񉏡e͓NԦ:B3Gףe_#%XrBCOX'Qs]bbM3"@͌q DZN3SFh/?ڃd!A<6=2+y|֦iH^@}bŗ?_~KhsԋO|_(E&̟wN ,jN/"K?/ \uvwc*8B̕I[Yy9"zO}`F["c")Fm~u3!giq ɣҕ"RI97|6Fʟh's2N2^ZF]FBUPrC+gjq$*[a/u'a5ך۩_ĚoA̘= fLBS42FM*/!=*) B 4(!Çt[x"R$%I3 Eˏ$$/t_,Rɴl|MyoW=IӚ)3<8S2*?ϛI P,`faCm鑒=jLo R[JoD}V"Zƌf%  5b'L ^'~BBՌl3+VV-3K~ PY 5!!LKJy)m!nN"@,AQ娜j,U@r"@C4˨eUS_@ `hvђP i2 υ"#φHsDH Lɬ(Tr`dᎅ0K#P6өt3u<d@ ġ0x:<˧)غ'#դ f )ա$ں!$/c.S&/ZIA_ri>q(Ph2 T/A]?LR.Ju ۍHtU.9Hpdbjooh:\`C%#VWgǯza }5T];bNIF b<4Y{xdK0at>:c2#c1a$<|X|%Mg8 ӬEHh+@&+Vg|N; ;w*M]d |vL3.X8{-}Fj^-QC#Kd᳟涑OE >LX5+/{n8uh[=g`u&lԴpk-UYZyC:Ųk} ژ {sWF{)lZ" g?nG`P\@hOU)bD"xqe`Wpǝ͒s'];"T>yM 'S=N3EԵ'c-=wj5Ǽ%хYg"=8W^z2( >`Kypne"A~l ~o4 ߬UnU2H^LNThe(haZZ,S~3Os>  O*aB8a}5HyNVS ˢJ|"cK(Y.Q/2|`G;*TN] %q_i (7M?꠆\y#MjBpڰYy ]M=?1^ M5DZo}ݨ%}YSL*rM<ºlW"'#x *,,4~a[SbM70URfb)y2-˶Ϋ<abPC-ls_3S1+dU7eeX `=6 ^0\*`)k߈V5ݛ{B%̟>sxle-} /}2/C -CMvҧ'MBiJ^,KmTzk"15]_GKW4;BHd(R|b,qOd̜s < _7o)J&Bj; $:}Ɓfvkhz5qtQ^=N=őӷޑܑҴCXYs\y% 5FسgLeMǠ3k|l P@T/S; (S^,^`qFT&(OVs(%S4 ےZ UhuO7CTǑEP:E&icv6}SS<\Tsevr֘i^!@A|LKSZ! Y{U o2 mJ";kFPTH8A/kI&0k]@*X,aR0m~udCn?|T'5MK5UĤ0Xr IMeT2Y X(I>KPe -Y'~4Qձ">/l%"j Eࠐ!Ȉ402:`]Ը|ab qb[NF269Dx]ôʲ*gD p EjI̲.?e<uja@y,ˋ˨YLe֙uOlSF/oU@iGYkm8BUЖq4d5rgH:֍vHcdpc݇0كt ˜B۞}1~3m9CVl?2u'\Ϻ$:1ڍd{`h_;}(~J>򯱡0ۨ$R^PumacшYت)L 2{IV_hJO pZW_YeS434b 9R^  >[4Yx\Rԏ˖`udEJ㲅p`.**A}䡗L=pmLDw2=hGWT:DxHSai>*12wu ߙ5mux'ʕ(ɲFd٫ ݌\)<,W齬wKfO/'Lcy ;G&_Oe*3ul'?eN Q.εni/Da(۲{)CAD(<{b:jz2jOq  jφ2eG4kAb-ivRYS?J;LA.T&b0']W<b/L h|AFE_C&,oƈm"0qP搜"\*Aցð؞bZ*@#<)bFޫ ͒g޷uva*^xO7(d ř Q*ըt4 T^3 4M0SUp`:y`h`L׬@i+Ԧ7 d#=N>tMC5dž[I݌f=j0Tyǭ@mƦ0;|k$mXFu1ßf صMzAXu%O`iVzȫJr|ajVV[z֌ ytCw-3B]O2$+}}O(]a]G}_+Wy}[ɛkOu"zfg/l -Q`E/elt2 'eאF_0i$5gh駟6f72깼*.(tmcptrnb1=wӵ ;:m[luU}+xtP#ȊD40.j/8"h ۆ?3ӱm;6SJ'wYgJ2m " m6a%"jp`G}' WO$0Ac,{*Yd)53 HQhjF_?͎Tb` D~V (* /[+~` 2fk,x@U)RQkN ATD*aHK֔N)16Y[I,8N1E>ckxDlE3%6h^>e2AL.M@6bf$+BQY4B"+~J*GuA`dۗ:epӔ`2iڱQYR}Qkd'ϺLpwS Q9LZQTbN@.1ʠ.J>rNR6M4/[}H1 7UZG9 P24T!}E,[s֍M3nD[=d'=Hk>=TyҔYP3n,m،* djlDz'G8})bhנ# kY *4$ay=$L@@I aGjV-~B T5#WVY5CY7IW Nhl`fjf}hfØ|O"4P(d<5vՋf^sS#e"f^Y'%( QުntL֥Y2ޚ9#YC/l̬ͤpIf|k)4$Fjgi$} 0lGxXr |fɋrdN.;6L!I%3/{na3)` D3o>^cr2y j+~u2}ʬ[>(CWDt Cҗ$jv!Rkă4Q*$_cu38@ΩaJx9%H(#j>  h5.-;1f_xIL8nR}=x7A卨t3 vu'h~VԖH5z͌ (~u?g.RN/_k!8XOnؘ46cҌYf f SVqW`q+1yqpb{  yoU磯YmC?'bkPo)cI|[x=i]p;Bg~|~Gi{&; )cpO_/"-G a+͔_If/ff6k 72hV pms>aظq*ilQ:Q(#gj63u}-~zlݺi41edHy'F3vXcQ4GeD/V ۞#$e^0X0yY˚%6EfLjy~JW^EH̾j‚U陙x,#87WUHJWNjxfLZ%k~jMPhOyNIPuvwQ1ÑjTS)/)m tIP@҇:W! "hTn}n$w_:GEPnm!T~r )sH%T(B츻;aGJ_f0Ye|Ν*1%ZRY70LL]uJzh @6#Myў['-d`!E#щO7H~DDLrzРwȸT,JfTgÉyV~!i*"yJ !xň?]GQNݓ^"y-/Y>*e{,:s4:3I]eQ"tGK鯽0JxMYx#P1dژ1L)|Z<;MELD)]w(wBƈ 庌#9:A BIb3)O[+3˄QBe II–V1ыNmL)G_Aoq.97QV)*_bySys)HHsYl@,x[&wܕ!A:tl -(Op| &%~Ā“Z%t %LlSWJ5& :S:"s`bSӛ"ەxIxN3ʤÒ|.oNk!;#=  VuߪZ4|%I"հ%=l 3)P\;%{ej'&Dgp 'P#oF~=|o~/nGs/ku!ʏ+}0 h@]ÕʗjN+î@ZO2y>Sy"JC)oS[`l 8dџ ux> Ys]óg͝?ogMA=gww6}O^*MzOzLCIzn{=;JcxsN.o⽑WyFk^bDN4'W%ɟR֯J^>+}fq%vH%Kqeϐ"c,>hEeqsŦML:a*+ږo/gpd=D^[M%P4:tdLbl.1ݒZŅNʛ,8ڜL j 7rGGfvLOX$kJ=BzX U3 0Ԓ%H1!% ^vkł D<0 2n>Fн-p 4S@u*Qu=F\0\A.sوqc{2NN #:a,$>*).}8F³!=Z[0ꩀ)O;x 5C632l̋c'&Qa#@w& )wf p^C2|H,NֱΦ3P$jF@dI8u2 8z3)rC#5|ÓuD69Q!0ٟDu҄b$.^G߀({CvO0P|ZfLE^Ycp .*lOˬ(l X_LaܢpXMbZO#=^9}QAE{n3HG#DA3E-89&R4-zFj 8|2w,6ڟytXWѩ7%dQKddR6q<j\!ʛ6N}%ؗ5zG7GݟύGQnV^+ϷlM4AB5P-Y$U)JD!e<<Gy<4`KّKglQK)]cH~lxrpf :LPa~) 4(  ^"/x?yy) C3}_D 1hoײdSz.9a6%\)B9D H2߱qc,TxEL \ EL;hFNelDAƐ 4_dΥ8:њT"րda82eo} )/NѮ}kB xXw|ĚEa'ֵX´:r)T!cJY?fͰmX4e@.LG]2jHM+Ǔ&#l z@;Lcʟ+#n ) 2$R2rh|c%vr6Ԙ|ȇi&FF^Κzq$-5i,a#9'.tV HD^ Ra4$0q<ĚaOo'M8,w:١d C/o#mk@QI9ՒAv?寞զ`rvn&gxZT-ADTz.߯zfZ =\)_c'QӊYGx&f#w&:*فn\Uy%Y/o>MRb= i v2H.'/2zfWOʌʐeמP.xzɤSPL4C8ľZ,boH=щntn{N.{Ys`Zz,k[Y7 ]{Vvo{z_}y{J_~'Bųs-<3]+6B3Ⱦ+${ԍf5R˝4U ek- `ChBUf(DVv+~HEX:O9g K^NF"Ekjl2+nCas'u,e@S̈́ ,[dЊ#&fG5 Vk5d Mmߺ,}Q|MBțK{oCB%fYHHUjQS;ф({SdʃS/+s#\92E*מ]8i<9LCkX+px,=Hٰ:,]u:Μ=Šw(&ǪVaw*;yЏr}j 27\ȤBVPqκ*OlN2e{JS^2AР~vvY;56)Q ˒o ' Z^ ~IS,@ xPΖ0t{D%ACzCȦse#-yx:T|C&jb< 'zЗL:bw4(_e5r P hJ2 hbwY]?:jB:;O92ЅKshJ `o4GWe=ҧ'ڴ)1GS.}z{䆆 }ȏ%˖S{lGD%V2"XE c.Tw8>0enV˺S㏧Ncۓ] I^jI2hTVD9T̔Mbꌙ,qN2+BEg/}2*w1_>q8gC$1ǜ|"&̜Ӯǜq=Ǯ>֮&ߵ]ƈR <Ǔ*= -7]ɳfЖ=(r,҂ ,S f͞ކgc֬sNGeQ%CEoOC'_,9f%6܋i0ۢU 1{"!ڵ}i9xy;01e nÖ眍 C26mߊ$i?U>vDmKc  D{G͓'M誓R[Gʞ@ime_Se6 lҧh?ҙ@u[*3kc02ēgKgtF-]3q󻊯Ŧ+ ^Cu_X?ΓʘSzC3AfsSy'0c} &ѷ>6PǒOeٓ#/l,%;U|9KZMzmVot%Pylv1H03Uh j kKN=tHQF<>k{hyYfQI p+`MH≣/e:3)'а`.M<{o _|ƣ>{o nz3K3hfLE߬02>23XA!vN'̡PKC*{fi"ltB!fNGQ Nx|)DӪg[z|= ` +medWH*7 !2X"|zEfE,fLqDNJgU2Șclt vd[ъ Vl#/1+z{!ϟ9siIԋʌF%ݻ|@~A@^i<~@gDS;k͜=֢4$ Z9-gwXl=6>IuZ?9l L2F@{oGӉD05ҨxǍ_2.1[Aqػqֿ g~c7! cH!x~Nh0V߈)gc3Ӫ}[oI֭H3t)z\cǠa|U~r>p./~q0sN&I3p'>˿Y̸vnO=8X ~Q41R۝EtXq87|_NV:'pܻAn88e^'?HL.ai9tv6HFmP_ )SRSqa@8{"p;(K"Kb\ PJӜeuc W@g2U]84r>HOn>.< c.ÙUS04uu%W.C3ÉOFs,L̜lc=m[ӨYu'-SI>sN<պZ%l $({q,xֆOoKyqy(ׅ {`۶@m5TLm+? [>0-+`}wLf(oybi[[zFu-kųUȟB1Tvy))‰r+/9w.HR 3514;ϒn҂#BnIq~C}Mi4DGC>xT©wi!#A3ӼZ[wj#m IRʺ"N/WL:IKk5|RAB-A[Gx3:⁀4LRaFsܬ+_4tz8І.Ͼ6&o iL!&hP_HaTg'߯b,PLu,a1]WڊgEoϕgFN1y=t9`5\5<24M OJnMzvi#xyeQ_whD2Feqfطoy&[͛M,:S1˅d֦ZJ*DTKnt؅֩ORjRz̟1wJbFpNV.FFjF~F~L\Y_?hvT.׍ljb)PB-ǜq)?}~: jع}N=1f 'XsX;6+B{nutۏ~r*h BR9drغ[QaGϔɈjѹ2 ֬-?0V=:{ɥM+t}ϺP#N!$-Łh큟+E4 gch͛0k 6hcE޻c?s~E?D+o6ms/I1i2<80st~o v==g"MژF&4qybθ:uOC<Ʊ,,wǴ9^L: !GS{oO>I L[ش u($"p>6?n݅&Kdz?>^xyRQB믃71~(kZ*m)4i0hSª'ў[Nؗ4ϑi#b.) Zm_^SVIsMUV;s.S&?>S D0uL9#3Y]ԓMcSɘQB2zh02|;n;w4BOW{] -~χ(-f㹭2SmGtf bѲe:؆C8LS{Xy+O:mƂ0{u}K^ N94,[Yʨt K.<ɔ/ox=]]XzY8x`&̙gP1K.v tmށmȥrN9865ްQaz:v۰`Jly%46axd_ĵut܅dWL!b e8Q=VPwُv~'ypBt؃P-6nنsهSė4NGg H< ?{>a%N~5Xw0+3k[[qF/IP?uQf&9*WRqEͤqh6_ƣ vNM297׉R)a,P5Pa %awLlf&h$Jɲl u܋|%%ڿeA#f7JOyh=p1 =$Ƴ56/ӊ>5!AWt@: Y_5[E';duƝ2̧g2hUWU\8Wtdpar4DuO\A˚Cx6^*=r'կSf2;gI,eF6vHkaeL}Iׇl˒2 L4SF-uиQ`=:ִ2M5W^T-;館B6ޕ`|{z(4l:Q'-^۶_-F؈SN8{Fv3}u+vC[@=+/V(qM)OqˎE~(no`HFCeFSb5m~%~Wrb`I 6bR %qhL#1M7ZA+֠vdQ =W7u# ?v 3Q>2WIqa=L~|LXX;EPL/AۋX(%mb(I2ҁ.@xby&H"~φIzvHHFOYw'J#ך(.iyc3٣6Y5Yd+Vs80S=f̑{\GC߃ǟh[?> &} =uťXx2 i4OL 㒫¾M}; :6ځwiX\p?k*NÔcؽa5e2d@t?pۯ:եqHŢvzG;~~gթ@H$4C1ʐ/_S[K#Ɗ;bRL8cgŔq0wL97_䗘5i? ywX8sW\tMFyejw\Ɏ*X]K(s{ޏc~D' ` HQAؼ}/`#'S{/V0K#_ZrTNNX2Y0e9MGys~w=oX |&a#>s*`bw!o )Pf #LʦMep֩p+@$l61/~}8O>8 * o d{#EZ'? O<)ӱe6=3a)s\nmpC` zڻ&ݏ<~ ?'cGcѻ7خ_7߆=S+ߍȊ~p}F|<7^//؜̧AGf7"pt #ڍZsltOl0K}tR>uCk;fXzށ.35sbw\u-ZMwI<yb*b oQEkoTaϤH k֑DC:HU?>DYC< &x8D:{@3A7i;0KEHCZ&LF;u|؏bT5EFøFtkomԬH(}pV:*ylke"n9q{o43'f?=mvdYM`/쟢ԁT;WdyKtg3hyTPZKoΛGJs?;._~~=Z{]7O"F%%:`f20ۇ9y_qdB)&7x#.]j->c5 }'馛pE/2;^G{(Wlۉ./#GT:.\4#NV,)(i}H9(A۪{>LمהU90R{ptLb}PPT$ˉ, feDaï~sBہfcȂit`h`cPW3G}̟3'~&fN@\߀O`MA^_t3Ln_W넍AgQa}<MTcmIp%XlEK{tw)#LṬHf6mLd atְNZmCe8i*\{q$A[ucP9xO?O& {2+"! vpt+iSqW``N$0~s?=bi vnނ{n/<o܄z (Ovړ1 GǁذxY`ǍK`fwuC͈{GsC9K]Nuahw{ήeQ֜Cբp ."Kb1/<=xyJ퍵uFꐀ/cr,_44WKd0~x{kL6\~0 *'[mKԦ6}-P)~+m9۷o7t0qDTK:4emFS[ed,P2h2kn1+v;r«8 -eׇ2_uާo8g%nr2fl7CfsV)~ C*M j|(B3k/Gʰ e6 C(L yjI,XL6\:1~)̟7vx(R>=O*A6`X'cbr%qw9L | |e}𲠚0vtjEZbݫ) Ԣم->g0mmR8{W /m L+L@ׁ}ha21Mh߽/o`ik8оRE5W\O>JtAys^QC՚balFd8Զ4a,,v#^c6B={yp?4J'L$<̳#eO[_| Ō{&A׌&mDU%"Fm" Tv8l$$t &Wyj93qGcՒeAގC>=q'`K4W] lX"͝|colw.?,m1T^ـX;qɸP%Mf!*tuٳ+,)1жw7V{;aҋg>Qa߿c4le&M~ߴǏTb6GMcwv?Өg}R'iub%#?TThOʮ=x{ǰ3'Ǵ pw]qci Iy9g믂Qƺ_ ͍u8S̟To m{vae0/ą8O7i˵h!Iyү.GTL&ǯB EK|?/r Ά |A/J,cjϧXK&ڲMB#CMm #d_[OAOAY4cb]`ͪdI,؋Ԇ/~1aL3 &ϝXʗl!=pz*p)@%b]q<8>b2Tnk/2BK*@I+Ci,{ yv6e^2 ot2= fɁ~W?x\z n~׸nj@낳&h|(']H6ˍArNu (<8'e[RW[s[Ѻm %>L9oerqh4 gOW]"矏?Q8Xw W-/[AicI_ǣPkʳA`\ }oq?LƱ泟AuWcTuW8-@)/$_9+qMCIW8z8H^/|IPqiH|dl PR S*݂us:!_ȓOG?RLE:Jaesi)95O~%V ՖCqD ul=N!]M m kDdъ {/]e[ZmgTD6oxWh2SZJ_퓨@(aQD5G4J`XxY7(3yvL> XL)oL-[5"2sl7+jy3f=f=j,/ÍyZ2DP B;VXx+abC=0މqT50e۾ea֮Y5+V ށ|Va)d;Y'0sXE}(QPNjIc{Vd5#Ha_81`dz/)Sc$1ц,AYq'1p* WA߳8,[Td<fm~eR)d9dYfDžq0LsMË-CX~IxgE t,=Ё}Opp7q"lz2]l'_tƍj#diSaj,x/;0`jdR:_g$GonLmtw`ڸq۾X:ru{K'zG* ^(Rإ {%@H}pk,pKe;FMK*56uG}8Jia@{kAFvZACQK~v1zQ?IQרYkZ,EP}FyGn{n${PulNJ`/([@NjJ͛l8eX[x{ii~xl\Οob8QiY.:*(,Ym 6fBK/v:[j0zu7%oޏ"e "Hqbzm* _1]u%HF4엿=6}`zcMMkZM=)κ }cF8v:TmQo#AUm)̜;'y:ف[~;%çMlj Pnx ̙0v%ucx:eu,^*bx\Kf%Iyݴ-1z!7_HӐ0 ]nfGGs܄XzLٲכ̙509kyU˺f;J]ƏfYFpQonG{6- ccA~ZAz; {+k(:k`hMΆF{X|p ;n565YdޥFg?2} Լ}m5 9d@iaQ  "?m};֨4PD#=>NDz(О #Ħvϡ~<$Sv98PV{#^xЦk, Cg/ǛϽBVoFw9kOcӆ-,w!}ާc3OFʕ?µK{Ŗf$Oh9qd6b+y*\.ǦϔfvӤ>r>%rO*D6aiHU I|х54`ى0JOAWz(SXGk^ټ9a"R-+L)\]WWgH1#~,6d=HuQVX]u]FM5d5 B4ɳiZ53$}^9Ań5NsvlX6_dۊUh[AV\ ة(qcQn-2QҶE#N dCe{rh (ɡ Skogh91y -ؤ4-GPi=Wmڌkʓ`t@}g! XOeijB ^˗"J& IeЀSVΌDbRvt]TK/Fԁ$u㏠ GN$GqXGOgXdپ^wt" 4|,lmX[ $_8z(:7m_GuV>!yF8zM˩6,Z4 ;hپ!& @K'sΥ 0nZ,~iķl1NlY y*lS+6l1Now{V$ZxA ZX Xs~>/E>Du WbӯX2+o)3nGKWl& ز~=R<㠜1K4&YdehJ'2  :Ux{XO T0 Jt2Īw%;1`=( E V<@5빔kl|ojFm`q rlE_GۺMp[l] )*aFl،&j:e )'mU>OCFc8Xh<ńsZ@1#ކuo/Q_؃Q{e;=HlBQc}f͚5F_I>|Cԧ' f1-:jQp h婃~L}6Snن(x9qRO@|Ӽ~Y_կQGww\hn؄Hmއ7z/ ї[;(~mCY$MA:ڥPݞ2Nk*܎V▮F475`ɖnL: ,Fǂ^ R4cx*Ezx@ ĈYdFx)SFXeS- W}+yytsD6!*a3 տxrqT#V ^UO=h݌F -KpOm-(vlmgAǍ6b%?JzutY(yb2iaF>g mF%ظl |4Rw3m.C5h]yKfM'{%-Q as{FYh~wfݨ_WdnD;f>D9 >(3zvGtŔkF8jH5L A{1a.]+NXGǢo[`5)l;m}ńeE3|8)S4R# 6S{1Qa͘d}V_#O8 ͫW7^}}CVLwJOc?dvv]O[lq 1ӟ0§*;g}c9 C[nN7kP/NJl'j7M9EUGM eiXdig_SʡmMyyQ;󗡖2 $hg̝0ir\{ݔ,/MQo"~)fsn5 / '_jm+/BQ3)CiRvPRRr!4[kiW<+XkYf:ր֞$y!<#ST|' GLFTѳy'h{K(Θg *p+?"i3h*U@NUZWLO ErҊE)Ȳ|Vf:|OE @2ͱѰXݧ)Ro<[" *DQcLJV_1?cæc֬& 嵨-ش| @ʁ`q*4]gahY)XFWc "qF4_a$`ߏk!  $9x6nF [ϫ(/7é7`/p١'E[ q.獃ZYVdxGT˖cܐAx. o2wkR Ԣ8Fw u+#'AD3Xk|pti1|!͝ `Ro܀ڍ]gPFRB,.]"Ðx j> #t%X6 Pm/*XFl$Bؖ% D0۲v=* [wYyT1fHAA3u^d1>$!` mQRB[g [Ë-U55b=aRmfw@؀f9"T`CK*PFp/bN X%YOܴcl P}# A (aƐhYض#lN )vȐQf=ë*͜PE\4L4D]ZrR@K>Rzr]K˕Z=KI 34&=m4TӒagKrQ@%2T.s0Qj`IC׭(yRnN]fMr<֮qOk@[z}M v౑,SH:^|i<957kZRhcsU(i͔z0W FgSibTSG/AyBTRp/*7@E,k0 rm @8뇳 2,-C"? oU4w .[I=:Dyj>xpuFQa;?G3TJPN~2s(J<N,Zb(Ύ9OeIMli*ޚLSKPG-Ķ(F)ecԃn E݂';RXʳmR6*Z_DdKʈ[΋>ؽ^`-"nlDYZk4vtbde%Z6o0bؖ7P8'QwOv.E{]/} QCe՛>[^:sV> (xZ׬L䴍2RAvُ*jUtm-Ն$28~Dzg׶Xh12cFZC'hxBZFo(A6e2RĠibyi5qLD)'@쟷ފZ|Օxp^vSw<Ў[sٕWgW]^{yfֵ0x}g7 q'ч5kiSP*[ͦ̚btM׎Q4aR,="HYGN#)"1&- 4RADS}](|uKYDٺlϱw_Wh<剗:44CMP؁,}mPcݯZL_iMU#U7]Pхĺ)Plf$i\ .іsr4Gydi䂶Nz f1 Qsl` hf;=(Pӈ{H3H9RNFRG{d;@s*$ 3J`м0 "*?;ҝM{A+vgTGCcW@uYT֞'U^W2M0wvExoI9Ye鈙ng뀯 (/&Ru].+\'ADab"<|CmC&guö/qgw')'KEG.bk٧.31Ԕk.3Na!^d f#/ӝl 2qA-AKbea/Q3/,:zh(׍r's)xo'$Ǿt IVE8H#v]Bt~Q?A`+DDԍT+_%T K]H >'EKҒԦ"-LloP`hOH"xwqnh#BuA%M&ލ2 "TPr`+OAK1`39_c蛼#5NRvԨ I@'x U e6E;be^!X}唁 =%($,y_. Z0<֍bZ9|yS}X8ׂ}9ykwoݟ(\2ϐ6tgRZ 1I֝OIܔ! 9HJHY*ҕBb1=]N2:3O Cv'p21Dܴ݂pWt!nW9*ˬ&v o8XVTˑؾ=0ʮVx$u=(^x܎]~5P^mF^sG4Y8s~+#`˜WO94ҌS'q3iӅ;G AB<ՌW_ S0roe8q)'P69$m<añyB+f ie e**K|tio.-DA{#4W&OU؎H((BŴBژDCね:tEѲ皂+@K,`uzݳ X)ͨnbiP&jɲ =E]*ǺfG?yM# UpFԸAyT1r#؏2γ|}x'lbʣq/߅m'=zoQ0بu^n;$5 FAlg䂢~'RT9y} .v)7b ϙt6tNA_T6!AŽ//O.*X2"F1J6GhF$P"J'C7 XƌKDv ^h]l^],x}CIH# RcK*ZwAyUp9A`D|8Rv]lc֫R]W>o%o@'Aѩ󹑞븋W#T\-<"<}.* +Fx,^ sM(4ٿ#GEe4F -%#ȿMxo i׍^b(lmg[ق )<j0G|nҞSÇA St@` _(IZ*HylhS^;D4.'SF3E;vZG語*tu_:I>һ(u]<!/F϶P4<a%jwOk GvN ќNr_>4'uO$*wri>0y ksW.=֓.L!?.RFyQh`o@ArJ?>~RV,Z;:RSOi-[;yP6RAp-k+V[x'HiJzCF8ƢE=8>Kk`c^)}YyK>JuUO )ҽ>6e؞Yy>F>Bc+X#C^XUQkwۨ\d}Lb(/-ȁkѹl% BzFeRk7&8g..}~tɏ-?Go~cGb?P7y*~}˭.BtJ/\gs3(|nQ`K{t?0fyyDib2TPOVjbD_~c+sdرm 5C;NWJ񭫮WR_-ib D-'g|)m#ZVG8%DoZIlm5.)Eu;(oG7"UzyUbREBnF]-c>]Xeu slEk>0[6$Bx#*NdAΉ?tzW׵Vk֦ui3 yqt'"'~"|<x)6v)!i?}%P0|b]i9I|%1f4}~)[N"OEaF$=F_J  Zl@}Ac<n;ʼ?ۯ(,wP,)a aPqT!3;'};Z;ѵ}M-2/5 ;Ujn_e6ND.pM8x a ' p_{m=jhDӸLY*\M;''=gv{ˑ]S;2n~wpM!M.I"&L8PU9N;q ճ@8 ME9F#5MjSީowS]7ShT$rh"ieމc1- 뷧T {ߞ]>lgc6>IyWjwxmXHj 0D|  A;FF*F7^n嗡:Y[Ylufb/ȏ$M|D܆[Oaڈ(fƒqNĝqTQVk 7܈%wVv[n: Еr \ l^oּ6{6ohH11}$3RGKo,_kنуGbȐ! Z0f9Q/ٸ%6l1ekQQ@ZDVTF=7!̠6755iD3KdMfǬ3ށFdGjiʶT 3"O| 0A踣6.-PFGoBM=16I *W4]+5ufFq׈ &j&󞜥wp2)6yy?I#1G7#- y,K:VЇ [uU̳bLp:ɇ3'f3 ~m.kg ^Y2?)@r@\YC;jFb}*hOGR+9k-Z<]VZfhuF*hĿ/\4FÞjގ"wk5a#F|XxSHQfyr{,F 55#e!X5;I폡OQ?aO;ߛ%@W v>0{ݳ' ; =_em;.cE}aѥ8#C¦;@7rpSoܰNx?dI{}K:[Ӥ=Ua'GAOzErc*(fɒ%x1)Gv-^JOAhOJ {<'K[~KEY*MUvѱ|K d~ÞYqoE]/՚\ɠFSQA$3HG1}thaM(X(;M^6a.'hx!SPFҥKq)tA1mџf ;9jbA~}*mF;9#~=30ڂZ24 n w!3dBmH-a m)$f-;=d&-&҉5Yl>"|`;5"v(lu+GFb"r VQ;`=Lg55rcn5sDw*>GL4h r)q _Z /r3r>jήN 8hiiHyxӓb2\}uwap62AmQIzؿj+(7/{CY~R;m.-`ĊXvW^pCG[=o/dh!VJGo}ښQ^"uBlcȴFryoEj.Esf)m }w"niuBK:yNӈ*Dw}oW1׈,i\ߡw|Rɱy_*yY|5}acqڝơ3H4at/'W\pd`iDif>bvY#yܝfƨlN{D݈ͫ kQIЕNNjO",F$%0TV^؎P +@n>.ڣFٮmQ7X>St/yT|%Ro=_[jZCo/mV{RF:g2D"Ґ4q.l@eyCE"krXPscwE7 S ;S n! d[^x|#*.x]|HK~cZw4xR9_D ?jCs/mŤYoyI:/%BKC=f$Ѹ 7ʴk`e<*Zp{f?c!QhR̘88jyy2\\2Q/E#w3Wb23ӟ\ini6< 24;;j-6*L^yNn 4dQ5rh`F9G+w}&CИ{КЛ<=RQ-GfHPX~7=님՟_w:5W{J~~{qTMJ\Mݥ1s{HbV[u]ߓϾk2P0wEP^Qh\PQ1dIZ;T ]~XSdL*,>Ù;ƈ,ds?!kWoAƖL7IuXz5U?">] }T~sW.Mq}!vSG F(3,i(ocQG 4/Z>tf7f{wrԼ|x'Z\c/W"1|,+dU#TG-9k?}M%]gB~W j_e;R( qϯ蘦h/5oIxGFYS0SϧlP23-K|g0ޤ<˨Cm&F_S4f%%Ljqbݣ[vM`:Hl;4{߾k=;WJJ%5y;]2~Va~RHﺶ.zpyC"g1Yb}K8b42# x~b6bO@[8 0ug`ԨQn22}453GOQS8j|+Eh$!j-Xy]s>w60N;G5N"5ZWZۯdB5NܭǙU~EY1;"(ZRhuLl~e˹,P8EX؈*E )U[2eGDIw #GM!Fykvv&nxa R;<^ Qm^-&p;hтڽPm6ckOAmژєÇT9jTYF]N2 .2ouA@@~,9n̼'G6 RM]8\@rM?~фFuɿW^7|4aÍFeZZ[PDy{*DO8DMefQSDB]fx"Qz?O}RX+I1SpsO!j>R  ~"D9j8 4ڸvI%::oKOʷ=}9]/u]; =ڲem~zo+ۡvx'iS}ld=G?f0 8jXi@'T@b}n BYYIB /vqԸS9nf@1οXr%VTSأb xgLye$5IwOcw~gu0ϒii2r1ip1dpv͂\}㨉d=xg5T:jc#jc>NDɼQZ&B~֔[=giDDhT]yl`6TծuC& 930 ~<ߖFSrZ;/@g.fcN-܇B4Ҳ $}ZHm|#=?,RPlxKr!E:5CШ†>5ݓdR+]m'~,aT#zV}J7~=9DZH{r`Ժ[!'iGݛ:Ӑ;YboE4JmG %lQCS䨱؎!s2vN(#j4h:ĕ&PR698gtA+eZءI4m,8HSvBA'h PQiy.a l ¬k~k䲮xrJCC8@H:Y;l(ieUX4JZK=%>&By+7eٺ?(r=}Dv 0=+HXTg#݌ZWE3|oZ$HȮz|uI*+UM9:o3#+;hڱCC}VxUWi:S:XGVjEl>_QrQnhHN<9y̢7̔'mO(dʫޮ!fFhaamQyfS[a[]ٕU%[uo6$!k,|>CXZ,H+ۻ*Ji]?Mͪ=~R{}I3ՁJթv OҾsJ{T;䥃!IIi=F;D;0fo5=2w 9dl2̇|3} n'b9bDFhkV(Q]5E:o&&p vggiXޓJXɉPI5X8i[Wti SPCNqQL}v-Wȇ͝1uAWu1rh 4<>%gK<`ȲlѱGވf6msr(6΃rdIwBω*Ǝrِ{RJX|`?Z#F;<3JeSNzԆӈ1t]z7;Σ669GwF^voY>VkjCFonn6>hҲ3(#'A1k,)bQ˳n:ЍHAa9 #O)M*0+φ]hGo"#EB* ti4&IBK鋴bľwޱ{zǾe5$Y oih"nѹ#:S}79d:VkZg9~ EP>C_4_=I{u^yyۅx2a~>ݣ{u4$JX*s>WTmw L~˳|lӀh9L gj[nQvYiBUMɐ\h`>lmou[G H4Ԧ iݦ1юM]S^yAB[#RJE{Jm:6҄,C-EIg:=+L=GU~=zչzΩ>zV{{[򗠭d&@Q):F4}B#ހڒ < 2 !f=7Q QmeBRUDCŝD]Ii{4C)*G|/+QKc\`H_I^wDPZVfdhYKa'Qk!_r4ld4Qrެs^j6sO+etȼ҆Z7KFuFhkQ`M($`$l!q02ѠW#)_\y*?DUDl ~ʫN$=DP>^qwboC.]Kʹ3O&g>i;rZꃣvW,"oٷhN(Gt"[G8Tvj(~_BS=[e+jZ1lX@>D5^uVI6SfI 󷦍k])kcq!r*cZHZ7MjF8:VD-/&)d#IPXkij(gRR'~~qt_c'}Bۉⳁ h3P1ELs0"|JA6SL3:,GM6iYew3ʼn.roC{h+j8}{l'l"^4SՎ@Rԯr8KݤsW֔(.cƌ1zZHX[4 {+TGэz4WsΕ3))B @)Јe6/^% 1HY%#ed0,ۈ * Mh*LDpE:6\,L qld2T(2dQxA&]~ >o <_jrAS@;ivwbB58'!g~LfdI}q,{" 7'Ms&Wgb2Bpq8OiSaڱmk8 |_;sfI'O͛7,SNil<3ӧNGIIV-_i˧ 2>Dn't?_*a7<~Q1s]̧}JyU7뷂>-Ls.dz CjNűaQ eɿsO? -BFM5xh)7VoDN)nق%o#G t"ҤmL] CYc78O ]e_F5,#gF']1S 8ݬvf S4݁@YE 4RO9D{q{ǔSQRFsSp(L=s1:eD7+W,gR2x:l晍ه! Q u6D,EF~Bi%^3N=ER~ "hnm5Jan 9P,}Xg 0l i5rBnź54(WBԮXQ܌PE9'w<&N&cڌNjJpUog_G;l9|p3ʀvxY@p1cݲ%ȧfO禾9uKWqsYpR(%CW4j$ڴѬ~n^>RQ̴_FRIuRmoS$4 VTuF,C`O~:ꏬ0(unuU.B454aVbWWeo(僎{0)Hs9[RD!9=Wt-84`^r%'v(MFmtSS=u4oy#3zf޼#<7E?yuyJZ:XꡏC=Ȋ+L[r>'e+>84_Y-:+?r@ּJɳQ j0hfz EMQdрhC$$9 mA^nUc TF9Ўڷ?e ޯ_S_1yz|j]EaOۧ25hQהz]hIާ.%G1 k)T^@BB ,ll͋' }*'?v6'_Ti."aj /Ԋ~p5?C27snf;ed+ 6rʔ|A>؃M{ Rckm@`;-m P ,Ǧ \^<ygΡFD:y ~ve8QeV>\Skאi bt; lmAkcŘ1 ')ޟ&`(#FÉ'Ϋ}_K8CLoE-&o}Թ=12#Yo~k4>x>wpwҨA^6a/N1u348;|ԒDV;FE9fg=+)2M;ipmL 9'Bw.P*=`dϱ лIJIZ*~qwU@:*p&Q#P9wQg)ׇQHN*RbzCO͎fCwHCLfFX)ZjkEFzN*[6nXoPiHTIS'Nonյhۂ.11&JT'KUޗHG̙m:z:3GL6zȇ,&C!]xW;,qAN !~1%wś=Jy]mKjDF,H*HHf*UMdgsPw6jBMo/;4Swdl?rv\^'*ǎ}mw5jHmaQmj/Ju-bӕMkvYѸWF,Mp{O< \ǛOK!/Ɵz, G"_Sf>1lf}#H @C؍1g`qG)ZGF;C#SQנRTΞa8aaY@Ŵ8矇m57#2LF`x'n;CW6OiQmU?޿YUo]es}\N 55ãvz]<  9h(}Qf@vصB^WГ4d0D",=EC rTS95)<5f$kIs]wxGH,S d?zGqSՅxǟt<>_2fϝ5טt성:}:B!t&M/_ĄIPT$Yo}kp $>9#5gv? 6c՚5{cA_kNg"0_zϿ"z!ɤ0`G幃۰_ڍxW_2?ƼAণLAock}$EѲX 5}Iۏuvة=I1x5B LݲZ#<5ȀK`<\[_]w~O X4a+1mmҹ4)ӧ`Ȱa6r"Kz.I~>sY_E(K+JQZ^飥e_0|A>X{±qᦛoM 830򰱥wwO~?8 }wv/qoo-n1)9|bn#EזA/[ꌙ;2? VL_ j n/7/=^pZS J>{]+\K/}\}cƏ3xRl7mʚj fz({56i#>xP3CTb4:;P=p6RCc[Bi('x"=\oe_nFQkyn6ޞx)\bvgqʩ'a┉:r{~ǭʟ^+|MҢ2v nF>2Z^S^[G5yWj~?Ѫ6幑#*G*rSF@8@W(]1Iէ>,D25Mu;Գ`زm+>Xsqg?Ï:БNM/]|cIfZޑG3|9GQi 0L>هE-7tpuKtGcK)[[t)8;V^7ޚw<(*7z'݃^~eKihQR{G[ocO>G~|٥(<8oz)7b+>]<؃!BL ?p,Ig T GұAQTl?Ƕ4rZQ} (J-,i9Y϶O5U rty?E(WD)5}Tj?׮f.vhFEZgR dbgG`98+0`X|cDuE`G %ej31}S)'e8s㏅g+TRF|^}98($׆DDldy$ڕMn:qN;_?0ѮO_' z7UUfm`Mw65k4 % hpQ Aɨ鷔]1=Ȯ@h vv4CߌPd8mTBUw4^A8ہm M[L/DCG;tS/]5>3`y o3NE9dS(meiȨbeX_G?n:Xqɛ PqZ<;f^Ah|E!!F`=|kTMAwOR٦{5-OR; wͽ@m~`y?Qѫ^}]PۆcF5sf$[~IGO`_Z67{E_ g~ }^z 6TNw&ifSNiSO*#;4@~ï V2TfcUx Ε>K HjhR)ޢ5d=Jj*M}HD@ތHWҚ]O%` _l=Bݣ`? d ֔7ZhF NJDNN(ٍ4D) 6|Bk]ߋ / (SkoW+Ï;]s)7] =-ݝ4˥(+6z:u&\_O1E|dF$#X?4< (w6ʏt%[)m憭F )nJCbuc[s#ZEnilj7μ)Z1%xidEsePjkp+{Vp|h;GoS.%8qqq!0m)YQ{^Թy8ʐ}O$嚾Q4Xyѿ,c#U935|TC+*{#i5tfy鼂~6ryL /`YZ'N/tEP,+)i03?~B\ÍЊ'| ,}a7ހo;+V +~Ce i⬀Q5acO˟,x}}_^s1=F\<(@!꡾Znh;M5ŏv`U޿S9WP0h4i˖-ذqYbaܸq=5}i`[͙H9fTmm)@]>@&bYc6rZ5ZX>RQ&8ՙkh!ھӨYb(ignuF0hP2g6{q5W¯|/i9SgL[gx̂=Z{|m:Ob;o㊫O ,||WQ-/+*eT덟4k77_Uۻ:QR^?|sq6_ĮZXoQ܋5W⎿iz7ͻ1u nv| 7;;bkRto$_%0IZ@`HCab؀7 a9tףbWj&QmAP#Ӕ`wA|m\Xsu ?FDk3I1}=WЋЏ7ʢK𵋿_KU~l6m1:JйsڛoM|3ZWK.ڻt"ڮfj@;|Q8Y5_neU4:@_,YX|lؼɼŠ/3_W/^}E߸lnf'`wmQ} 9SzD+6CD>Cv3=}Evto=~@}S#Icrasx.5o|ig| v?E' fEQO\z jA:ru֌DxEF߸٤̞ke}̂r6ATV՘-^ʸ%fa؊JG#3,>zfdVmV SVM> z*.B\y8= ؄'މ߅Ej`9A$%,m^T`za/R[YK4ho'Q͊v;@Uv p; #52hW^ h܌9S3OW]ctoe9gI-.mHA6:%l'o//!ŋp7\tEo"\s#T_,2mc*W{J* ^Ɖi3g"$###,0Z 2y_;t펻6~z ,$ \AkN6>5USN>>B^l4;\& EcIrUQRvg-vQ(EڊS"[Ҥ?'涧vrXgє}Iu= THWҔ%{hw}zi9oE=CP zExJGT @5hO[0C4צM#Ǡ/<"|bs9m&*\1y+1vXPU^d{=[1a$cIT֠e+(iysZzڻLKPA:Z;(Ǭ꼞735ϿK|ɔY;!CiQ)0֮ZKC>?šQ!<'?o[l%nb޹}HR&զ{%P4JhNE6`~?7jj՗Ŝ Sа(XU;諝Qd|]E9UKm]7f[j*;b.ؙ341dC?K-E[sOr6NiКm۲ЋhǞĉǝ&#Eu.,YaV}4'Ԩ[HCݣ<_'>eEsC3J%8o%߿~ɖSfiE%Əٳfc}o/z WԬZ1?T.2tE#=yFVHf{<+b0XAmbhюBh<Vv"He\{Dw['=gwv#@|vw޿߃M6/3~m:Ao>%OHIK7_}!(F&1+ ﹟WkgSdh@<ݔc8?r\yOq.}4 ^s_75g>AO=2g<;|$>vY8SpbۋC"K"˲p=qhv9fiUqḳ@4i^4OqRKX2p'ϱ>ר{=9Vn[֛i}ȶ9Piz]Q_;Mux L7sKϽX$*L6o&֙5gHbο2`xFʠ-V>6l#O5^{fb9@.H)XF7EaJ)،1knZh} 5FyU6ʝ(ϫ/~[0g!:u2Z[rYp,i<أX|)+Ԉ!Æ0K[Q#FgFf1 lټDžAj(l4* Rx^rnIƱ| Pl:R˸_ -W E E<({hj^Qt#574""OM#B}!-` $@|l}VF5Є~n;冷!.=>zu굟Kx9~_E'Iz]qi2ʎ- 'R<}D*`AoţF_g-"NB(++ޡ,8z*5cI8imDt3;5`yQVwA2G0DT^fRp9t`,k er*0fsi|8q0!ՎqGiY1u@N#F3+tbܢuخ%-ԍ0VZaW7\wݯbRa% |xWp]wֿ?581nĈزe3yd7i#؞{J?>hEXCk3zM*7QgluCZFA{dGÀ6 F6eX)T9s9{_)i}/1*ah[ZTĔ28mً Sd=>M5CֱBءzHabbPRћOG:ƥK0q`ԯ_ڍ025L} >^&/cqq$ o"iBnjA5bx3}̻1T-o'  q'ȡX;,+j&wgδ=avǮw@_@TWv #v՚4SiCz #fGGӝaȑqQ*T5B R$.r͊rԄBOiG@js;D.:HIDATҨ3iڎN'k]۸io{Q4 WLEK;w;BULS,K~P*QOg{E]px( ()u|DSG _x:DYJ*dz<>چV 5_;8qg>k_qB{4WBLcݓs_? hhP1R_+B]$^~-:p:(m1.[m-Q9i'@ mQ\C7; )]zօ0ylM==dyٯ0"1T򽓬mf;婰edilhhy.h5}(!)߽tM D1,H10-`Iu/C[GMc9(."_diFݕy^rl@y=rć-V3_N8\ <%|Bv/=I'ں0k8pmwW ?u4zRS >y:EyOxìOϿN9L=շbxo,"ut؎&d,5 /C3EG'ARډKKy\|C.G+bʄ6A/iZ2FS"//ʾ`ƉE"@`،9Cxk_Sf]iN=ugLJ{Gbؓwטu+:@w ? 1a&bbOva׈oO=H8k7_n=oCF `h;z߸ _K'.h1w6vc؈-&Mgw[Hg)y]ǙBBL7uDKO]L|EEU1ڶ3=ľPI勶B.'m UZ\ƹhSjT@03 d/>RTN>X.u P2MMWTȎԇ}ٔI%I4J[8?(\V9ot^_q3%x}Ȫo:^$f戧1V4Q./S'Ro {lN,T=fRg|ԛ[Ĉ}翃!E.tKQ :P\reױf<wʑ@W'XKb9',z}8qDs/9Sp}XmM`cV6m@>+ѾtjfM _5[Ѷqq ).gW\J#ђhM#P5s &VS@E;@N4j dw5w)fW%KJ0`@hTѴFo2PQH* {ːPҕkC*E!æEnl+c/M dVr7Qw:.h*$Ht.rdJѱt@Xm3d劵fZ1ځG9W(☣O@C]6n؂z WJgB9^7C%D/>r&O.t~z5fHrM u/.*7CU/ !v9}q6tn6 {y A}С`&xVa!7T2w?GFvG1jtvDIA䩔~/QNI8 .iF@s){=w~b&@8W "fƑ#f՗%)B #toiq Z.M,k-%EWe?BC*9t.'7ƛ<P^'?\?1lm݄AU8~9_V2 48#}c=f JYfEY!Ҳ0|EBa6Sֻ)-u|W]}9N?DsY?C}C=j7/a^]:Fl:PRtGsTq8cO|@/gy Q^s3waNI~NAf sBt$rڻnx viPi(Qeb/Ǽ |SAIq: )--'V*oL5{j}[P[.S戡KtOOMar$&&1L:ǘN!/*KNxJQ^͓ AzGF:mdc誝Yvo_ѾWEG.Mvhm[F!EHMrPMFq(]7լ}P'm<)+^~o xʟ_ іz,x9 Eyo4ڈ+TID6Zg*xvf>pD4úwiK#X r*aC1lX67 qEӲ̟O۽qdF38Ø%<m*4u)dH Z!v/wnlT%.ŦulW6#gR9nkuH ){nz6vhksOËmmhoĖ P_׀o.2_[:pǺUL-,+y,Kg6stMZ^\+bզ[[Fxr<fD+c[mC #\Jq&,[FyϤ >gۖzlXS k7 lWzޅة?DݜSg{L>S şbqeq2Q||6+˦~N  8կ/4kG̈́1p꭛iXIuӦš3'a!ظ~(۰mzĺ[q@6Ӎn=ԮbJbQjoB,BJcqF<=>u٘6y7_ĚKPSY+^֫)E4=Xg]g)궮D\-SH,8(LyCy [7" o+>Nêm҂Khgd]mϔ_uhxbS}d !$,da_ JZ Hvg̴{~M9+B]Qkxfl',Z\< c \"S~+M!wҕlsge+uLK\1_@ҕ _YcvR4 e9" ׵Կ^IfMN]оA83U!e+hցfTTTl7-C6$UhĆM1.tkDe!tnkŖoK#'ߥGFhhiG;>hi¤b;VIV+ImEyr)#}O f_Ԁۍb#CYqqDېlDX!VJ* }4JB{G&kڀz)+cmM u+=A i [h'fݺ|fFi0DJۄ'b~˥e}@Z0ร: Y֭۶Cb=LqSmXj37R.\tF>h7m9h x<ŋ|D\mu^>9k.Erh~ 裏Ƶ%Bn:5T4 Q #UnfjQYz~WyR*U.-,Jsw]ST's梈[!io"UZ\TyJ"hvʉ͞_}`122AV>WGhjذaUEa̙o5Ot{m~$CW24GyTN#XnSS)Wtt򕗗T4ڼ?9ΐUcuR13F !xO͔{_`ahM1?Ǐ7[A{j ^xӦMÊ+0k,L<'3Hz_D;YFPbcF%i܂ L 'u2&1>ׇ\N4G$nmچpU)`WN : ЇjO4)V_[?a[=fNnAJŷKS*_UG=';V'>|\\ߋOT_8GoGl=#=6ҳȐ!F_n9OѻM =Eҝ6 3[Q#;#/,Zm_eG_ARۉ.-dy>)dO6(S<%'қvaJ#X7|'p>Wջ?Ё+*he)XK{_‘SE911G 52۫u7"ncneιK3NBO &LkەFpEǞ_j u7QN|qe[` xCkkD*B2#OԨe%>&54S)E5IbL6Rri ׅpЇf*,FfQQ#Ty Xw'$5'XUQJ\ [2ƬiJD =8dG}PXh,iKPpu+1qdĺXbmiB[s7yHX[ m׵91lh T1<)^hjL_ǒYvN#~yQ|g%X_wg kkN qIfħ>!0&>E1Ha*ꂤ|i3Rclm\rY7X/f?2U;f}?zr KQXMN~9Gl}qxF_jÆ 淼?ʨFd]\hDQA'EP zt:̼X*RDH Ǻ:ة* E'_c' .*1WE?-b__&Sw7?b.$mӨ]EŞ"A6n*Mț5K\Ȧ; DMC-4m$C$+۩Is.9YZZ'Sbu T9oG!fU])ճ_ez-^zyOޱ6w}}/2!> ˿ۨ|N͗di! 3R./q@&jl'0|GwP~P'1OyLdAO\kڄxW&)O"@My &`EC3cE҉jeY!|VL=O~T4Eюy{R,Wޅt,msǑig>t7cO7ڛPcSh.4|T*qo6g]Qsxг\pB1BK*ug4HvpRIsYtS1NZN"ψGģ\Ui{A:#!5C̹4*A,[yۛMo) gT~_x#My^ =%)Yf}*\B<gMy;D^O!,2='uS𠼬yjE6v(-ن KQA+9xΙNτB~7y={ ؗWEa O:^z]EB8@M6o\nCy` | L!, {Ao'T!|.62, k(S^ݯ:g)wi<8~ʯ2Ug^:L[M^{蜮ozǾ}_b_e+c_gG'wD.|Ay}8@<#cF$*ia9r>(Zz>Xn޴c۵ c>ȡIӣNN \f;DEIY\ sMkK4Q xok߃,]H;Pf*7왐gU*@a%1@=y-ՠ:]CIXMQ̮~U,0r F{D"1}<~J쨑V+!325Nϱ=6jHΫ|{W9pcݣ穞O(*=lXeS)ih:%ѳ}- oaO)|JR}Ij3S_hݔaC􉇱Q?$8^KooO(/c9|ܱX[CB$%zU5<}ĉ朼jE몇b\ w5\P^iчȘlz(Q4cѝԳE3v CL:5Y+hN|uOk)sYHtYZ tiv9hH/6O;LF:: fdo2?4J͗EMe*@ixy@]wlIh`DCzhS^GeL5ҌPv+^F(}b >_tݲy?u'A#.#߃I?(*?a zSXBC!cәhʯ|k 6~PiV$ӥW$lчKQ9:V^cgtzFAs 5f6L-A"4|V2}i ]l6B_I=Ǟ) v|OGM uQVH"_%wԧ,S[rLS*N; _ Uޜ^pSuGԧo5lzOSjJ'mH*<(x(KZSgI6k0䅎VlY>k7~ڛQZUVkh/4 G ɺviͧc`KQDCXcUA3}Y^M#l EmٓI/GkS"[ Os4Iy'v5[^(馛FI:F8I6i) &%I4̙?OlRIĩ?Y2eڽC Ύ*N7elj Xu4L}4Z[P>d:e4&Rc((5AմVֹuae]wZlP- L Xw2mሆ|2jom3Gm lCtxfU*=z*R-TF] wv`0Ajm~O lQtWUTevR$߁>*O>Admиs*Ld׮wOﺦ w}O)||NA 44ҍk*O|]% ڀa_:l7UZ򺻻h@jkFR2442`PّP򵃤Q|" eSESy֠7D>y7 ӀΉ/٠ZG$ζ wV},\ȭu[w&{|& +#= w+QKq8[Q>h !@w$Cݴ\JuNO I7=ݿ9U0[躭ݩppҚjo1_EXv_g{waJU>~z|IQ7;fD{7!S=U?.рvJU_&bޕ~ Ci*w2<깻kޡJ‡]o'|_9p\%:([ ڴk|CYm]Sy4|痿@5 רQd;>؟f΄ i x f;*ҧ֨y7~ٶuGkftܬQP^NkTy}=t<]5ZqcSEA{;qh*/4 _}/>>+i&bQG7W\Sc֌x'k͕R)1V3DK4`@څ1x+Kw(OSx)#&\^U` 1>7^Uǔ<+ GMyר6~k{CKV.>s%_6L2(* p*Dӟt*Q灋Jh ťEhnDU{j/!Xs9 1ެԡ%dI|oS9 y"Wz2pwzN:y2t^N4"j_;"\-,vhP}aΙg`mp{XbA僧ڎ˗GOJ.еˇ O!T-0YxPAp2846;Gβ-UF~qdy|:%ֳŴij#>Sc}(ތ.!ԐCXu+ձA=|fr(ձ;y7VysԖ#/l6=_7zvTv" ?un/ޙz.B 2\+}v?n=+~K'u}ODڻ=iC҃z^o:_v{{_,R꼨QoW/Txc+qgU/SF]W?$[_)s4b?D9N@m>d:~t he{Gߡx1`ĈmExkHk'Bi:h,&<( ;kUs;jtW`0#j]!2EFk12ȃ~l|gz~fy:{Dl8E.Fd);f~WA?5k7m1cдgLgMU&uŏ07~Gz0l"]hrgюjh*$ЕJ>P!k~=wMrg;xrv>]ױ<*ϜMzO۟cγ\yx*@gEi`^ _@s=9DrچJpG@"/ /KPKr.* P`j~Y3 orvGדc X:JCA93y exH {m`yL=x28FY:P9j4ѰJr=ޞ[{4H03A7rB;EZyA/JJk| VO/7M3I;ڢ{?S-ᝡg Juz/~96יX+yS͟\Ti\ױc]\`$l4޺w4_3Inꠡqv('-Pi)DD!s2~%|fO*T}cLq?tU_>\o|z6?2˩X~}}7g|9ok 8ί6mϯgxq!};__};ǻKw:s}}z*nGӾ.nIM>ԢI _Y~W=\Mg:NG=ǻ`;1z[_>O8E4DPf& F Y3-)-RiJv;[WyOє,s8|Dӕ 剺fߞ[u]l/r"4w#!;˒/뜧'ǝ`IK$(*(QP?P g@QD@DE a䙞9}_>w; zU9NsnݺM)[8J`jPXv;ߖZ$J1?@# ).?M9ˣ,ɳ8Cޭ[㢋65XpoC>vPebo7|]?o6Ύ͗\b?km#n>vI76"?gמoW^b.J#nq4@wTDm: NmlXʎ8>Ͻ>|{6QXUq<7(.6,'|9>as o3FWbY99x>˧7y_j߾}aEǷ~4rH8PTQ^2aDS8ˆ5l4oxfcUF5۷b+XIz,iUŭj,kzFy).S@Ow7n'Sij2CJqHq ZkMͧv|rqYWT<ڤN"D[( ngb!\pvJpֵڏHӧ' l9j `$+x5.[+Kei9-Eƚ.~WyxN' 6\Jfec3W٬]([^J] 6L#+Q)Ԕ'A[%P"O5.,q5 Ot-ӯtaA(4I5Y>qoO\Ul0esaaşjGp;HpW~Ex*Z%f/lF24[QLQSxq%DAEcUG +G.t eKޞ.`~a"ZGBe,+l\+KQ$h}Y]=œUK6^*mdn֦%o\)/y`뼒P-kᵭ\>yU~PEPB~,++ŚW_TQpr1aWp;:SVO? %W8MNky@<+\!irެVzQ?z}]Gy:ʟh[i^ 6q`+{OeO9b;.#˫6j&iؔ\xU@@L̃L.~s#zp טGK@~y>|#fVp ^|rHx=YO/8uqV<VH'4?[uF>hdyI)Y{ߠ%/[[v;Uǽ6ŏ}8َ-}z/Фnw1-}O_sLj-΃HȒ/GN>Q|"9|Ǜ876)ۜT:m)lΨAJd\zno+N% j Bə TVB"8sv_ɧj!ʸF]#߮p#DyN! lh̙`;~&x-QxG l33 I;Ϋx?.ib䇭4t: U4M]h y\ y+`8y9.+@J%eDkFȱoLD"%QRx %)xksJa|{Ӟd/}KExE} LjM%㳁LJuf2xi̫+JV|8>z?Cy^ oKណ}LxBd=a R1.y8T?m}l`υm6^m<ӹLspHׅV~oZlۦ)z?~&n 2IxGu(B.XC3*ȷqxHb8  ~֌ÉbE; ?Ԏz\)(xЮc_Mᕠ'^e=ؒ@T & pۿw6kMLɱ@a3Wf=~^?W G]W ]n 3xP#}WeC9ڡ} M{k/CX)C mP2}R~vNM;ȣRjpU4q=~tR41iiaFI4k_5Ņh&Xӵ;y^M:gƭMz(ؔ(u{%sVoG?ڶov<uW|Ֆ`NNYxOx+rӯ>qֿaKv4ͿgYj%&57ugd5A4x_>1:2ꏢ%&߷$xYOx]wgY(Up`}sJ^^J{guv_gZY{=ϳ<7ض{o?`W =ut_|~C+*r:. ww?>s]7!Ć7f!TXa N 5bfت=^?fVVBMIxh|7*AkMIú fȺ(x $ 5 9i5 S^tI{2IM"$.z•nMic3m{[)h$L/*Ў.‚iPAz-C^'X J3=8^K󗆘`\!T)L}bhwFjӿ~qφ ??N>"lOLj`XHJY [HDjxW%W;Kf!6S6qF4&uZ=jBM3ejT/?)贮K.;OX'D]E^h(HJ4ɶK5)9abE9ojDеwcgMV CWUR|ቅ0~NӸƥWG!߲oRj\\NkXF'hD@?\,~jܱP+[)ɡ 購bv-673D5ƀT@a?jEMW gЬֲ8+t.zaϖ X;3Om+T>gkJZ_N=CKX +9Z%k'|VMk,}UEf|Z/[ 65m\-tۡ¼U+M Hj:\?AYm_em҅WB͖lX›jm 5Gzf5,'[P>jOǻ* %jKj(\-`P{')v.m~]/=k=:mISՖ>ϳ=ֱg=~Ϟ.{>`vl?hi)>dzS_ӏԔmK {/>KjC{o6dN|:,pGFޟꪫ}:P&^uz^f7xcXm&|P?&%E( ڰu6sF .r ߙnX^Nbҧ'g@!B>)|"jty;q4 |ᇑ NQc{LiǏ81b0TLZmA*Ga>i}-2CR^4_׋OL,WcʁIĤ0 `ui~q%)BVߥGz~^-9tC>~_Ec=c5!T57IK6MX9yˊAdpIs>@ ]9E|rt{DgKaI/wȴW=^E,2YJuK+f5ds[LLZd ?r/԰D;-hl~6l]--z;tV絜h|4t'%I_ÃN;ؐ|{S~yZ2z&Ĥ8ߎ㎘4' >q1 ;懪DLC_I+RQx&}8D7QlZGP:I}6戧uū~/GL b`&b᤬ײbLOWQH>iW_Y]rWUә/Aл1gݯ 4ȧK~s[.+9J.׾0Vح>!&DZeciOׂO=')ܥ1V?ׅX%'Q(Ft%NK3 ޜM覦5MggMM)Naa=ɫ-+C2`3i7mG[kX:T\?L1laӱl8L=թq*^驻upBܒ^~ϓjzSY,Ni_~__jhW\b׾u+/xn{_b߲=[o}S8c/naǽW<1>~ z,=vpzp]qU>~o$`Zr? 53nڰ3|!-Hw9*!pH#N<V7Za_iW6CUA!&M+K q4,ZJ=Z0:rqMb^~;{>r/QzI(Sɉ~7[2<tJƓʰPS_^19:p u&iwI/''KGcBBB QpXReAv. j*mUWڳzndűbȿ~ל_Ņ"'qP~xZ^l ;j~׽Z3Ilo ')[f'I|1E5^+13m0''>O\&nL| 4Y}pQJ9uՐ'Z,?;+W%Njj|A ;Nױh67.?&O&8ʇb/3bnuR9{4Mmbv:;1j~Jr~Т a~|վ8z˵Kkգ 'N~/3}|-]>5_/s>6+hntU&~ l[YK= z6-bqĆ.Ǽ~vYE O/@I6XP8޽{m|̔if,O[PXI*de)\sjV9z^_ Z4N1& ۧPr"DU` äHUq^Q82I@ATbeu5g/J;G] //|^t#M>1~5N?"~֕yl`N.B_ptr|rTo9G'Vva,^=1G~  wI)D6)\p>?pO=‡hx-[bᕣUBUN7<UrBMXШ #o~y>W ϴZ}gX ;(C /uv%\T4;\O~0nYR&RZܬф\zcDwv#KdB0 SBd ݆@[48Wg۹DR8(dbO/wid?#K%y/ԅ^~{]"ϯP^UZW>;J>gxr1Vҫ'^}K_ .q3G4['Y _1QiׄFģ/Nk ,X^~MBos8䈅<1ϨOm`,1|:^ga]sz/i[wW{n:J/6@[1+qH&i[^<}#cDՋ*'{~Ί_{JɲK~6+H|OQHpv`9ykleg>)K/b ;YXg=홿dO؞K.[~{^j[c=2{/>bߺ>o{osׂzmSI;ؿ}607m-} zi{7hey:bGM֮WY 5E>P-v}wYM# }8mK\x 5/D̹5#N]wOx݉ylirCDMv;*rD,XJH yR)+ >lmt$'/tXjPWx @:^ЅY M ŋ4e0TdMd|VLCKkO_)^>gxx& 41zĎ;ܥ@KP;Qw899bp|/$00+<À3 ~ MX6|.8g(R6/EU'K--'7ÎLR^('6 ڂV,U+bKZ\`MT^ |7PքDn5SJs&RqL929F5% c&vlZr|!8lﳹ 26Z!p b'KyU/k lމKXqoL&D9%ɪdM|FV5jj6\.DiڃEQr ?m]_xiftB1fI(M,Y Fiz].=E 9x1y]wW,ysne\qVv;T\`]tcU}^od/]S>TĕΦî!h v ˩\hmvnN[dЗ!-ͭV-ׂ,sZy͙R8M6Wye-Ubv%T) *$9?HÄ3RMe[eO|xF4"v1.$++#`l֜ #u~*1.YO~C00ׄ#~Q _Ίx3։~bw[^p?_~o])v%WMMIVT$Rch(߮`AɊ$TUr/F),=,N$rW7Ǒ[AǗ՘OE3AUes fͥSIUYyһ}m-j>(Z( S"M0dת iT};Xn|T*:3m+RS3v__5no}o?>[W7n|z}o7چz}6پDoѾg\{}%/|/mp`9M%qKr5he4\4akq$[TQ:wEZ| hFCwݛ\,6jBQd:tMOȾ؎mۭR*M%wr;cvVoXթV'v`dg1iR*lx3NjEmD4i#)uh'qOvpy_G|r JP<N*Ac6!oim_̘@`X DsLNX[ں>[[X~ՠ3u X~`SCaftn6鵙9ֶ˵پGm-Ec*C9lN!a36ffOcX:ڃ3Ƹ™j(U$PLyW (C^b,2^4YXd$Lu ='PXkEG ҝ<xPKס_ʚ]Q'9 CZ9"LNes>Gɺx~Er?m!Jw(?LCB_хo/xlr-_kXt q 1b D&m$ǘOO$iZr6>=mt&ffDm.z Mrvrl&ewe/SMrJg kMf<K@C\[{UtAԴb̊L~jFrԔttٱamw J*|h\sx mfQML^s1[a]=$ČlIX^`QN1_ _Ppi.$ΦE.X\Dfn{ 1" #)nqIO&aKyM=y|XGdY<-NO&pksQWb,^,Tt#j*\шӚ3RƖr:͗Kz=W)[ZB4 F~*T=j>WR:5_kW^.Y`mܗ8~Stj6 12m㗂42V <GWHspUv/@dGkṔ·yE> @c.\ԣ?w|8J*Ici]W\2`*V=ٿbz׾b>~PגS8'ܺg]vr Ӧvbrܦ%=6%9,-i-6S/ZgRV2ֽaRM?Ik9I9(7Z{** E\Dܒ9٬n 䩱q An"c!X9 'Fw"'s= %;zaAv|8wkuWb5fkC8Y,ؘ.gunhTRֺNO[Bdx823my騡v{lGm*[y=7ab&%}>;hYbA %}ٕWن-[WOnfT|T;[lq{oMY9܄es-"-v(&!*'DǔrNDc! ^h )gQa}>ܦ?E>۹` ˅hd>@>Hq3aG[ sJϦ'^z\K^znV|K_2Kȫ\#|jR=;21j'榭$G6uZ6lτSX\md&>8΍%z^^Z@W+0^?t<<.'eϵ 0P3uŸjTMs/x,.8ݻ ,7p\QGqr1 H{cQgXngL}c<\>~ 86m lc*K|@_OW$zgSW,bA3S*POIQ 6Etɦ/҄nԨ5_:pG@AUKid!e$V&-b c:{~OW6oz-#-L=]6 9;9=%lvw򸕒qڼ-l;Jq)TuXSYs742|]U8DZscR(c_`e93Պ8ڙ8 ƫOr~|Ql3^\^\(>UMNww>ּH!`.7n#+/6>a~Ȟs]=}aB8U.ѩIu[{7=`-}ֿiv֬w%ۻlt$YbU{6 ƀ2 g vjjlFs6laL.<4ݻlNt); {ݷi ٰ; udvަ4m6&B%,g/Ok_3D_ܮ`{ t*zùlXa9}~s1gOO3A/9_$6[_LD|2 p$]6Y.,-ȠŰ|qލ`Iݝ ϵܽ3T\"wp֖ts]<4 cQWANV{3? =k,줙\CIsQ&y_C a*r0bᆯi8, EdV_@!ȣnTfh'6 b,|^[eKx7~`y֯nMr*g;5oym;<2j\ ^ho>ozǸ}~[kկ?~۟KLci{b~{/z^~T{}+lǥHk<)'?28cSVMâ+gE}^s^;a.9Y{o=?>I+ ,4vq"oRs=Dy࿗8_ù&O"+5.$Eyʏ77㸙29hcs|>^}xxGo{}s_ٯ?v|z*^tk_ko|uw.`S\c){h;.ʲȹioz׻~{g63v2{;m6idjYy];D`.k[?`}KO>O=`7N E;c/}իUox U5XҶn&4h&&i~rsס\>˃؟ =Dj|v\s\1c ,JTRDE3I Aw1f_ZW8,t+X__+~[+n6_eV+5xsg>X#(Sq{9K>C,ל6]4b!|̉uh y?99iG 0lqưCʔa.vP4wѐu;CX N7Y>vZFP9w=mossl;p}߲ {_lxE\eٟ9Mr'r?ɿȰ5>W^mbN׼浶{‹g[p>ώ?noxa؝6V)بUl>:6o҄MMأ3+lRz6#Sݞa[Z֍}r]9?־m?MLN_a\0FXavppML2=Ct{u>(HFm/z|8wCBm&k+J4]K%f=]vbjҾy f׾i~/}f{o[>٧^B{dwN*}szi1˫{埾[߰?Wݱ/},kmm߾&_~ݝfJ:~<ֹn:dbvrԶax>Ogv}^?gu{d_ַ{}{߳(yu۾gwp/۔?}V*o\zZ.cs#l.ƾ-6W)کtq^J4ђSSֻq]>+}i3?ZzlVg>_ gۺ8 #bv@&\y#H/pE;ψ)Zt*{.](*I\{gAvߴW;d__o6sE75/_}뮽6Jw^wl꯬"ٷqԧؘ'.*O]tؓl~>:gcc`WWgyϛ>+Xh'Yw}} wO~Yb_ҿ;{WJҫ8 {S1χ"MA.\C]z9?Bw&]aLJWaQzN^ X<#F8YɪVE]%kujZJ Ҝ)aKN|60sQ]U 54  ?F2.|iÆ a .% M+ai,ʐ" @i!|2 pC "޼ ߼6,jIqϖ/ ߒ/HaMv:gsR\^~o~׮{g/>&@6 6tLN5_ |ʌ`9u9Uou-7ّ-IC OZ%' d~.K4\('Or;ٴkں;mxbL^i7mȫ/=WE/{o7Ica'NY6|zp%ՖlEծo^kܕk\r󣼐 *9A6&^-E^(6] ծruu!g19^zy`.9v-Y+,B#dy?]gy:k\8rV~dlZ9s 8C.-|p4SO5Oe~=O$jl͖l8'GO 跮=]Wd;%a;9>঍v n ZL҉F,]K5gK.Vf{inKq :}WۏӵVXN:۰VXΏӅd΃|& F2P|K jDryfR3giy9))|xF(5%؝v@#%k_=+ԧ|4KoӱF!oSѝcv+5++ԜJjeHw%m26y-hnMjZAaQFjݺ}[+]Zծ}\X2e{TR~p_(d2'1$|yt_cQ3GGG-J4Թ%mZ T&C;v@`7@] @y{r:V7gbZ(xPy{{}}ﳯIK'%;\,z-W'z-WZ\r-3z-W\^Q^(o%ʜ6#wb ;WkvsW ؞bR~/dPzXI윍8a]qI1>g&]4>2*Xζɹw{ы^`-= ǏY\VK%635)61=a'npæ>ik7yپͯ[Ggf%et*lXc@Ԇ$z5-^߼\\r-3z-W'z-WrՍ[Dc=ЭnH.؝ Qw5`4fbhrP07x,`{V\`EBB]e5{$f9xVns 7>q}ab:H&c!f9[Bʂ.=vB[W/g%"91_. V56?ŗ-,Ygے媵JCb ͋TWn2Y.J}RR=r1E]`XsX6k1ͻ%;59iUj%b*xN(! ,7͕c-'#LO,˰<6>6ʰ8b N $(rDC8(2WP^Ɖv·s3$el"v;?m=嗞imnf}o՗]f syiRҝk _B3du}_kk6S{UhAv×n69m/a!?DvkKEԜ=G>]c>ʄPgJk:c{oZ{3~7#``VM VX·aDO.{^w 7_r}ҵ\r-3z-W\߱I d V4wiX.oiXuOt">2,n3Q\7: Wn8&#H8lGzM?e+.ۣ3ֿkovXezkv%۵o}%Ect˒˙Ykŧ]Lw]{:$~Ϸ^roWjhNŧ<һ\s;yȨ=]s]tf|97v2+{4yޮUv16͖eJ~L6t5Kb !3q~SbT?mc Y} gj?!Ώ"ݿ³{t<#6hr gagy\W*!?K[iAW-ĤC1ykgwU4%V^ӥsd7બhh>sE_R՚u-hn!#-Ǭ39K9k,OXȗ,5[bݺs5 \^jk$J++;.w_k\\mbwtzEc-N[&nk8NyqfaqwW!S6 2;CY^AaśQaSSSaæMI/A:l)KxUjKMĭpjn/ZZoƑύÝ_0 tW{U%aH^$t*WJ6_|ѮWK/==Pnc˿Ic{n'<'>Ɏ~>qkiYG2mϯXqzz9nzK vg|3o'#v+MLۣh{?ݲM8hҿȡ#l_zv>w}l?624$gsMڷu>rЇӞ‹믷?{,V.}/^=6dzSxrZ ]?{-3zo?ѡ|zP199f[6G=깖?q۸iR 8G&FFV)z-W\^չ+8p 7ݞ###6~{&3Zb cV-Z<t-Hx2'7~A;$]΢,<\;_u4z_ #(⍨nsr [Z[Ybj}svCb_㧬<;kCGأ({nxғ>OZo|˖97fַ5l?/?s?XRwjTG>:ma}_Oh'ڥi;$[}n ⬼g=tK>..X'{P(,oOZ2RijR:ҹRXZO8lKP#lQX@$?;ΊMMY 4ƍw6>6t I>^)_˾agJgOwPcl9L8_f-6#;ڜo- MP*}."{ c/٩'ٔ~_kOptdg;:lv]~-{ Xx*mM˖PR.䭢qH%_&GX d5{+wφa5ɩ1MccftJnMXJҬf;UZʋe|MH2 7x=A Ζ?[4/a^iш[f7>]ir[.J&}u﵁GFc;Bc+]NOrp=/JMKTժ $WHmmj"eb-gm|޾u]J=OXZt׊|:Ѹ͙<`^[a|!f7ݼ϶lnzա$s< icP]|`4|ӟeel~a}*r>A>jss8׍ÄvcGP.ltr 5dS1k󅚲 +m2jߋ^jbJXU` gkhpXc c5]U,XmN%ݤOMچ~uwbzzziة:9UqjK{d]5vtnҊvɸ.'rbl.ڴƏJdd֒Rj"jZ͠QXk@enT֠Y:8i3J.JȱC֚mY9tx811iJzz U1g=7ge+%kmX BmJ*{ܜ z˂OqT?,`aRbM۽Ps6Owφ3[)KVZ)77ۼos%j̙t{[+C#zu0nA>&M"9%ќBŎ:d˛Žfz +O_X?] a-W gBKw5&txy۠z؎G=jv!ˤs?8B وlqpP::n/sҞZLUm8˝>8$%Wo[n{ڔl2D^ /05mvnr:36i&l.?c= L<-&IfepfvѶ=V֞nRfy nN;mozrR ]61>erz9 c]btrrR-asXq￵==~ỹZiE#xLWPe}˶fAу;pBΖ(-^ 5Gm۶d^ ;ll "Mykl[=pu!bdx+O|!nML暲6%1~v뗎$8/_MN 5ex-ג=˟Woc2ʃ2I 4iIr=?bjlUTCs|bRKkxAt ص6*ݵ%׮Ind2qʹRqӤR =Q&tkccvʱkŠX! L{&|Uפ[~&@)XY:Nک\`6;|~G4fWC<Ѥ _1o1YM5|Zw5}O==~{64dLjjEq2g'*|%afJ&",԰'|np{!{`sEx&M}#jbkZ1MZY0S?2-6PZJBm?;gm[.yX1){Iv#s#է<#>jjrkM[lvb5ud^<ܱbbV+98Xz5wjvm}֝Linѩv~ x֒J=xWcv+.ˁ3EtYWXzvvI>~*Kgg˯.%6 5! (^)K[+`OGy=o*xø>7^җLG>NB_ 5(hh׮]~sk"ݞm|Θ8hj3T화x}w^ii+%N[]V ki*3鈳 kA_ː~lCuէT6BL"5Uuw勒ζaiv>5\G&#Tsqw"9U ƷUlXL)rD,?t򘆰٥vفMX^2]ĭTkXZ`[WX0\KљQu<<ߙ2@ a2HO `:a7*VjEsol'~x>m 9-qBR>)UlC_xX GRZPU&mpv[ ָU@} C ܕW^iup&.x5Ԍgtj2_' QUKd %4ܱgfr,oeZYMr~gُs=52"IC!IٺdY&h d[6;H]/´mv.K,tONg)9kmsoLv*{ BGfb=669.-n ؆C+e> 5<$Lɟ}vX^:aр^(c +8RɘUJŰ5dFjelOnݰaCxgyb/lrk-H]pKĤ gDEۛx+G rll֜WVUֲ_[j`TgIjy֒OteVZ"+u#acoi鳹͡$cXNY_k%I;>;llD` pℵ&w\ǩ8OW7i4WPogR~i֭UMZI]H%VFj,a&OH>ؕI?{u3_˛5'v"O[ 5Vv걓fVܞXQ@aP?uؖd 3vO1Ue1:mwklvx$2=>fYMx 䓆O3)!GE\f +a(>X冑A< >@Y `ŸM7yVgOY,q.ILJ':ssv pic@=x\kl@p\Giו xB|קu'sq@{L,x<|+`{Ɠ\?|!âW= u(6OLVakG%@U`50VHsgm K&rm Mڛj4Q~siry.= ^_4ROm-˧#σ!OCo~|d$/G ~+ 8 %p9o_W_u69!L[E440Ρw=H hW`+|m{B=~Gi^=[WC\@9ڤm !; Ti?@7p}x@2ݔGI܇6~+ < ,d!*EL|`XB6^DrSl pnGLĂsLyهR`9|q^5I^o_שּׂ3;#<oI}Cߔ L >GOrp%_]V!P|'|O370=8sQy~Cs>S|Is>QQ6}jc<|]Xqd'Oӽ?W|99fRۘD$]ݔ}FEc%!#blrM"ۛxZ<^OlwhSrj͹xE o| B>ïS~w!aR ڇfC8/'&MtT.!DG][.1whop_OLJz\{A)ϸV?@?EO?9w_Qy>Ggڅ-bu . ~_LVR]`V|X[Ka&glNzl#kӄ)) >7_[ڿ<@y(ioN:\ 48^*?hZ܇.Gj >NK qn&|B;.TJ^TdrtOG{8[lljZVK{|*cxÇ>s͖km gIo@ {\ #\|`C̑v9FGGfn.;ڻC;^?5dr۷c?RTͣe@aaDQBe% ^o[*5;%e:m~zyPAhR"Pt0^"-'C^(W(!SB> `Q5IVX7:IJBh@ѝ ɂi%FP#L|< W<BuuC~EZ+[s%}* θ\ʟ]I^#A[|aA7 ZS~t2!}wBOb3NgC?_*]dv{?:C}4'!~xAI\' \x1iW@r]YC/r?&tSzNgYabbŤSB1NgfB~}?3Qo\ڇOQ#tp t!Gг f| >GWW_zCҌ+iPv?dgOtS'st}ࡧi>i:~_\Q8_O=bM9o}n/= }]4rO|w޿{3v4|9 <^ŊG8 {.B7ps8Ѕ?O~KiNba74|Cy[/|⇽/!?å.-*7_/ڿETnA ~޿_#y?4/ɵ2Iʝv~˛Dly& ݋nJt F?sN2LP|ʐF<;L{F>.l{BB!6->yz8~q) _>i KpiIS4G<9Ќ $^C9yLA[K'M~ix.>t4X@Qhx (MD;G[?Q܇NqE# ~si9:n^O% 0G)S4xE_6Yx[ޟ#շ-P9o6A4!w^ٸWqH# 5A^P@$,CW!d+1:àrrSō>z%C䊞rP6Kpd EnQZ1OXt}8AY&Xdj,0U_mޘc <HwCݐ@OICO #sv 88q|Xh T_P 2zE9IvKLy)E>|p~?wi}rӞPvio8\v?&x褜3/8vSy+QHQ>*)Gy]giJ9>>>+/8=a4$x,w8D +NQ:&gw/16;4*Z[lfk  D`0Xa0*7< `[&ԣ)ާ-w,톊@=.!D;q08@~GY7fa %ip&F4[zr/g򢆝vݸRu.<wXȧ8sx*J9.4<hiS<.8M}< LxL7'~)rNTj =r8d ?z4qNTю 8O9ҌG쇏_#QF#{7gE{@>q?vr<p|7bEfsc~1w;~Liwu~>qt|}G>i`@<|.t~GoQ= _|r ~oBnh9t)O|S>Pqy.C7}Ҏp__-iWtr81%^@>K=ڡ?/qhpH{4pi>{;4\?4~ 8ӐyAk[.X*ypSoy/KQ}EߢI"]w=@k*O!v=̪mۉE }i`a+7p&e6>QIRz!s[DF"v Nhmp܎Sm'yi{Q s)tQ\)Ce(K9m~4O.ivŏ|6XA \h20G`uiꑦ:Q@R@;iQ8/)lye˺i~Gr X4hH7p'OISߌO-CԤzy c7)A ieʂK\TRP8Eħ2nd<+}Y))mNlNɱuXZ|_Ñ(P @9YYOMTK:594CiboU@G=ܥMSd;;ݤſ|4ݝ.<vg\VI6O /w)~ ~# sr>OM ?C_nh; >px}b#Q|wRR< ~t'pg)G(G?OLy?;NG:~Gw~.i3V_[g{_En۔R? I,iO_6̕N%5d{tnX2aݘTyr 1D3vvF=``d0nIS]p1BAp*8.& t3ܞGqԣ4F_v.=JP@pݤsh3  #?}KG.}DΨ(~I^o H;(v4=膯8nxx!^C}@l\/R|6^'K#&M~x %@6DKrzt}\3 ÛRi >Q<ڥmQn) # LDž:MO/n|?`9~l\QC=p-.Q.<#>ԡi8~Noµ)fmp~p/0/#ǔ!M[O{ tҎGܠ6I'?R6ix?G ]? ^,`|5|:[uh4pIs:~}!84/zыNXT+ݠC 7`a lkK@82Y)Q|]509sWbYTŲ+o!d\FJX Z1)B'HN `VAyXREL&IpIu>VQզZMxf+ ._ H5n2JrSL+ɹtQ/lE55NWR__H5 Ԥ5eQu%ݜrh#kC§brD  ]5*<_6/e=~lL6>fYs U5nȁ_%}K| #.BUzԧ~.>O/9%d U"çRLi)-+_\G9G.%GNwѰH7堛zep򔣿 x.ǡ?ԟ?E/IM[*o!O/ʱn/\"Mz y)~f4|O 6 |41I;~E~|[_ϔX'ZX̓àڏo?ᷔK;3N%^i7t' L+գ~!pZ7UnSu F -0[1bNeQUt+!(~TAU #<14:y1Bt~ԡ!L Fs@Dʸ3Fiozp-lmpPǝwtZA|+=bܢH3\﻾vƸA z 'ㆴ;ƇƐq?vho8^L;Ƴoʣx EOzzI;+ו)@O%[>tA'Ao^j w譆kԧzCaIӀ+/hcQ=_4>/~8ݤ8O;p=4z Љ\G~!G= r% @򀽢@{#t?iqv 7hv9I#o8/|9-'G=|cxpg?$5 ?y 0~U~Rvkimi)(:~p ?ʓ}.~~:^y|U4[6ouօxz /{{g0F(M5gCzjf4р[1)iMBT&'G}VDU0 IgYbŐ,d&Gr0THő-ld#pHee)r[*)|>[>[ْI2559\eh_H/|O~s s|HC/D60( yEpO186ibp lh 1i1Q}rC_wX|d<_}![=8t|^E_"'͸38q}zܨb93>}|)v}|?wCws-GOK9K|Sn/ >Nї7;篬GGW3B++7WK\pX ~h8O.>%v|Cܧ9~hOMSpN ?49K~Po Y:~tgg% ||A_~8iOO_ A{س(g8ޟO=/p= >^>п~0tEikP Ft|wo"Q0%{łƌҼa<@Wh&tt:H~B~|#r sM=ZpxN;ܦ|We}'>v'h.hi 1vC;\:~yYqi%a)u Qwas82m:\.GQӧw~/G w].2E\wP/m.44п]igiC@/Pށ7|p((bpGg@\ h$64^Au:i&e:/pɏ\/٧,8sѮ/uQC p |||/pLj8՚ W\q}7,1ܳDP$B|QdOH1!|2bƧ)3#`+z6 IݠIi[V+`IA(t +A (iあǀaph|NÕ!Bu8c }1ce@!n>0z?r-Sz4a >`~R .CM;Oz|ʓ87(Aiԧ]b%bA;0Ec@;>.ph|C7I?M{w>8_ڿ<ڡNr#MywqhvHsπi p?^.@G= !_?Q/. \8ޏ#~˟ K O=aN)Ψ1vVKq5k,Ip+ J@\tZRiÁ!@ềA7ǰU{ɤ'Uޝ`X0A.m.p00V;v4pO=`8~Cb6:%o;}ڦpIS?-p MYߴE= *xHyo;,=򛶀|Ky|'?  sq.\ƻ+q@~<#>GL份`|0|BDc|/J i#\4x?'<(O{Ĵ8Df&xNԧ}ϴOHCi(O>1sx#?}4`==>Np/z3ɇŇznIz.ioE_O!?DOypv(]\BP/_ڿvAE|vh|Gy{=bo:_  G>:[#QE?GtSG=D?K;_'|6{M=&}$Mn~Nn; tS2G(~zyGyʐř< }Q.0"m#p(lh"&p|$Leme/σ0@[\; w}:v??rK?`P/ڟOEb(缡,pഓ\TIp:QVǏtuM6u簁Ii'X<.ʓL広rC ȁ׽uo_P.tJH9PCovCđ#G ԋ.ȞΨs0ezv* +QD!27ip Դv[O'gFȈ+=W@o27osڜ^hr|kaY,"A$+\!.#ym/l|lcgOeSiUM~x%F'ƭ/X%gL㓌|5dçg΀ߩ p|vmΊrRɐLSL7;k_ǜ8\V.>Ͷצ_|ҷ-əijt,H 3.tu@WO 6=W_0>5isC'O@?G;Ĵ6&ܟ/}Ym!;Nz AJ35>a|j|8% wM?i &MK G~olx$_]3$1??ڃ]AT41tO/[[gG'W!7|4 t/OhopC>|_bͭ-?v7*S(KpiC??G|+66 ~R>w#nK>rrmdSЉ^ tKRȡ <WYd}e~èw\ בٰaB#7z rx!cg+Q dtzBJ7I<=Wo}E1\v)f|`^AKE guKQ=Di/vᢇ;?~dH㿐.G'8뤡>E_~ }??P#MU/^n_.B' >oʹ.oG ~H]ȟE'C 7.'4>o>v:c992ނ52^I>ISgwnI>r ?b.+|$|F71tR!M}4f\я_޿w8X?.#>~t >|eX(h#A_ ;:ߔ!TV6ꤱ^>phgb<`=4{pp0pHM`61u˸pFp^e}ڡ ߼qԩ O= :A2Ic& izw! ;h p}uC{N7uȣ2|IC4叾_r k_~6Ƀg@ ~68O}  z G=Ҽ}x>޿QxA?H/F(C i}Gy ЄHi` py>q ܇2}y:bRuXw 0 B 8bHaRtv_OVm;蘝=i A@#tӭ7  x9XC13'-;vؼ [6uC;Ǐӓ@3le[+Z5ߒ9N)S'N|9o۴e֡âl-"q\pjFdƘ4N@fm(C2 ;l鰁uuǭIxQC蘲]ygESKR|mnMu![wzbI~kld*V4|/J/G e5A{'dK%8ɂdf1˩FdžXH)! tZo rbkcǏrҒmݰ%Lw|fšY۵+QmB{-_kkip^_OOibSYOYDn&ڏ-[GOww&9ã#vj>nwmۡߌF!]%9ɱSYFr֩O‚+pk )900HD& A4i}п<ʦtΕmw5CހnJَ];5|s˦Fn'Mwuwvyu9A9ߑ@ )Pe< Yj|)oC993rxغ}tX;;s Xq65/SoàMS'%f6n CwQgՇ2$(l¨WIlu`ذ#A\1<+q`)sĉ y¹X`tУ|7LAN]`>娃FC[t;Qe۶m . tp \*c BF k >~Pw^pq0Z8R|O_#F8_'a肟Mp:C [n :y'Ʌn``'y&~p}h'5oZ4iK%y6lL^>f|s**Վ;72ŸB/yP¸C0~7ovya/E Eo}<'p۾[^@&禬% qx\.mgjP.4;>Is8\G_jjCϣcҤ=AaOc0}d 4S㲝m~ㆠ_;{</= '8=}~zz>#-۶~@d[֯"p(U~AoCt^:Qv8%C$~uw`׉cG$;Zcݻ :T6 nl48$sxTg]}/`O1X?冇r,z[5q?zH{"/7LJՄѥ^|H%ҁ&r \~_~~qTdI6>y*qAQ8;|H۹}`!țewqڽ{O{9ǀ{|\I|vtpl_G>۷txM*~]C0^\;1%O Lh9(yx`|{? tv > Jc ϳ=_Eg]dd]}cI>:݋}!l$!X6[}ܳg). {~c1"1QLcϱBl-Cvp| \dG?xl&y.hށ?7ye>صkWK;Qѯ/ r D[O>3y_QxO|%.G?p >Euh^_\|;PzM;}M?@˥^4x#"x\}`SB??|0 y[+s?d4[)urĐ%I9"swD$wa18,/OX0K/Gn:;ЁMȪpL@p$sNBΓ> N#'gofFLtJFӪA}L5^a$G‹spi„s|wx6M4ciZmC'CC,.].=r‘7x Hɷú;W[Od씜\&}2,cC\O2p0< 'L X 9$>d [5nդ]0`0(~ ;+a|b(1?ѕqgcI1ܹ!`Xp9r'-?w0񶸇HxH} C 0MGup0p 8_)~gLGGnx?^HxJ=>-{o 9~/<.?鏬RFƾOOq֯؋BMAnFOrS |lS =>2w oe+)c YR4`oy\kF}{υuB}E^;d1 ?&"a׎lس]w|J3y쐎bN=C1=$n,Ҵ~S}O/?z[cԓQ0;<>jejsbiS=?_LM'_Zr{&^8egC?;%+y8;)L2݄'wɽ ÏANeO!Xx'm/9nvBt+[;/1~ctm G/r ~UMp7 'Qq_^E?0wF__ |п16@/)K 2:cϘ۠wt*ױ+&<3l;b-ES]ms䕶Cegn/&#`Rl/`'HaPav.t㿸??l)e`CZ\_I2}& ж?8r󶽯o@B#/~QyFy a:i\m;> A'A rԡ H"!wdiW71m<~ޖ{?)S4<-bdyb2CǾ} , /M7 9G;.]Nr/>K߰EXL%tS :1zmxa\ƎOc"a]Ȁ$D 珎&M,<Fg&䈌-_q9jTg'&mIJuNZd4 'DYth3Rq03]RNɞK.OO F"CϤY~CP<Y;̬ _~cdG;x"I~tLx:I1P|, ^:4AGgL*pyi|`O60xAN)S|bCؤ |~'r8I: ;ߨBœC*V ~6So=&=]SIp>| qQB9|g >/L>d'8S&y<>LxWc ?e\/y߉F O ~>>p\/e}Ǐd"p c{3v\&' >b؂>)݆YvБ ? z]aE)\t Fm&}] u1:Fc1f?*.pХ. -V`aЃz 0Nal =}t 8DMwpЙУ= i3i.|ct z%h|l}EEC-8 D].x\h@Sܡ6.sap(CmIcR_\q2eGX~8ic|43N r]~xzL>8;!8w N=<?vL04Cqb^;:kǮ ~9,:T{@=|.x* \&n>d?=Nzb?hEvS]ނ?+3W~nj64 N"6_~5'hP[Ћ#ߠ=w8;qDIB|MȮ oqyJݯ?8.ȮNYѵ^Jԟ(?0r[۶| :J_F5ؙĂ;;o0>+1؍?WNBE w]FBAп?@, ==Xŏ/c_+Vo v=|V_ȡ>A'~4c|h0~7rcO)g|?z =*1n?&^];vL[t8p@/ԏL ٹ>,vd FcrEqzypg ~en/(aH [3l@e@~?l4z뭡 mw`~چg/j{_ڀ.{+ix~q{4(> | ],$b|\{iG[\?%{ \C>SfL Lgn": A'psx ڦ_%t$[+(E( \]Ay 2 Ls|p 2 aPtT#Hr@`  Αf٤ n٤f̎)=;=n[5)hդeZcf4įߤ5:PdY'#N -EV)q)*OdwU&»\3L6'FܭdZ}{>]jM:"(%%Nд۶ErGNXEmmޱ:zуV.l`:[VOlW]lEikb#_jvf2|E{;c)زiCx'y|t8LNtlӎm.>9r'Mez§OسZ:[nuaRZN^{lN/ p$)[ 4 S \#VEtt\'m!s|vZ-;v${+8'$R?o{pr$ǻw:?bSA鰍۷Z5V ~C? voikjgt䔵u9ᕹ#x]eC߃8K]c󀕊WF4gC0~ͩF5wvJDO[H17zCcbDsƎJ6^**ڲkGg- [7yR;-=3te}| )giW?ϐG gm\F?S=ZPlݽ+>ݸmSİ| [oN'K˟rTzW_wm+ 좜`/~|?# s@iA~zy[x!Ǯڙ5Ƕ 4T>~r۱7aX]%s?.z7$vzNzxG z PָB'ѿLJ #:x`_E'ƙ -E;Oس s-/q?,&9q ?-~)ʥDpaWp/_"'?1/1>nOy bZnW3xC3oo ?<"i2W:}pȉc!z~n`&?@'r M[C38A't!c\PN0wĔd'e ]@ Cdy\r,hNpa HC"',646:;iir76-Ǵ( C Yl/ԁb2uv:ޟ5ni&X`qAgE AA‘F (yJAO(/++''<ع;* K#gKAO0hr6KNy?uJe`%|23saш'+.ء[nww)7YsN!.MzxG>n7rK0֭rs1Mn1f}RZC=$;g\itI`z7Q<))r>9emYT-a#'mjW,ڬGwm|9}묥YQF[-l9udms ̩f ^qI H"ɅW:O?N?tT2z\|Or[ښof=J5)`MKN6.r\Ze;.ܭnŬ\U۬$wM^o82x¯C*|:ϰ7`lߐ2CntI9m֬_ހ:ɉxBl0N?"9&lݼs>6n&^y;yx\ lUs&R99gHJ@ZvN<}m7 >?+E䈯 oSܺYi p'D=q)~)2ם9/3>33%9\-߿>Lb:;|E?>СV|O_4^;$z8%|poYAFGlB M + 'g>{&KsSH'_\x ?|78ݼb!:ʥ56 W&ټf4Ern'5G52_!vN7ݲ ~N]2]! Es[l[nɊ§EzCV7w\dg];:6i A7_>߾؟vPiפ~d'k}֠Wǥ rΝh[1-3n/sg˟A?U,|y- :9J?iٕ&GWӪvNWbZ6_BX=)Z\xaЯ̇+>z 6aн䣯^JkӱLmĮ|*66W!:?>aOg&!50Q]}l 8/6i%c_Ş_n7Ŗ}YHb Li~_=WuMy&]q=0;u9 :u;q<_m:ܥ-xbs @'r]k$/h t<|%x}0 o@[Ѝo=r\cO.E}{"p{X` ߔ .h /vǸd,:ù5r (QC+>7j`*4 C `W(C@Hf%;ϖN 8 8B0rRʗ.,:*RF)i1+0xp`r cE Zx|e@Ah@4u:fǬMzGp`dCYn 12Xچ|>(e`ta;1O la^F"'8L3"l&CDB (~I q%tp9~UvOd< (ڢ SA`a׀TSJ!$ȹ ppH:b`/p:IqJ>lc$*m^4 + 94^QY]G\ա tce 1ї'h?bϣx dIh51a?Q ! M ~e 82 ~3E4 7>iZ0??rimK>xݡm2F_N-;~.r 謫Mdb< ,r!G]f{??i˜A&i~@5C:{N/2!oEw8'xpo74ÁnjEw8E[d[p ]h.ƙd z84y>t'{‡pvQ=:79\q~ ~OeRpctih%t}+9I;;ӎgOeL#]A?f\S&tu >qA55Ӽ^Ǖ@:W3Ƣz A'<<Mc8A*}~/?[$}v= et2|ucf1eۻAmU8 _zGCCal[^l:0:77lɥ_~d~:{.1RyWcРCY/'~F|.J8wsPn?l!_蘫Wt}>J9@Yg؏^;ע?q͛+x?\*b}r o Xw|U b&*o-M/~ge$%;&?CgCڦyzo8`ĊsƘ;-:(Sn OZb]$!QNn| ]r/o2/r'[~=}mtbG?qF,y o oz/2w@><\Gti =}E'YC}?~d&]Bٸ[UF73w C> ]C[调y:/$t]lA>z%nC3Vf?|؇|֐YgLduF>o }>!>||@G{)[?wTD|?Yԑok%|,mjߡ@_EE^z 8Y(O5#lG]R0^}}w[~$u^_}7eqx3krP·K^?|05&芏5T5>NVGgثָWO A^tsl(]7zs D)<2/be;m|KiW̓$vοV/,nou8:|)ui,3Wܩ8f‸C{kaY[W,&i3|g>;8=tA.6'n;yj×ݸׇE`~\,iGc}dt#DHzы<,e{ӘOϷп>go׾B3o>9&䫊\+Dii.uvbuGW)Un}}:]WީWe?c{jlgx|-q>PNxmcKۇ&e^GgX#3^[!.!à v&[A)cϏNnp(AcFGq |tk)2]BG-!_/y|v-uc!A>KىqS WL5*Ą#p "0A1v*İiwIP* h[WMmJrNjs~77#s](>ho\=\/vq:A,e2yxxӫMoNcoW?rQ%ry;7C<)#'Iݏ>Wg7PWzxߵNFE{仨 DƼx4gok!ϼwIDATl@[ơ e#ᷳ7?\`|gyߍq䦏~j8wRZe0כOK3W<@wZT_ѹϳ'F/u#b'WxǶFgz2ls PҗMAȱr>H#q}^mw؏^UIYN'oaIFzU˗u@aΫ9\5 4ڵ(%^Tg:޽Mgɛ!Fu-O2a#y_y+1;q.zef:q]{`{}; {ۏ4ړ"_|}8qԼ)C{E_^/Yk3Qr{7=}Lg7vդND#Oy!?F䷥|+t/GS;gG\oKoMY+=3,= SZ_\uO>^9P1i]?\iG'rVH^io ̓|!q>۪yfkWUfĿӡ?=+˷ͤz]*;xBY.Ie⼘^ {19qr:cKJ[rC|q.tSGBx._,i`|]9gr7C.zq_>ơv#qʑWvځ9RG1 }|]_";^*%]ЀAuG\/~O԰È?8S1>gEb 蟸ϧu )w[7Gv+AD?{L)>^g?ԣ i5ź^}$1=$\_ sxύ\;߱G֟|LجcCm=8=ijZ?_ឋBoA9wF^rHal=z}:9x5AÔOL^5GB_qtt{SH|Y&|?k[_;#/s" Oչ_=~O|k{>jasyǴ]WzyI\@8vS9U[=>_53$=@|I =1}+Hs[ R_5<>5K'{{x kkВvb:Ry_ĀاWoo!v,y@!s@=gv[2)IENDB`hip-rocm-6.4.3/docs/data/understand/programming_model/simt.drawio000066400000000000000000000330111503277241100251370ustar00rootroot00000000000000 hip-rocm-6.4.3/docs/data/understand/programming_model/simt.svg000066400000000000000000000376141503277241100244660ustar00rootroot00000000000000
ADD
ADD
FM
FMA
FMA
FM
FMA
FMA
FM
FMA
FMA
FM
FMA
FMA
DIV
DIV
ADD
ADD
FM
FMA
FMA
FM
FMA
FMA
FM
FMA
FMA
FM
FMA
FMA
DIV
DIV
Text is not SVG - cannot display
hip-rocm-6.4.3/docs/data/understand/programming_model/thread_hierarchy.drawio000066400000000000000000023711131503277241100275020ustar00rootroot00000000000000 hip-rocm-6.4.3/docs/data/understand/programming_model/thread_hierarchy.svg000066400000000000000000016723701503277241100270240ustar00rootroot00000000000000 Grid
Block
Block
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Block
Block
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Block
Block
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Block
Block
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Block
Block
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Block
Block
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Block
Block
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Block
Block
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Block
Block
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Block
Block
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Block
Block
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Block
Block
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Warp
Text is not SVG - cannot display
hip-rocm-6.4.3/docs/data/understand/textures/000077500000000000000000000000001503277241100211375ustar00rootroot00000000000000hip-rocm-6.4.3/docs/data/understand/textures/border.png000066400000000000000000000021471503277241100231260ustar00rootroot00000000000000PNG  IHDR,,y}usBIT|dIDATxֱ 1A]tC}4`b".f2gOV1駾zlZ/p`d!X@`d!X@`d!X@`d!X@`d!X@`d!X@`d!X@`d!X@`d!X@`d!X@`d!X@`d!X@`d!X@`d!X@`d!X@`d!X@`d!X@`d!X@`k9w/2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C:7v2 , cXG2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , # IENDB`hip-rocm-6.4.3/docs/data/understand/textures/clamp.png000066400000000000000000000021721503277241100227430ustar00rootroot00000000000000PNG  IHDR,,y}usBIT|d1IDATxֱm1APWYJ*vd{ɘ=0XXL?cޯܴ;=Sd!X@`d!X@`d!X@`d!X@`d!X@`d!X@`d!X@`d!X@`d!X@`d!X@`d!X@`d!X@`d!X@`d!X@`d!X@`d!X@`d!X@`d!X@`dJGQ(97%G(|囏|Qro>JGQ(97%G(|囏|Qro>JGQ(97%G(|囏|Qro>JGQ(97%G(|囏|Qro>JGQ(97%G(|囏|Qro>JGQ(97%G(|囏|Qro>JGQ(97%G(|囏|Qro>JGQ(97%G(|囏|Qro>JGQ(97%G(|囏|Qro>JGQ(97%G(|囏|Qro>JGQ(97%G(|囏|Qro>JGQ(97%G(|囏|Qro>JGQ(97%G(|囏|Qro>JGQ(97%G(|囏|Qro>JGQ(97%G(|囏|Qro>JGQ(97%G(|囏|Qro>JGQ(97%G(|囏|Qro>JGQ(97%G(|囏|Qro>JGQ(97%Gҳ|R+TIENDB`hip-rocm-6.4.3/docs/data/understand/textures/original.png000066400000000000000000000006211503277241100234500ustar00rootroot00000000000000PNG  IHDRgAMA a cHRMz&u0`:pQ<PLTEbKGDhQ pHYsodtIME ;caNv,,sXYNIDAThA M@a i*+L*JRT*JRT*JU&T*JRT*JRT*J5zGM^%tEXtdate:create2024-08-05T10:48:55+00:00Ƣ%tEXtdate:modify2024-08-05T10:48:55+00:00vA~IENDB`hip-rocm-6.4.3/docs/data/understand/textures/wrap.png000066400000000000000000000022161503277241100226170ustar00rootroot00000000000000PNG  IHDR,,y}usBIT|dEIDATx1RC1A-;8pKL tg^RwZ{qd|=û:v{)2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 3x_c., C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 x< !_sa~ٷtk!wu΅d!X@`d!X@`d!X@`d!X@`d!X@`d!X@`d!X@`d!X@`d!X@`d!X@`d!X@`d!X@`d!X@`d!X@`d!X@`d!X@`d!X@`d!X@`޷Gt!9 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , C 2 , :M5MIENDB`hip-rocm-6.4.3/docs/data/unified_memory/000077500000000000000000000000001503277241100201205ustar00rootroot00000000000000hip-rocm-6.4.3/docs/data/unified_memory/um.drawio000066400000000000000000005154641503277241100217670ustar00rootroot00000000000000 hip-rocm-6.4.3/docs/data/unified_memory/um.svg000066400000000000000000012430251503277241100212710ustar00rootroot00000000000000 Explicit Memory Management
CPU cores
CPU cores
CPU
CPU
GPU Memory
(HBM)
GPU Memory...
Unified Memory Management
Unified Memory
(HBM)
Unified Memory...
GPU cores
GPU cores
CPU Memory (DRAM)
CPU Memory (DR...
GPU cores
GPU cores
CPU cores
CPU cores
GPU
GPU
APU
APU
Text is not SVG - cannot display
hip-rocm-6.4.3/docs/device_md_gen.py000066400000000000000000000204561503277241100173250ustar00rootroot00000000000000""" Copyright (c) 2015-2021 Advanced Micro Devices, Inc. All rights reserved. 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. """ """ 1. This files uses Python3 to run List of device functions: acosf acoshf asinf asinhf atan2f atanf atanhf cbrtf ceilf copysignf cosf coshf cospif cyl_bessel_i0f cyl_bessel_i1f erfcf erfcinvf erfcxf erff erfinvf exp10f exp2f expf expm1f fabsf fdimf fdividef floorf fmaf fmaxf fminf fmodf frexpf hypotf ilogbf isfinite isinf isnan j0f j1f jnf ldexpf lgammaf llrintf llroundf log10f log1pf logbf lrintf lroundf modff nanf nearbyintf nextafterf norm3df norm4df normcdff normcdfinvf normf powf rcbrtf remainderf remquof rhypotf rintf rnorm3df rnorm4df rnormf roundf rsqrtf scalblnf scalbnf signbit sincosf sincospif sinf sinhf sinpif sqrtf tanf tanhf tgammaf truncf y0f y1f ynf acos acosh asin asinh atan atan2 atanh cbrt ceil copysign cos cosh cospi cyl_bessel_i0 cyl_bessel_i1 erf erfc erfcinv erfcx erfinv exp exp10 exp2 expm1 fabs fdim floor fma fmax fmin fmod frexp hypot ilogb isfinite isinf isnan j0 j1 jn ldexp lgamma llrint llround log log10 log1p log2 logb lrint lround modf nan nearbyint nextafter norm norm3d norm4d normcdf normcdfinv pow rcbrt remainder remquo rhypot rint rnorm rnorm3d rnorm4d round rsqrt scalbln scalbn signbit sin sincos sincospi sinh sinpi sqrt tan tanh tgamma trunc y0 y1 yn __cosf __exp10f __expf __fadd_rd __fadd_rn __fadd_ru __fadd_rz __fdiv_rd __fdiv_rn __fdiv_ru __fdiv_rz __fdividef __fmaf_rd __fmaf_rn __fmaf_ru __fmaf_rz __fmul_rd __fmul_rn __fmul_ru __fmul_rz __frcp_rd __frcp_rn __frcp_ru __frcp_rz __frsqrt_rn __fsqrt_rd __fsqrt_rn __fsqrt_ru __fsqrt_rz __fsub_rd __fsub_rn __fsub_ru __log10f __log2f __logf __powf __saturatef __sincosf __sinf __tanf __dadd_rd __dadd_rn __dadd_ru __dadd_rz __ddiv_rd __ddiv_rn __ddiv_ru __ddiv_rz __dmul_rd __dmul_rn __dmul_ru __dmul_rz __drcp_rd __drcp_rn __drcp_ru __drcp_rz __dsqrt_rd __dsqrt_rn __dsqrt_ru __dsqrt_rz __dsub_rd __dsub_rn __dsub_ru __dsub_rz __fma_rd __fma_rn __fma_ru __fma_rz __brev __brevll __byte_perm __clz __clzll __ffs __ffsll __hadd __mul24 __mul64hi __mulhi __popc __popcll __rhadd __sad __uhadd __umul24 __umul64hi __umulhi __urhadd __usad __double2float_rd __double2float_rn __double2float_ru __double2float_rz __double2hiint __double2int_rd __double2int_rn __double2int_ru __double2int_rz __double2ll_rd __double2ll_rn __double2ll_ru __double2ll_rz __double2loint __double2uint_rd __double2uint_rn __double2uint_ru __double2uint_rz __double2ull_rd __double2ull_rn __double2ull_ru __double2ull_rz __double_as_longlong __float2half_rn __half2float __float2half_rn __half2float __float2int_rd __float2int_rn __float2int_ru __float2int_rz __float2ll_rd __float2ll_rn __float2ll_ru __float2ll_rz __float2uint_rd __float2uint_rn __float2uint_ru __float2uint_rz __float2ull_rd __float2ull_rn __float2ull_ru __float2ull_rz __float_as_int __float_as_uint __hiloint2double __int2double_rn __int2float_rd __int2float_rn __int2float_ru __int2float_rz __int_as_float __ll2double_rd __ll2double_rn __ll2double_ru __ll2double_rz __ll2float_rd __ll2float_rn __ll2float_ru __ll2float_rz __longlong_as_double __uint2double_rn __uint2float_rd __uint2float_rn __uint2float_ru __uint2float_rz __uint_as_float __ull2double_rd __ull2double_rn __ull2double_ru __ull2double_rz __ull2float_rd __ull2float_rn __ull2float_ru __ull2float_rz __heq __hge __hgt __hisinf __hisnan __hle __hlt __hne __hbeq2 __hbge2 __hbgt2 __hble2 __hblt2 __hbne2 __heq2 __hge2 __hgt2 __hisnan2 __hle2 __hlt2 __hne2 __float22half2_rn __float2half __float2half2_rn __float2half_rd __float2half_rn __float2half_ru __float2half_rz __floats2half2_rn __half22float2 __half2float half2half2 __half2int_rd __half2int_rn __half2int_ru __half2int_rz __half2ll_rd __half2ll_rn __half2ll_ru __half2ll_rz __half2short_rd __half2short_rn __half2short_ru __half2short_rz __half2uint_rd __half2uint_rn __half2uint_ru __half2uint_rz __half2ull_rd __half2ull_rn __half2ull_ru __half2ull_rz __half2ushort_rd __half2ushort_rn __half2ushort_ru __half2ushort_rz __half_as_short __half_as_ushort __halves2half2 __high2float __high2half __high2half2 __highs2half2 __int2half_rd __int2half_rn __int2half_ru __int2half_rz __ll2half_rd __ll2half_rn __ll2half_ru __ll2half_rz __low2float __low2half __low2half2 __low2half2 __lowhigh2highlow __lows2half2 __short2half_rd __short2half_rn __short2half_ru __short2half_rz __uint2half_rd __uint2half_rn __uint2half_ru __uint2half_rz __ull2half_rd __ull2half_rn __ull2half_ru __ull2half_rz __ushort2half_rd __ushort2half_rn __ushort2half_ru __ushort2half_rz __ushort_as_half """ # The dictionary is to place description of each device function. Expand it to all the device functions deviceFuncDesc = {'acosf': "This function returns floating point of arc cosine from a floating point input"} fnames = ["../../include/hip/amd_detail/math_functions.h","../../include/hip/amd_detail/device_functions.h","../../include/hip/amd_detail/hip_fp16.h"] markdownFileName = "./hip-math-api.md" preamble = "# HIP MATH APIs Documentation \n"+\ "HIP supports most of the device functions supported by CUDA. Way to find the unsupported one is to search for the function and check its description\n" + \ "Note: This document is not human generated. Any changes to this file will be discarded. Please make changes to Python3 script docs/markdown/device_md_gen.py\n\n" + \ "## For Developers \n" + \ "If you add or fixed a device function, make sure to add a signature of the function and definition later.\n" + \ "For example, if you want to add `__device__ float __dotf(float4, float4)`, which does a dot product on 4 float vector components \n" + \ "The way to add to the header is, \n" + \ "```cpp \n" + \ "__device__ static float __dotf(float4, float4); \n" + \ "/*Way down in the file....*/\n" + \ "__device__ static inline float __dotf(float4 x, float4 y) { \n" + \ " /*implementation*/\n}\n" + \ "```\n\n" + \ "This helps python script to add the device function newly declared into markdown documentation (as it looks at functions with `;` at the end and `__device__` at the beginning)\n\n" + \ "The next step would be to add Description to `deviceFuncDesc` dictionary in python script.\n" + \ "From the above example, it can be writtern as,\n`deviceFuncDesc['__dotf'] = 'This functions takes 2 4 component float vector and outputs dot product across them'`\n\n" def generateSnippet(name, description, signature): return "### " + name + "\n" + \ "```cpp \n" + signature + "\n```\n" + \ "**Description:** " + description + "\n\n\n" def getName(line): l1 = line.split('(') l2 = l1[0].split(' ') return l2[-1] with open(markdownFileName, 'w') as mdfd: mdfd.truncate() mdfd.write(preamble) for fname in fnames: with open(fname) as fd: lines = fd.readlines() for line in lines: if line.find('HIP_FAST_MATH') != -1: break; if line.find('__device__') != -1 and line.find(';') != -1 and line.find('hip') == -1: name = getName(line) if line.find('//') == -1: if name in deviceFuncDesc: mdfd.write(generateSnippet(name, deviceFuncDesc[name], line)) else: mdfd.write(generateSnippet(name, "Supported", line)) else: mdfd.write(generateSnippet(name, "**NOT Supported**", line)) fd.close() mdfd.close() hip-rocm-6.4.3/docs/doxygen-input/000077500000000000000000000000001503277241100170065ustar00rootroot00000000000000hip-rocm-6.4.3/docs/doxygen-input/doxy.cfg000066400000000000000000003355011503277241100204610ustar00rootroot00000000000000# Doxyfile 1.8.20 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project. # # All text after a double hash (##) is considered a comment and is placed in # front of the TAG it is preceding. # # All text after a single hash (#) is considered a comment and will be ignored. # The format is: # TAG = value [value, ...] # For lists, items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (\" \"). #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # This tag specifies the encoding used for all characters in the configuration # file that follow. The default is UTF-8 which is also the encoding used for all # text before the first occurrence of this tag. Doxygen uses libiconv (or the # iconv built into libc) for the transcoding. See # https://www.gnu.org/software/libiconv/ for the list of possible encodings. # The default value is: UTF-8. DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or a sequence of words surrounded by # double-quotes, unless you are using Doxywizard) that should identify the # project for which the documentation is generated. This name is used in the # title of most generated pages and in a few other places. # The default value is: My Project. PROJECT_NAME = "HIP: Heterogenous-computing Interface for Portability" # The PROJECT_NUMBER tag can be used to enter a project or revision number. This # could be handy for archiving the generated documentation or if some version # control system is used. PROJECT_NUMBER = # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a # quick idea about the purpose of the project. Keep the description short. PROJECT_BRIEF = # With the PROJECT_LOGO tag one can specify a logo or an icon that is included # in the documentation. The maximum height of the logo should not exceed 55 # pixels and the maximum width should not exceed 200 pixels. Doxygen will copy # the logo to the output directory. PROJECT_LOGO = # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path # into which the generated documentation will be written. If a relative path is # entered, it will be relative to the location where doxygen was started. If # left blank the current directory will be used. OUTPUT_DIRECTORY = RuntimeAPI # If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- # directories (in 2 levels) under the output directory of each output format and # will distribute the generated files over these directories. Enabling this # option can be useful when feeding doxygen a huge amount of source files, where # putting all generated files in the same directory would otherwise causes # performance problems for the file system. # The default value is: NO. CREATE_SUBDIRS = NO # If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII # characters to appear in the names of generated files. If set to NO, non-ASCII # characters will be escaped, for example _xE3_x81_x84 will be used for Unicode # U+3044. # The default value is: NO. ALLOW_UNICODE_NAMES = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, # Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), # Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, # Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), # Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, # Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, # Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, # Ukrainian and Vietnamese. # The default value is: English. OUTPUT_LANGUAGE = English # The OUTPUT_TEXT_DIRECTION tag is used to specify the direction in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all generated output in the proper direction. # Possible values are: None, LTR, RTL and Context. # The default value is: None. OUTPUT_TEXT_DIRECTION = None # If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member # descriptions after the members that are listed in the file and class # documentation (similar to Javadoc). Set to NO to disable this. # The default value is: YES. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief # description of a member or function before the detailed description # # Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. # The default value is: YES. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator that is # used to form the text in various listings. Each string in this list, if found # as the leading text of the brief description, will be stripped from the text # and the result, after processing the whole list, is used as the annotated # text. Otherwise, the brief description is used as-is. If left blank, the # following values are used ($name is automatically replaced with the name of # the entity):The $name class, The $name widget, The $name file, is, provides, # specifies, contains, represents, a, an and the. ABBREVIATE_BRIEF = "The $name class" \ "The $name widget" \ "The $name file" \ is \ provides \ specifies \ contains \ represents \ a \ an \ the # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # doxygen will generate a detailed section even if there is only a brief # description. # The default value is: NO. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. # The default value is: NO. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path # before files name in the file list and in the header files. If set to NO the # shortest path that makes the file name unique will be used # The default value is: YES. FULL_PATH_NAMES = YES # The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. # Stripping is only done if one of the specified strings matches the left-hand # part of the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the path to # strip. # # Note that you can specify absolute paths here, but also relative paths, which # will be relative from the directory where doxygen is started. # This tag requires that the tag FULL_PATH_NAMES is set to YES. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the # path mentioned in the documentation of a class, which tells the reader which # header file to include in order to use a class. If left blank only the name of # the header file containing the class definition is used. Otherwise one should # specify the list of include paths that are normally passed to the compiler # using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but # less readable) file names. This can be useful is your file systems doesn't # support long names like on DOS, Mac, or CD-ROM. # The default value is: NO. SHORT_NAMES = YES # If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the # first line (until the first dot) of a Javadoc-style comment as the brief # description. If set to NO, the Javadoc-style will behave just like regular Qt- # style comments (thus requiring an explicit @brief command for a brief # description.) # The default value is: NO. JAVADOC_AUTOBRIEF = NO # If the JAVADOC_BANNER tag is set to YES then doxygen will interpret a line # such as # /*************** # as being the beginning of a Javadoc-style comment "banner". If set to NO, the # Javadoc-style will behave just like regular comments and it will not be # interpreted by doxygen. # The default value is: NO. JAVADOC_BANNER = NO # If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first # line (until the first dot) of a Qt-style comment as the brief description. If # set to NO, the Qt-style will behave just like regular Qt-style comments (thus # requiring an explicit \brief command for a brief description.) # The default value is: NO. QT_AUTOBRIEF = NO # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a # multi-line C++ special comment block (i.e. a block of //! or /// comments) as # a brief description. This used to be the default behavior. The new default is # to treat a multi-line C++ comment block as a detailed description. Set this # tag to YES if you prefer the old behavior instead. # # Note that setting this tag to YES also means that rational rose comments are # not recognized any more. # The default value is: NO. MULTILINE_CPP_IS_BRIEF = NO # By default Python docstrings are displayed as preformatted text and doxygen's # special commands cannot be used. By setting PYTHON_DOCSTRING to NO the # doxygen's special commands can be used and the contents of the docstring # documentation blocks is shown as doxygen documentation. # The default value is: YES. PYTHON_DOCSTRING = YES # If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the # documentation from any documented member that it re-implements. # The default value is: YES. INHERIT_DOCS = YES # If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new # page for each member. If set to NO, the documentation of a member will be part # of the file/class/namespace that contains it. # The default value is: NO. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen # uses this value to replace tabs by spaces in code fragments. # Minimum value: 1, maximum value: 16, default value: 4. TAB_SIZE = 4 # This tag can be used to specify a number of aliases that act as commands in # the documentation. An alias has the form: # name=value # For example adding # "sideeffect=@par Side Effects:\n" # will allow you to put the command \sideeffect (or @sideeffect) in the # documentation, which will result in a user-defined paragraph with heading # "Side Effects:". You can put \n's in the value part of an alias to insert # newlines (in the resulting output). You can put ^^ in the value part of an # alias to insert a newline as if a physical newline was in the original file. # When you need a literal { or } or , in the value part of an alias you have to # escape them by means of a backslash (\), this can lead to conflicts with the # commands \{ and \} for these it is advised to use the version @{ and @} or use # a double escape (\\{ and \\}) ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources # only. Doxygen will then generate output that is more tailored for C. For # instance, some of the names that are used will be different. The list of all # members will be omitted, etc. # The default value is: NO. OPTIMIZE_OUTPUT_FOR_C = NO # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or # Python sources only. Doxygen will then generate output that is more tailored # for that language. For instance, namespaces will be presented as packages, # qualified scopes will look different, etc. # The default value is: NO. OPTIMIZE_OUTPUT_JAVA = NO # Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran # sources. Doxygen will then generate output that is tailored for Fortran. # The default value is: NO. OPTIMIZE_FOR_FORTRAN = NO # Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL # sources. Doxygen will then generate output that is tailored for VHDL. # The default value is: NO. OPTIMIZE_OUTPUT_VHDL = NO # Set the OPTIMIZE_OUTPUT_SLICE tag to YES if your project consists of Slice # sources only. Doxygen will then generate output that is more tailored for that # language. For instance, namespaces will be presented as modules, types will be # separated into more groups, etc. # The default value is: NO. OPTIMIZE_OUTPUT_SLICE = NO # Doxygen selects the parser to use depending on the extension of the files it # parses. With this tag you can assign which parser to use for a given # extension. Doxygen has a built-in mapping, but you can override or extend it # using this tag. The format is ext=language, where ext is a file extension, and # language is one of the parsers supported by doxygen: IDL, Java, JavaScript, # Csharp (C#), C, C++, D, PHP, md (Markdown), Objective-C, Python, Slice, VHDL, # Fortran (fixed format Fortran: FortranFixed, free formatted Fortran: # FortranFree, unknown formatted Fortran: Fortran. In the later case the parser # tries to guess whether the code is fixed or free formatted code, this is the # default for Fortran type files). For instance to make doxygen treat .inc files # as Fortran files (default is PHP), and .f files as C (default is Fortran), # use: inc=Fortran f=C. # # Note: For files without extension you can use no_extension as a placeholder. # # Note that for custom extensions you also need to set FILE_PATTERNS otherwise # the files are not read by doxygen. EXTENSION_MAPPING = # If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments # according to the Markdown format, which allows for more readable # documentation. See https://daringfireball.net/projects/markdown/ for details. # The output of markdown processing is further processed by doxygen, so you can # mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in # case of backward compatibilities issues. # The default value is: YES. MARKDOWN_SUPPORT = YES # When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up # to that level are automatically included in the table of contents, even if # they do not have an id attribute. # Note: This feature currently applies only to Markdown headings. # Minimum value: 0, maximum value: 99, default value: 5. # This tag requires that the tag MARKDOWN_SUPPORT is set to YES. TOC_INCLUDE_HEADINGS = 5 # When enabled doxygen tries to link words that correspond to documented # classes, or namespaces to their corresponding documentation. Such a link can # be prevented in individual cases by putting a % sign in front of the word or # globally by setting AUTOLINK_SUPPORT to NO. # The default value is: YES. AUTOLINK_SUPPORT = YES # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want # to include (a tag file for) the STL sources as input, then you should set this # tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); # versus func(std::string) {}). This also make the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. # The default value is: NO. BUILTIN_STL_SUPPORT = NO # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. # The default value is: NO. CPP_CLI_SUPPORT = NO # Set the SIP_SUPPORT tag to YES if your project consists of sip (see: # https://www.riverbankcomputing.com/software/sip/intro) sources only. Doxygen # will parse them like normal C++ but will assume all classes use public instead # of private inheritance when no explicit protection keyword is present. # The default value is: NO. SIP_SUPPORT = NO # For Microsoft's IDL there are propget and propput attributes to indicate # getter and setter methods for a property. Setting this option to YES will make # doxygen to replace the get and set methods by a property in the documentation. # This will only work if the methods are indeed getting or setting a simple # type. If this is not the case, or you want to show the methods anyway, you # should set this option to NO. # The default value is: YES. IDL_PROPERTY_SUPPORT = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. # The default value is: NO. DISTRIBUTE_GROUP_DOC = NO # If one adds a struct or class to a group and this option is enabled, then also # any nested class or struct is added to the same group. By default this option # is disabled and one has to add nested compounds explicitly via \ingroup. # The default value is: NO. GROUP_NESTED_COMPOUNDS = NO # Set the SUBGROUPING tag to YES to allow class member groups of the same type # (for instance a group of public functions) to be put as a subgroup of that # type (e.g. under the Public Functions section). Set it to NO to prevent # subgrouping. Alternatively, this can be done per class using the # \nosubgrouping command. # The default value is: YES. SUBGROUPING = YES # When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions # are shown inside the group in which they are included (e.g. using \ingroup) # instead of on a separate page (for HTML and Man pages) or section (for LaTeX # and RTF). # # Note that this feature does not work in combination with # SEPARATE_MEMBER_PAGES. # The default value is: NO. INLINE_GROUPED_CLASSES = NO # When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions # with only public data fields or simple typedef fields will be shown inline in # the documentation of the scope in which they are defined (i.e. file, # namespace, or group documentation), provided this scope is documented. If set # to NO, structs, classes, and unions are shown on a separate page (for HTML and # Man pages) or section (for LaTeX and RTF). # The default value is: NO. INLINE_SIMPLE_STRUCTS = NO # When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or # enum is documented as struct, union, or enum with the name of the typedef. So # typedef struct TypeS {} TypeT, will appear in the documentation as a struct # with name TypeT. When disabled the typedef will appear as a member of a file, # namespace, or class. And the struct will be named TypeS. This can typically be # useful for C code in case the coding convention dictates that all compound # types are typedef'ed and only the typedef is referenced, never the tag name. # The default value is: NO. TYPEDEF_HIDES_STRUCT = NO # The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This # cache is used to resolve symbols given their name and scope. Since this can be # an expensive process and often the same symbol appears multiple times in the # code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small # doxygen will become slower. If the cache is too large, memory is wasted. The # cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range # is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 # symbols. At the end of a run doxygen will report the cache usage and suggest # the optimal cache size from a speed point of view. # Minimum value: 0, maximum value: 9, default value: 0. LOOKUP_CACHE_SIZE = 0 # The NUM_PROC_THREADS specifies the number threads doxygen is allowed to use # during processing. When set to 0 doxygen will based this on the number of # cores available in the system. You can set it explicitly to a value larger # than 0 to get more control over the balance between CPU load and processing # speed. At this moment only the input processing can be done using multiple # threads. Since this is still an experimental feature the default is set to 1, # which efficively disables parallel processing. Please report any issues you # encounter. Generating dot graphs in parallel is controlled by the # DOT_NUM_THREADS setting. # Minimum value: 0, maximum value: 32, default value: 1. NUM_PROC_THREADS = 1 #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in # documentation are documented, even if no documentation was available. Private # class members and static file members will be hidden unless the # EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. # Note: This will also disable the warnings about undocumented members that are # normally produced when WARNINGS is set to YES. # The default value is: NO. EXTRACT_ALL = NO # If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will # be included in the documentation. # The default value is: NO. EXTRACT_PRIVATE = NO # If the EXTRACT_PRIV_VIRTUAL tag is set to YES, documented private virtual # methods of a class will be included in the documentation. # The default value is: NO. EXTRACT_PRIV_VIRTUAL = NO # If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal # scope will be included in the documentation. # The default value is: NO. EXTRACT_PACKAGE = NO # If the EXTRACT_STATIC tag is set to YES, all static members of a file will be # included in the documentation. # The default value is: NO. EXTRACT_STATIC = NO # If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined # locally in source files will be included in the documentation. If set to NO, # only classes defined in header files are included. Does not have any effect # for Java sources. # The default value is: YES. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. If set to YES, local methods, # which are defined in the implementation section but not in the interface are # included in the documentation. If set to NO, only methods in the interface are # included. # The default value is: NO. EXTRACT_LOCAL_METHODS = NO # If this flag is set to YES, the members of anonymous namespaces will be # extracted and appear in the documentation as a namespace called # 'anonymous_namespace{file}', where file will be replaced with the base name of # the file that contains the anonymous namespace. By default anonymous namespace # are hidden. # The default value is: NO. EXTRACT_ANON_NSPACES = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all # undocumented members inside documented classes or files. If set to NO these # members will be included in the various overviews, but no documentation # section is generated. This option has no effect if EXTRACT_ALL is enabled. # The default value is: NO. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. If set # to NO, these classes will be included in the various overviews. This option # has no effect if EXTRACT_ALL is enabled. # The default value is: NO. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend # declarations. If set to NO, these declarations will be included in the # documentation. # The default value is: NO. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any # documentation blocks found inside the body of a function. If set to NO, these # blocks will be appended to the function's detailed documentation block. # The default value is: NO. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation that is typed after a # \internal command is included. If the tag is set to NO then the documentation # will be excluded. Set it to YES to include the internal documentation. # The default value is: NO. INTERNAL_DOCS = YES # If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file # names in lower-case letters. If set to YES, upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # (including Cygwin) and Mac users are advised to set this option to NO. # The default value is: system dependent. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with # their full class and namespace scopes in the documentation. If set to YES, the # scope will be hidden. # The default value is: NO. HIDE_SCOPE_NAMES = NO # If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will # append additional text to a page's title, such as Class Reference. If set to # YES the compound reference will be hidden. # The default value is: NO. HIDE_COMPOUND_REFERENCE= NO # If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of # the files that are included by a file in the documentation of that file. # The default value is: YES. SHOW_INCLUDE_FILES = YES # If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each # grouped member an include statement to the documentation, telling the reader # which file to include in order to use the member. # The default value is: NO. SHOW_GROUPED_MEMB_INC = NO # If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include # files with double quotes in the documentation rather than with sharp brackets. # The default value is: NO. FORCE_LOCAL_INCLUDES = NO # If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the # documentation for inline members. # The default value is: YES. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the # (detailed) documentation of file and class members alphabetically by member # name. If set to NO, the members will appear in declaration order. # The default value is: YES. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief # descriptions of file, namespace and class members alphabetically by member # name. If set to NO, the members will appear in declaration order. Note that # this will also influence the order of the classes in the class list. # The default value is: NO. SORT_BRIEF_DOCS = NO # If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the # (brief and detailed) documentation of class members so that constructors and # destructors are listed first. If set to NO the constructors will appear in the # respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. # Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief # member documentation. # Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting # detailed member documentation. # The default value is: NO. SORT_MEMBERS_CTORS_1ST = NO # If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy # of group names into alphabetical order. If set to NO the group names will # appear in their defined order. # The default value is: NO. SORT_GROUP_NAMES = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by # fully-qualified names, including namespaces. If set to NO, the class list will # be sorted only by class name, not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the alphabetical # list. # The default value is: NO. SORT_BY_SCOPE_NAME = NO # If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper # type resolution of all parameters of a function it will reject a match between # the prototype and the implementation of a member function even if there is # only one candidate or it is obvious which candidate to choose by doing a # simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still # accept a match between prototype and implementation in such cases. # The default value is: NO. STRICT_PROTO_MATCHING = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo # list. This list is created by putting \todo commands in the documentation. # The default value is: YES. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test # list. This list is created by putting \test commands in the documentation. # The default value is: YES. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug # list. This list is created by putting \bug commands in the documentation. # The default value is: YES. GENERATE_BUGLIST = NO # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) # the deprecated list. This list is created by putting \deprecated commands in # the documentation. # The default value is: YES. GENERATE_DEPRECATEDLIST= NO # The ENABLED_SECTIONS tag can be used to enable conditional documentation # sections, marked by \if ... \endif and \cond # ... \endcond blocks. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the # initial value of a variable or macro / define can have for it to appear in the # documentation. If the initializer consists of more lines than specified here # it will be hidden. Use a value of 0 to hide initializers completely. The # appearance of the value of individual variables and macros / defines can be # controlled using \showinitializer or \hideinitializer command in the # documentation regardless of this setting. # Minimum value: 0, maximum value: 10000, default value: 30. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated at # the bottom of the documentation of classes and structs. If set to YES, the # list will mention the files that were used to generate the documentation. # The default value is: YES. SHOW_USED_FILES = YES # Set the SHOW_FILES tag to NO to disable the generation of the Files page. This # will remove the Files entry from the Quick Index and from the Folder Tree View # (if specified). # The default value is: YES. SHOW_FILES = YES # Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces # page. This will remove the Namespaces entry from the Quick Index and from the # Folder Tree View (if specified). # The default value is: YES. SHOW_NAMESPACES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from # the version control system). Doxygen will invoke the program by executing (via # popen()) the command command input-file, where command is the value of the # FILE_VERSION_FILTER tag, and input-file is the name of an input file provided # by doxygen. Whatever the program writes to standard output is used as the file # version. For an example see the documentation. FILE_VERSION_FILTER = # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed # by doxygen. The layout file controls the global structure of the generated # output files in an output format independent way. To create the layout file # that represents doxygen's defaults, run doxygen with the -l option. You can # optionally specify a file name after the option, if omitted DoxygenLayout.xml # will be used as the name of the layout file. # # Note that if you run doxygen from a directory containing a file called # DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE # tag is left empty. LAYOUT_FILE = # The CITE_BIB_FILES tag can be used to specify one or more bib files containing # the reference definitions. This must be a list of .bib files. The .bib # extension is automatically appended if omitted. This requires the bibtex tool # to be installed. See also https://en.wikipedia.org/wiki/BibTeX for more info. # For LaTeX the style of the bibliography can be controlled using # LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the # search path. See also \cite for info how to create references. CITE_BIB_FILES = #--------------------------------------------------------------------------- # Configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated to # standard output by doxygen. If QUIET is set to YES this implies that the # messages are off. # The default value is: NO. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated to standard error (stderr) by doxygen. If WARNINGS is set to YES # this implies that the warnings are on. # # Tip: Turn warnings on while writing the documentation. # The default value is: YES. WARNINGS = YES # If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate # warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag # will automatically be disabled. # The default value is: YES. WARN_IF_UNDOCUMENTED = YES # If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some parameters # in a documented function, or documenting parameters that don't exist or using # markup commands wrongly. # The default value is: YES. WARN_IF_DOC_ERROR = YES # This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that # are documented, but have no documentation for their parameters or return # value. If set to NO, doxygen will only warn about wrong or incomplete # parameter documentation, but not about the absence of documentation. If # EXTRACT_ALL is set to YES then this flag will automatically be disabled. # The default value is: NO. WARN_NO_PARAMDOC = NO # If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when # a warning is encountered. # The default value is: NO. WARN_AS_ERROR = NO # The WARN_FORMAT tag determines the format of the warning messages that doxygen # can produce. The string should contain the $file, $line, and $text tags, which # will be replaced by the file and line number from which the warning originated # and the warning text. Optionally the format may contain $version, which will # be replaced by the version of the file (if it could be obtained via # FILE_VERSION_FILTER) # The default value is: $file:$line: $text. WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning and error # messages should be written. If left blank the output is written to standard # error (stderr). WARN_LOGFILE = #--------------------------------------------------------------------------- # Configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag is used to specify the files and/or directories that contain # documented source files. You may enter file names like myfile.cpp or # directories like /usr/src/myproject. Separate the files or directories with # spaces. See also FILE_PATTERNS and EXTENSION_MAPPING # Note: If this tag is empty the current directory is searched. INPUT = mainpage.txt \ ../../README.md \ ../../CONTRIBUTING.md \ sync.txt \ ../../INSTALL.md \ ../../docs/markdown \ ../../include/hip \ ../../../hipamd/include/hip/amd_detail/ # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses # libiconv (or the iconv built into libc) for the transcoding. See the libiconv # documentation (see: https://www.gnu.org/software/libiconv/) for the list of # possible encodings. # The default value is: UTF-8. INPUT_ENCODING = UTF-8 # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and # *.h) to filter out the source-files in the directories. # # Note that for custom extensions or not directly supported extensions you also # need to set EXTENSION_MAPPING for the extension otherwise the files are not # read by doxygen. # # If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, # *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, # *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, # *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C comment), # *.doc (to be provided as doxygen C comment), *.txt (to be provided as doxygen # C comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f18, *.f, *.for, *.vhd, # *.vhdl, *.ucf, *.qsf and *.ice. FILE_PATTERNS = *.c \ *.cc \ *.cxx \ *.cpp \ *.h \ *.hpp \ *.md \ *.dox \ *.doc \ *.txt # The RECURSIVE tag can be used to specify whether or not subdirectories should # be searched for input files as well. # The default value is: NO. RECURSIVE = YES # The EXCLUDE tag can be used to specify files and/or directories that should be # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. # # Note that relative paths are relative to the directory from which doxygen is # run. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or # directories that are symbolic links (a Unix file system feature) are excluded # from the input. # The default value is: NO. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. # # Note that the wildcards are matched against the file with absolute path, so to # exclude all test directories for example use the pattern */test/* EXCLUDE_PATTERNS = # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, # AClass::ANamespace, ANamespace::*Test # # Note that the wildcards are matched against the file with absolute path, so to # exclude all test directories use the pattern */test/* EXCLUDE_SYMBOLS = # The EXAMPLE_PATH tag can be used to specify one or more files or directories # that contain example code fragments that are included (see the \include # command). EXAMPLE_PATH = ./examples # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and # *.h) to filter out the source-files in the directories. If left blank all # files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude commands # irrespective of the value of the RECURSIVE tag. # The default value is: NO. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or directories # that contain images that are to be included in the documentation (see the # \image command). IMAGE_PATH = images # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command: # # # # where is the value of the INPUT_FILTER tag, and is the # name of an input file. Doxygen will then use the output that the filter # program writes to standard output. If FILTER_PATTERNS is specified, this tag # will be ignored. # # Note that the filter must not add or remove lines; it is applied before the # code is scanned, but not when the output code is generated. If lines are added # or removed, the anchors will not be placed correctly. # # Note that for custom extensions or not directly supported extensions you also # need to set EXTENSION_MAPPING for the extension otherwise the files are not # properly processed by doxygen. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. Doxygen will compare the file name with each pattern and apply the # filter if there is a match. The filters are a list of the form: pattern=filter # (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how # filters are used. If the FILTER_PATTERNS tag is empty or if none of the # patterns match the file name, INPUT_FILTER is applied. # # Note that for custom extensions or not directly supported extensions you also # need to set EXTENSION_MAPPING for the extension otherwise the files are not # properly processed by doxygen. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will also be used to filter the input files that are used for # producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). # The default value is: NO. FILTER_SOURCE_FILES = NO # The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file # pattern. A pattern will override the setting for FILTER_PATTERN (if any) and # it is also possible to disable source filtering for a specific pattern using # *.ext= (so without naming a filter). # This tag requires that the tag FILTER_SOURCE_FILES is set to YES. FILTER_SOURCE_PATTERNS = # If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that # is part of the input, its contents will be placed on the main page # (index.html). This can be useful if you have a project on for instance GitHub # and want to reuse the introduction page also for the doxygen output. USE_MDFILE_AS_MAINPAGE = #--------------------------------------------------------------------------- # Configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will be # generated. Documented entities will be cross-referenced with these sources. # # Note: To get rid of all source code in the generated output, make sure that # also VERBATIM_HEADERS is set to NO. # The default value is: NO. SOURCE_BROWSER = NO # Setting the INLINE_SOURCES tag to YES will include the body of functions, # classes and enums directly into the documentation. # The default value is: NO. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any # special comment blocks from generated source code fragments. Normal C, C++ and # Fortran comments will always remain visible. # The default value is: YES. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES then for each documented # entity all documented functions referencing it will be listed. # The default value is: NO. REFERENCED_BY_RELATION = NO # If the REFERENCES_RELATION tag is set to YES then for each documented function # all documented entities called/used by that function will be listed. # The default value is: NO. REFERENCES_RELATION = NO # If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set # to YES then the hyperlinks from functions in REFERENCES_RELATION and # REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will # link to the documentation. # The default value is: YES. REFERENCES_LINK_SOURCE = YES # If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the # source code will show a tooltip with additional information such as prototype, # brief description and links to the definition and documentation. Since this # will make the HTML file larger and loading of large files a bit slower, you # can opt to disable this feature. # The default value is: YES. # This tag requires that the tag SOURCE_BROWSER is set to YES. SOURCE_TOOLTIPS = YES # If the USE_HTAGS tag is set to YES then the references to source code will # point to the HTML generated by the htags(1) tool instead of doxygen built-in # source browser. The htags tool is part of GNU's global source tagging system # (see https://www.gnu.org/software/global/global.html). You will need version # 4.8.6 or higher. # # To use it do the following: # - Install the latest version of global # - Enable SOURCE_BROWSER and USE_HTAGS in the configuration file # - Make sure the INPUT points to the root of the source tree # - Run doxygen as normal # # Doxygen will invoke htags (and that will in turn invoke gtags), so these # tools must be available from the command line (i.e. in the search path). # # The result: instead of the source browser generated by doxygen, the links to # source code will now point to the output of htags. # The default value is: NO. # This tag requires that the tag SOURCE_BROWSER is set to YES. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a # verbatim copy of the header file for each class for which an include is # specified. Set to NO to disable this. # See also: Section \class. # The default value is: YES. VERBATIM_HEADERS = YES # If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the # clang parser (see: http://clang.llvm.org/) for more accurate parsing at the # cost of reduced performance. This can be particularly helpful with template # rich C++ code for which doxygen's built-in parser lacks the necessary type # information. # Note: The availability of this option depends on whether or not doxygen was # generated with the -Duse_libclang=ON option for CMake. # The default value is: NO. CLANG_ASSISTED_PARSING = NO # If clang assisted parsing is enabled you can provide the compiler with command # line options that you would normally use when invoking the compiler. Note that # the include paths will already be set by doxygen for the files and directories # specified with INPUT and INCLUDE_PATH. # This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. CLANG_OPTIONS = # If clang assisted parsing is enabled you can provide the clang parser with the # path to the directory containing a file called compile_commands.json. This # file is the compilation database (see: # http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html) containing the # options used when the source files were built. This is equivalent to # specifying the "-p" option to a clang tool, such as clang-check. These options # will then be passed to the parser. Any options specified with CLANG_OPTIONS # will be added as well. # Note: The availability of this option depends on whether or not doxygen was # generated with the -Duse_libclang=ON option for CMake. CLANG_DATABASE_PATH = #--------------------------------------------------------------------------- # Configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all # compounds will be generated. Enable this if the project contains a lot of # classes, structs, unions or interfaces. # The default value is: YES. ALPHABETICAL_INDEX = YES # The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in # which the alphabetical index list will be split. # Minimum value: 1, maximum value: 20, default value: 5. # This tag requires that the tag ALPHABETICAL_INDEX is set to YES. COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all classes will # be put under the same header in the alphabetical index. The IGNORE_PREFIX tag # can be used to specify a prefix (or a list of prefixes) that should be ignored # while generating the index headers. # This tag requires that the tag ALPHABETICAL_INDEX is set to YES. IGNORE_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output # The default value is: YES. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a # relative path is entered the value of OUTPUT_DIRECTORY will be put in front of # it. # The default directory is: html. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for each # generated HTML page (for example: .htm, .php, .asp). # The default value is: .html. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a user-defined HTML header file for # each generated HTML page. If the tag is left blank doxygen will generate a # standard header. # # To get valid HTML the header file that includes any scripts and style sheets # that doxygen needs, which is dependent on the configuration options used (e.g. # the setting GENERATE_TREEVIEW). It is highly recommended to start with a # default header using # doxygen -w html new_header.html new_footer.html new_stylesheet.css # YourConfigFile # and then modify the file new_header.html. See also section "Doxygen usage" # for information on how to generate the default header that doxygen normally # uses. # Note: The header is subject to change so you typically have to regenerate the # default header when upgrading to a newer version of doxygen. For a description # of the possible markers and block names see the documentation. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each # generated HTML page. If the tag is left blank doxygen will generate a standard # footer. See HTML_HEADER for more information on how to generate a default # footer and what special commands can be used inside the footer. See also # section "Doxygen usage" for information on how to generate the default footer # that doxygen normally uses. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading style # sheet that is used by each HTML page. It can be used to fine-tune the look of # the HTML output. If left blank doxygen will generate a default style sheet. # See also section "Doxygen usage" for information on how to generate the style # sheet that doxygen normally uses. # Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as # it is more robust and this tag (HTML_STYLESHEET) will in the future become # obsolete. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_STYLESHEET = # The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined # cascading style sheets that are included after the standard style sheets # created by doxygen. Using this option one can overrule certain style aspects. # This is preferred over using HTML_STYLESHEET since it does not replace the # standard style sheet and is therefore more robust against future updates. # Doxygen will copy the style sheet files to the output directory. # Note: The order of the extra style sheet files is of importance (e.g. the last # style sheet in the list overrules the setting of the previous ones in the # list). For an example see the documentation. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_EXTRA_STYLESHEET = # The HTML_EXTRA_FILES tag can be used to specify one or more extra images or # other source files which should be copied to the HTML output directory. Note # that these files will be copied to the base HTML output directory. Use the # $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these # files. In the HTML_STYLESHEET file, use the file name only. Also note that the # files will be copied as-is; there are no commands or markers available. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_EXTRA_FILES = # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen # will adjust the colors in the style sheet and background images according to # this color. Hue is specified as an angle on a colorwheel, see # https://en.wikipedia.org/wiki/Hue for more information. For instance the value # 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 # purple, and 360 is red again. # Minimum value: 0, maximum value: 359, default value: 220. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_COLORSTYLE_HUE = 220 # The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors # in the HTML output. For a value of 0 the output will use grayscales only. A # value of 255 will produce the most vivid colors. # Minimum value: 0, maximum value: 255, default value: 100. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_COLORSTYLE_SAT = 100 # The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the # luminance component of the colors in the HTML output. Values below 100 # gradually make the output lighter, whereas values above 100 make the output # darker. The value divided by 100 is the actual gamma applied, so 80 represents # a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not # change the gamma. # Minimum value: 40, maximum value: 240, default value: 80. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_COLORSTYLE_GAMMA = 80 # If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML # page will contain the date and time when the page was generated. Setting this # to YES can help to show when doxygen was last run and thus if the # documentation is up to date. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_TIMESTAMP = YES # If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML # documentation will contain a main index with vertical navigation menus that # are dynamically created via JavaScript. If disabled, the navigation index will # consists of multiple levels of tabs that are statically embedded in every HTML # page. Disable this option to support browsers that do not have JavaScript, # like the Qt help browser. # The default value is: YES. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_DYNAMIC_MENUS = YES # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the # page has loaded. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_DYNAMIC_SECTIONS = NO # With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries # shown in the various tree structured indices initially; the user can expand # and collapse entries dynamically later on. Doxygen will expand the tree to # such a level that at most the specified number of entries are visible (unless # a fully collapsed tree already exceeds this amount). So setting the number of # entries 1 will produce a full collapsed tree by default. 0 is a special value # representing an infinite number of entries and will result in a full expanded # tree by default. # Minimum value: 0, maximum value: 9999, default value: 100. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_INDEX_NUM_ENTRIES = 100 # If the GENERATE_DOCSET tag is set to YES, additional index files will be # generated that can be used as input for Apple's Xcode 3 integrated development # environment (see: https://developer.apple.com/xcode/), introduced with OSX # 10.5 (Leopard). To create a documentation set, doxygen will generate a # Makefile in the HTML output directory. Running make will produce the docset in # that directory and running make install will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at # startup. See https://developer.apple.com/library/archive/featuredarticles/Doxy # genXcode/_index.html for more information. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_DOCSET = NO # This tag determines the name of the docset feed. A documentation feed provides # an umbrella under which multiple documentation sets from a single provider # (such as a company or product suite) can be grouped. # The default value is: Doxygen generated docs. # This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_FEEDNAME = "Doxygen generated docs" # This tag specifies a string that should uniquely identify the documentation # set bundle. This should be a reverse domain-name style string, e.g. # com.mycompany.MyDocSet. Doxygen will append .docset to the name. # The default value is: org.doxygen.Project. # This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_BUNDLE_ID = org.doxygen.Project # The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify # the documentation publisher. This should be a reverse domain-name style # string, e.g. com.mycompany.MyDocSet.documentation. # The default value is: org.doxygen.Publisher. # This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_PUBLISHER_ID = org.doxygen.Publisher # The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. # The default value is: Publisher. # This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_PUBLISHER_NAME = Publisher # If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three # additional HTML index files: index.hhp, index.hhc, and index.hhk. The # index.hhp is a project file that can be read by Microsoft's HTML Help Workshop # (see: https://www.microsoft.com/en-us/download/details.aspx?id=21138) on # Windows. # # The HTML Help Workshop contains a compiler that can convert all HTML output # generated by doxygen into a single compiled HTML file (.chm). Compiled HTML # files are now used as the Windows 98 help format, and will replace the old # Windows help format (.hlp) on all Windows platforms in the future. Compressed # HTML files also contain an index, a table of contents, and you can search for # words in the documentation. The HTML workshop also contains a viewer for # compressed HTML files. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_HTMLHELP = NO # The CHM_FILE tag can be used to specify the file name of the resulting .chm # file. You can add a path in front of the file if the result should not be # written to the html output directory. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. CHM_FILE = # The HHC_LOCATION tag can be used to specify the location (absolute path # including file name) of the HTML help compiler (hhc.exe). If non-empty, # doxygen will try to run the HTML help compiler on the generated index.hhp. # The file has to be specified with full path. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. HHC_LOCATION = # The GENERATE_CHI flag controls if a separate .chi index file is generated # (YES) or that it should be included in the main .chm file (NO). # The default value is: NO. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. GENERATE_CHI = NO # The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc) # and project file content. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. CHM_INDEX_ENCODING = # The BINARY_TOC flag controls whether a binary table of contents is generated # (YES) or a normal table of contents (NO) in the .chm file. Furthermore it # enables the Previous and Next buttons. # The default value is: NO. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members to # the table of contents of the HTML help documentation and to the tree view. # The default value is: NO. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. TOC_EXPAND = NO # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and # QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that # can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help # (.qch) of the generated HTML documentation. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_QHP = NO # If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify # the file name of the resulting .qch file. The path specified is relative to # the HTML output folder. # This tag requires that the tag GENERATE_QHP is set to YES. QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help # Project output. For more information please see Qt Help Project / Namespace # (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace). # The default value is: org.doxygen.Project. # This tag requires that the tag GENERATE_QHP is set to YES. QHP_NAMESPACE = org.doxygen.Project # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt # Help Project output. For more information please see Qt Help Project / Virtual # Folders (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual- # folders). # The default value is: doc. # This tag requires that the tag GENERATE_QHP is set to YES. QHP_VIRTUAL_FOLDER = doc # If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom # filter to add. For more information please see Qt Help Project / Custom # Filters (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom- # filters). # This tag requires that the tag GENERATE_QHP is set to YES. QHP_CUST_FILTER_NAME = # The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the # custom filter to add. For more information please see Qt Help Project / Custom # Filters (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom- # filters). # This tag requires that the tag GENERATE_QHP is set to YES. QHP_CUST_FILTER_ATTRS = # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this # project's filter section matches. Qt Help Project / Filter Attributes (see: # https://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes). # This tag requires that the tag GENERATE_QHP is set to YES. QHP_SECT_FILTER_ATTRS = # The QHG_LOCATION tag can be used to specify the location of Qt's # qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the # generated .qhp file. # This tag requires that the tag GENERATE_QHP is set to YES. QHG_LOCATION = # If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be # generated, together with the HTML files, they form an Eclipse help plugin. To # install this plugin and make it available under the help contents menu in # Eclipse, the contents of the directory containing the HTML and XML files needs # to be copied into the plugins directory of eclipse. The name of the directory # within the plugins directory should be the same as the ECLIPSE_DOC_ID value. # After copying Eclipse needs to be restarted before the help appears. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_ECLIPSEHELP = NO # A unique identifier for the Eclipse help plugin. When installing the plugin # the directory name containing the HTML and XML files should also have this # name. Each documentation set should have its own identifier. # The default value is: org.doxygen.Project. # This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. ECLIPSE_DOC_ID = org.doxygen.Project # If you want full control over the layout of the generated HTML pages it might # be necessary to disable the index and replace it with your own. The # DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top # of each HTML page. A value of NO enables the index and the value YES disables # it. Since the tabs in the index contain the same information as the navigation # tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. DISABLE_INDEX = NO # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index # structure should be generated to display hierarchical information. If the tag # value is set to YES, a side panel will be generated containing a tree-like # index structure (just like the one that is generated for HTML Help). For this # to work a browser that supports JavaScript, DHTML, CSS and frames is required # (i.e. any modern browser). Windows users are probably better off using the # HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can # further fine-tune the look of the index. As an example, the default style # sheet generated by doxygen has an example that shows how to put an image at # the root of the tree instead of the PROJECT_NAME. Since the tree basically has # the same information as the tab index, you could consider setting # DISABLE_INDEX to YES when enabling this option. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_TREEVIEW = NO # The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that # doxygen will group on one line in the generated HTML documentation. # # Note that a value of 0 will completely suppress the enum values from appearing # in the overview section. # Minimum value: 0, maximum value: 20, default value: 4. # This tag requires that the tag GENERATE_HTML is set to YES. ENUM_VALUES_PER_LINE = 4 # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used # to set the initial width (in pixels) of the frame in which the tree is shown. # Minimum value: 0, maximum value: 1500, default value: 250. # This tag requires that the tag GENERATE_HTML is set to YES. TREEVIEW_WIDTH = 250 # If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to # external symbols imported via tag files in a separate window. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. EXT_LINKS_IN_WINDOW = NO # If the HTML_FORMULA_FORMAT option is set to svg, doxygen will use the pdf2svg # tool (see https://github.com/dawbarton/pdf2svg) or inkscape (see # https://inkscape.org) to generate formulas as SVG images instead of PNGs for # the HTML output. These images will generally look nicer at scaled resolutions. # Possible values are: png (the default) and svg (looks nicer but requires the # pdf2svg or inkscape tool). # The default value is: png. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_FORMULA_FORMAT = png # Use this tag to change the font size of LaTeX formulas included as images in # the HTML documentation. When you change the font size after a successful # doxygen run you need to manually remove any form_*.png images from the HTML # output directory to force them to be regenerated. # Minimum value: 8, maximum value: 50, default value: 10. # This tag requires that the tag GENERATE_HTML is set to YES. FORMULA_FONTSIZE = 10 # Use the FORMULA_TRANSPARENT tag to determine whether or not the images # generated for formulas are transparent PNGs. Transparent PNGs are not # supported properly for IE 6.0, but are supported on all modern browsers. # # Note that when changing this option you need to delete any form_*.png files in # the HTML output directory before the changes have effect. # The default value is: YES. # This tag requires that the tag GENERATE_HTML is set to YES. FORMULA_TRANSPARENT = YES # The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands # to create new LaTeX commands to be used in formulas as building blocks. See # the section "Including formulas" for details. FORMULA_MACROFILE = # Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see # https://www.mathjax.org) which uses client side JavaScript for the rendering # instead of using pre-rendered bitmaps. Use this if you do not have LaTeX # installed or if you want to formulas look prettier in the HTML output. When # enabled you may also need to install MathJax separately and configure the path # to it using the MATHJAX_RELPATH option. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. USE_MATHJAX = NO # When MathJax is enabled you can set the default output format to be used for # the MathJax output. See the MathJax site (see: # http://docs.mathjax.org/en/latest/output.html) for more details. # Possible values are: HTML-CSS (which is slower, but has the best # compatibility), NativeMML (i.e. MathML) and SVG. # The default value is: HTML-CSS. # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_FORMAT = HTML-CSS # When MathJax is enabled you need to specify the location relative to the HTML # output directory using the MATHJAX_RELPATH option. The destination directory # should contain the MathJax.js script. For instance, if the mathjax directory # is located at the same level as the HTML output directory, then # MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax # Content Delivery Network so you can quickly see the result without installing # MathJax. However, it is strongly recommended to install a local copy of # MathJax from https://www.mathjax.org before deployment. # The default value is: https://cdn.jsdelivr.net/npm/mathjax@2. # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_RELPATH = https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/ # The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax # extension names that should be enabled during MathJax rendering. For example # MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_EXTENSIONS = # The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces # of code that will be used on startup of the MathJax code. See the MathJax site # (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an # example see the documentation. # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_CODEFILE = # When the SEARCHENGINE tag is enabled doxygen will generate a search box for # the HTML output. The underlying search engine uses javascript and DHTML and # should work on any modern browser. Note that when using HTML help # (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) # there is already a search function so this one should typically be disabled. # For large projects the javascript based search engine can be slow, then # enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to # search using the keyboard; to jump to the search box use + S # (what the is depends on the OS and browser, but it is typically # , /
memcpyToSymbol example * in the HIP Porting Guide. * * * @param[out] symbol pointer to the device symbole * @param[in] src pointer to the source address * @param[in] sizeBytes size in bytes to copy * @param[in] offset offset in bytes from start of symbole * @param[in] kind type of memory transfer * * @returns #hipSuccess, #hipErrorInvalidValue * */ hipError_t hipMemcpyToSymbol(const void* symbol, const void* src, size_t sizeBytes, size_t offset __dparm(0), hipMemcpyKind kind __dparm(hipMemcpyHostToDevice)); /** * @brief Copies data to the given symbol on the device asynchronously. * * @param[out] symbol pointer to the device symbole * @param[in] src pointer to the source address * @param[in] sizeBytes size in bytes to copy * @param[in] offset offset in bytes from start of symbole * @param[in] kind type of memory transfer * @param[in] stream stream identifier * * @returns #hipSuccess, #hipErrorInvalidValue * */ hipError_t hipMemcpyToSymbolAsync(const void* symbol, const void* src, size_t sizeBytes, size_t offset, hipMemcpyKind kind, hipStream_t stream __dparm(0)); /** * @brief Copies data from the given symbol on the device. * * @param[out] dst Returns pointer to destinition memory address * @param[in] symbol Pointer to the symbole address on the device * @param[in] sizeBytes Size in bytes to copy * @param[in] offset Offset in bytes from the start of symbole * @param[in] kind Type of memory transfer * * @returns #hipSuccess, #hipErrorInvalidValue * */ hipError_t hipMemcpyFromSymbol(void* dst, const void* symbol, size_t sizeBytes, size_t offset __dparm(0), hipMemcpyKind kind __dparm(hipMemcpyDeviceToHost)); /** * @brief Copies data from the given symbol on the device asynchronously. * * @param[out] dst Returns pointer to destinition memory address * @param[in] symbol pointer to the symbole address on the device * @param[in] sizeBytes size in bytes to copy * @param[in] offset offset in bytes from the start of symbole * @param[in] kind type of memory transfer * @param[in] stream stream identifier * * @returns #hipSuccess, #hipErrorInvalidValue * */ hipError_t hipMemcpyFromSymbolAsync(void* dst, const void* symbol, size_t sizeBytes, size_t offset, hipMemcpyKind kind, hipStream_t stream __dparm(0)); /** * @brief Copy data from src to dst asynchronously. * * @warning If host or dest are not pinned, the memory copy will be performed synchronously. For * best performance, use hipHostMalloc to allocate host memory that is transferred asynchronously. * * @warning on HCC hipMemcpyAsync does not support overlapped H2D and D2H copies. * For hipMemcpy, the copy is always performed by the device associated with the specified stream. * * For multi-gpu or peer-to-peer configurations, it is recommended to use a stream which is a * attached to the device where the src data is physically located. For optimal peer-to-peer copies, * the copy device must be able to access the src and dst pointers (by calling * hipDeviceEnablePeerAccess with copy agent as the current device and src/dest as the peerDevice * argument. if this is not done, the hipMemcpy will still work, but will perform the copy using a * staging buffer on the host. * * @param[out] dst Data being copy to * @param[in] src Data being copy from * @param[in] sizeBytes Data size in bytes * @param[in] kind Type of memory transfer * @param[in] stream Stream identifier * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorUnknown * * @see hipMemcpy, hipMemcpy2D, hipMemcpyToArray, hipMemcpy2DToArray, hipMemcpyFromArray, * hipMemcpy2DFromArray, hipMemcpyArrayToArray, hipMemcpy2DArrayToArray, hipMemcpyToSymbol, * hipMemcpyFromSymbol, hipMemcpy2DAsync, hipMemcpyToArrayAsync, hipMemcpy2DToArrayAsync, * hipMemcpyFromArrayAsync, hipMemcpy2DFromArrayAsync, hipMemcpyToSymbolAsync, * hipMemcpyFromSymbolAsync */ hipError_t hipMemcpyAsync(void* dst, const void* src, size_t sizeBytes, hipMemcpyKind kind, hipStream_t stream __dparm(0)); /** * @brief Fills the first sizeBytes bytes of the memory area pointed to by dest with the constant * byte value value. * * @param[out] dst Data being filled * @param[in] value Value to be set * @param[in] sizeBytes Data size in bytes * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotInitialized */ hipError_t hipMemset(void* dst, int value, size_t sizeBytes); /** * @brief Fills the first sizeBytes bytes of the memory area pointed to by dest with the constant * byte value value. * * @param[out] dest Data ptr to be filled * @param[in] value Value to be set * @param[in] count Number of values to be set * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotInitialized */ hipError_t hipMemsetD8(hipDeviceptr_t dest, unsigned char value, size_t count); /** * @brief Fills the first sizeBytes bytes of the memory area pointed to by dest with the constant * byte value value. * * hipMemsetD8Async() is asynchronous with respect to the host, so the call may return before the * memset is complete. The operation can optionally be associated to a stream by passing a non-zero * stream argument. If stream is non-zero, the operation may overlap with operations in other * streams. * * @param[out] dest Data ptr to be filled * @param[in] value Constant value to be set * @param[in] count Number of values to be set * @param[in] stream Stream identifier * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotInitialized */ hipError_t hipMemsetD8Async(hipDeviceptr_t dest, unsigned char value, size_t count, hipStream_t stream __dparm(0)); /** * @brief Fills the first sizeBytes bytes of the memory area pointed to by dest with the constant * short value value. * * @param[out] dest Data ptr to be filled * @param[in] value Constant value to be set * @param[in] count Number of values to be set * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotInitialized */ hipError_t hipMemsetD16(hipDeviceptr_t dest, unsigned short value, size_t count); /** * @brief Fills the first sizeBytes bytes of the memory area pointed to by dest with the constant * short value value. * * hipMemsetD16Async() is asynchronous with respect to the host, so the call may return before the * memset is complete. The operation can optionally be associated to a stream by passing a non-zero * stream argument. If stream is non-zero, the operation may overlap with operations in other * streams. * * @param[out] dest Data ptr to be filled * @param[in] value Constant value to be set * @param[in] count Number of values to be set * @param[in] stream Stream identifier * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotInitialized */ hipError_t hipMemsetD16Async(hipDeviceptr_t dest, unsigned short value, size_t count, hipStream_t stream __dparm(0)); /** * @brief Fills the memory area pointed to by dest with the constant integer * value for specified number of times. * * @param[out] dest Data being filled * @param[in] value Constant value to be set * @param[in] count Number of values to be set * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotInitialized */ hipError_t hipMemsetD32(hipDeviceptr_t dest, int value, size_t count); /** * @brief Fills the first sizeBytes bytes of the memory area pointed to by dev with the constant * byte value value. * * hipMemsetAsync() is asynchronous with respect to the host, so the call may return before the * memset is complete. The operation can optionally be associated to a stream by passing a non-zero * stream argument. If stream is non-zero, the operation may overlap with operations in other * streams. * * @param[out] dst Pointer to device memory * @param[in] value Value to set for each byte of specified memory * @param[in] sizeBytes Size in bytes to set * @param[in] stream Stream identifier * @return #hipSuccess, #hipErrorInvalidValue */ hipError_t hipMemsetAsync(void* dst, int value, size_t sizeBytes, hipStream_t stream __dparm(0)); /** * @brief Fills the memory area pointed to by dev with the constant integer * value for specified number of times. * * hipMemsetD32Async() is asynchronous with respect to the host, so the call may return before the * memset is complete. The operation can optionally be associated to a stream by passing a non-zero * stream argument. If stream is non-zero, the operation may overlap with operations in other * streams. * * @param[out] dst Pointer to device memory * @param[in] value Value to set for each byte of specified memory * @param[in] count Number of values to be set * @param[in] stream Stream identifier * @return #hipSuccess, #hipErrorInvalidValue */ hipError_t hipMemsetD32Async(hipDeviceptr_t dst, int value, size_t count, hipStream_t stream __dparm(0)); /** * @brief Fills the memory area pointed to by dst with the constant value. * * @param[out] dst Pointer to device memory * @param[in] pitch Data size in bytes * @param[in] value Constant value to be set * @param[in] width * @param[in] height * @returns #hipSuccess, #hipErrorInvalidValue */ hipError_t hipMemset2D(void* dst, size_t pitch, int value, size_t width, size_t height); /** * @brief Fills asynchronously the memory area pointed to by dst with the constant value. * * @param[in] dst Pointer to 2D device memory * @param[in] pitch Pitch size in bytes * @param[in] value Value to be set for each byte of specified memory * @param[in] width Width of matrix set columns in bytes * @param[in] height Height of matrix set rows in bytes * @param[in] stream Stream identifier * @returns #hipSuccess, #hipErrorInvalidValue */ hipError_t hipMemset2DAsync(void* dst, size_t pitch, int value, size_t width, size_t height,hipStream_t stream __dparm(0)); /** * @brief Fills synchronously the memory area pointed to by pitchedDevPtr with the constant value. * * @param[in] pitchedDevPtr Pointer to pitched device memory * @param[in] value Value to set for each byte of specified memory * @param[in] extent Size parameters for width field in bytes in device memory * @returns #hipSuccess, #hipErrorInvalidValue */ hipError_t hipMemset3D(hipPitchedPtr pitchedDevPtr, int value, hipExtent extent ); /** * @brief Fills asynchronously the memory area pointed to by pitchedDevPtr with the constant value. * * @param[in] pitchedDevPtr Pointer to pitched device memory * @param[in] value Value to set for each byte of specified memory * @param[in] extent Size parameters for width field in bytes in device memory * @param[in] stream Stream identifier * @returns #hipSuccess, #hipErrorInvalidValue */ hipError_t hipMemset3DAsync(hipPitchedPtr pitchedDevPtr, int value, hipExtent extent ,hipStream_t stream __dparm(0)); /** * @brief Query memory info. * * On ROCM, this function gets the actual free memory left on the current device, so supports * the cases while running multi-workload (such as multiple processes, multiple threads, and * multiple GPUs). * * @warning On Windows, the free memory only accounts for memory allocated by this process and may * be optimistic. * * @param[out] free Returns free memory on the current device in bytes * @param[out] total Returns total allocatable memory on the current device in bytes * * @returns #hipSuccess, #hipErrorInvalidDevice, #hipErrorInvalidValue * **/ hipError_t hipMemGetInfo(size_t* free, size_t* total); /** * @brief Get allocated memory size via memory pointer. * * This function gets the allocated shared virtual memory size from memory pointer. * * @param[in] ptr Pointer to allocated memory * @param[out] size Returns the allocated memory size in bytes * * @returns #hipSuccess, #hipErrorInvalidValue * **/ hipError_t hipMemPtrGetInfo(void* ptr, size_t* size); /** * @brief Allocate an array on the device. * * @param[out] array Pointer to allocated array in device memory * @param[in] desc Requested channel format * @param[in] width Requested array allocation width * @param[in] height Requested array allocation height * @param[in] flags Requested properties of allocated array * @returns #hipSuccess, #hipErrorOutOfMemory * * @see hipMalloc, hipMallocPitch, hipFree, hipFreeArray, hipHostMalloc, hipHostFree */ hipError_t hipMallocArray(hipArray_t* array, const hipChannelFormatDesc* desc, size_t width, size_t height __dparm(0), unsigned int flags __dparm(hipArrayDefault)); /** * @brief Create an array memory pointer on the device. * * @param[out] pHandle Pointer to the array memory * @param[in] pAllocateArray Requested array desciptor * * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported * * @see hipMallocArray, hipArrayDestroy, hipFreeArray */ hipError_t hipArrayCreate(hipArray_t* pHandle, const HIP_ARRAY_DESCRIPTOR* pAllocateArray); /** * @brief Destroy an array memory pointer on the device. * * @param[in] array Pointer to the array memory * * @returns #hipSuccess, #hipErrorInvalidValue * * @see hipArrayCreate, hipArrayDestroy, hipFreeArray */ hipError_t hipArrayDestroy(hipArray_t array); /** * @brief Create a 3D array memory pointer on the device. * * @param[out] array Pointer to the 3D array memory * @param[in] pAllocateArray Requested array desciptor * * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported * * @see hipMallocArray, hipArrayDestroy, hipFreeArray */ hipError_t hipArray3DCreate(hipArray_t* array, const HIP_ARRAY3D_DESCRIPTOR* pAllocateArray); /** * @brief Create a 3D memory pointer on the device. * * @param[out] pitchedDevPtr Pointer to the 3D memory * @param[in] extent Requested extent * * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported * * @see hipMallocPitch, hipMemGetInfo, hipFree */ hipError_t hipMalloc3D(hipPitchedPtr* pitchedDevPtr, hipExtent extent); /** * @brief Frees an array on the device. * * @param[in] array Pointer to array to free * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotInitialized * * @see hipMalloc, hipMallocPitch, hipFree, hipMallocArray, hipHostMalloc, hipHostFree */ hipError_t hipFreeArray(hipArray_t array); /** * @brief Allocate an array on the device. * * @param[out] array Pointer to allocated array in device memory * @param[in] desc Requested channel format * @param[in] extent Requested array allocation width, height and depth * @param[in] flags Requested properties of allocated array * @returns #hipSuccess, #hipErrorOutOfMemory * * @see hipMalloc, hipMallocPitch, hipFree, hipFreeArray, hipHostMalloc, hipHostFree */ hipError_t hipMalloc3DArray(hipArray_t* array, const struct hipChannelFormatDesc* desc, struct hipExtent extent, unsigned int flags); /** * @brief Gets info about the specified array * * @param[out] desc - Returned array type * @param[out] extent - Returned array shape. 2D arrays will have depth of zero * @param[out] flags - Returned array flags * @param[in] array - The HIP array to get info for * * @returns #hipSuccess, #hipErrorInvalidValue #hipErrorInvalidHandle * * @see hipArrayGetDescriptor, hipArray3DGetDescriptor */ hipError_t hipArrayGetInfo(hipChannelFormatDesc* desc, hipExtent* extent, unsigned int* flags, hipArray_t array); /** * @brief Gets a 1D or 2D array descriptor * * @param[out] pArrayDescriptor - Returned array descriptor * @param[in] array - Array to get descriptor of * * @returns #hipSuccess, #hipErrorDeinitialized, #hipErrorNotInitialized, #hipErrorInvalidContext, * #hipErrorInvalidValue #hipErrorInvalidHandle * * @see hipArray3DCreate, hipArray3DGetDescriptor, hipArrayCreate, hipArrayDestroy, hipMemAlloc, * hipMemAllocHost, hipMemAllocPitch, hipMemcpy2D, hipMemcpy2DAsync, hipMemcpy2DUnaligned, * hipMemcpy3D, hipMemcpy3DAsync, hipMemcpyAtoA, hipMemcpyAtoD, hipMemcpyAtoH, hipMemcpyAtoHAsync, * hipMemcpyDtoA, hipMemcpyDtoD, hipMemcpyDtoDAsync, hipMemcpyDtoH, hipMemcpyDtoHAsync, * hipMemcpyHtoA, hipMemcpyHtoAAsync, hipMemcpyHtoD, hipMemcpyHtoDAsync, hipMemFree, * hipMemFreeHost, hipMemGetAddressRange, hipMemGetInfo, hipMemHostAlloc, * hipMemHostGetDevicePointer, hipMemsetD8, hipMemsetD16, hipMemsetD32, hipArrayGetInfo */ hipError_t hipArrayGetDescriptor(HIP_ARRAY_DESCRIPTOR* pArrayDescriptor, hipArray_t array); /** * @brief Gets a 3D array descriptor * * @param[out] pArrayDescriptor - Returned 3D array descriptor * @param[in] array - 3D array to get descriptor of * * @returns #hipSuccess, #hipErrorDeinitialized, #hipErrorNotInitialized, #hipErrorInvalidContext, * #hipErrorInvalidValue #hipErrorInvalidHandle, #hipErrorContextIsDestroyed * * @see hipArray3DCreate, hipArrayCreate, hipArrayDestroy, hipArrayGetDescriptor, hipMemAlloc, * hipMemAllocHost, hipMemAllocPitch, hipMemcpy2D, hipMemcpy2DAsync, hipMemcpy2DUnaligned, * hipMemcpy3D, hipMemcpy3DAsync, hipMemcpyAtoA, hipMemcpyAtoD, hipMemcpyAtoH, hipMemcpyAtoHAsync, * hipMemcpyDtoA, hipMemcpyDtoD, hipMemcpyDtoDAsync, hipMemcpyDtoH, hipMemcpyDtoHAsync, * hipMemcpyHtoA, hipMemcpyHtoAAsync, hipMemcpyHtoD, hipMemcpyHtoDAsync, hipMemFree, * hipMemFreeHost, hipMemGetAddressRange, hipMemGetInfo, hipMemHostAlloc, * hipMemHostGetDevicePointer, hipMemsetD8, hipMemsetD16, hipMemsetD32, hipArrayGetInfo */ hipError_t hipArray3DGetDescriptor(HIP_ARRAY3D_DESCRIPTOR* pArrayDescriptor, hipArray_t array); /** * @brief Copies data between host and device. * * @param[in] dst Destination memory address * @param[in] dpitch Pitch of destination memory * @param[in] src Source memory address * @param[in] spitch Pitch of source memory * @param[in] width Width of matrix transfer (columns in bytes) * @param[in] height Height of matrix transfer (rows) * @param[in] kind Type of transfer * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorInvalidPitchValue, * #hipErrorInvalidDevicePointer, #hipErrorInvalidMemcpyDirection * * @see hipMemcpy, hipMemcpyToArray, hipMemcpy2DToArray, hipMemcpyFromArray, hipMemcpyToSymbol, * hipMemcpyAsync */ hipError_t hipMemcpy2D(void* dst, size_t dpitch, const void* src, size_t spitch, size_t width, size_t height, hipMemcpyKind kind); /** * @brief Copies memory for 2D arrays. * @param[in] pCopy Parameters for the memory copy * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorInvalidPitchValue, * #hipErrorInvalidDevicePointer, #hipErrorInvalidMemcpyDirection * * @see hipMemcpy, hipMemcpy2D, hipMemcpyToArray, hipMemcpy2DToArray, hipMemcpyFromArray, * hipMemcpyToSymbol, hipMemcpyAsync */ hipError_t hipMemcpyParam2D(const hip_Memcpy2D* pCopy); /** * @brief Copies memory for 2D arrays. * @param[in] pCopy Parameters for the memory copy * @param[in] stream Stream to use * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorInvalidPitchValue, * #hipErrorInvalidDevicePointer, #hipErrorInvalidMemcpyDirection * * @see hipMemcpy, hipMemcpy2D, hipMemcpyToArray, hipMemcpy2DToArray, hipMemcpyFromArray, * hipMemcpyToSymbol, hipMemcpyAsync */ hipError_t hipMemcpyParam2DAsync(const hip_Memcpy2D* pCopy, hipStream_t stream __dparm(0)); /** * @brief Copies data between host and device. * * @param[in] dst Destination memory address * @param[in] dpitch Pitch of destination memory * @param[in] src Source memory address * @param[in] spitch Pitch of source memory * @param[in] width Width of matrix transfer (columns in bytes) * @param[in] height Height of matrix transfer (rows) * @param[in] kind Type of transfer * @param[in] stream Stream to use * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorInvalidPitchValue, * #hipErrorInvalidDevicePointer, #hipErrorInvalidMemcpyDirection * * @see hipMemcpy, hipMemcpyToArray, hipMemcpy2DToArray, hipMemcpyFromArray, hipMemcpyToSymbol, * hipMemcpyAsync */ hipError_t hipMemcpy2DAsync(void* dst, size_t dpitch, const void* src, size_t spitch, size_t width, size_t height, hipMemcpyKind kind, hipStream_t stream __dparm(0)); /** * @brief Copies data between host and device. * * @param[in] dst Destination memory address * @param[in] wOffset Destination starting X offset * @param[in] hOffset Destination starting Y offset * @param[in] src Source memory address * @param[in] spitch Pitch of source memory * @param[in] width Width of matrix transfer (columns in bytes) * @param[in] height Height of matrix transfer (rows) * @param[in] kind Type of transfer * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorInvalidPitchValue, * #hipErrorInvalidDevicePointer, #hipErrorInvalidMemcpyDirection * * @see hipMemcpy, hipMemcpyToArray, hipMemcpy2D, hipMemcpyFromArray, hipMemcpyToSymbol, * hipMemcpyAsync */ hipError_t hipMemcpy2DToArray(hipArray_t dst, size_t wOffset, size_t hOffset, const void* src, size_t spitch, size_t width, size_t height, hipMemcpyKind kind); /** * @brief Copies data between host and device. * * @param[in] dst Destination memory address * @param[in] wOffset Destination starting X offset * @param[in] hOffset Destination starting Y offset * @param[in] src Source memory address * @param[in] spitch Pitch of source memory * @param[in] width Width of matrix transfer (columns in bytes) * @param[in] height Height of matrix transfer (rows) * @param[in] kind Type of transfer * @param[in] stream Accelerator view which the copy is being enqueued * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorInvalidPitchValue, * #hipErrorInvalidDevicePointer, #hipErrorInvalidMemcpyDirection * * @see hipMemcpy, hipMemcpyToArray, hipMemcpy2D, hipMemcpyFromArray, hipMemcpyToSymbol, * hipMemcpyAsync */ hipError_t hipMemcpy2DToArrayAsync(hipArray_t dst, size_t wOffset, size_t hOffset, const void* src, size_t spitch, size_t width, size_t height, hipMemcpyKind kind, hipStream_t stream __dparm(0)); /** * @brief Copies data between host and device. * * @param[in] dst Destination memory address * @param[in] wOffsetDst Destination starting X offset * @param[in] hOffsetDst Destination starting Y offset * @param[in] src Source memory address * @param[in] wOffsetSrc Source starting X offset * @param[in] hOffsetSrc Source starting Y offset (columns in bytes) * @param[in] width Width of matrix transfer (columns in bytes) * @param[in] height Height of matrix transfer (rows) * @param[in] kind Type of transfer * * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorInvalidMemcpyDirection * * @see hipMemcpy, hipMemcpyToArray, hipMemcpy2D, hipMemcpyFromArray, hipMemcpyToSymbol, * hipMemcpyAsync */ hipError_t hipMemcpy2DArrayToArray(hipArray_t dst, size_t wOffsetDst, size_t hOffsetDst, hipArray_const_t src, size_t wOffsetSrc, size_t hOffsetSrc, size_t width, size_t height, hipMemcpyKind kind); /** * @brief Copies data between host and device [Deprecated] * * @ingroup MemoryD * * @param[in] dst Destination memory address * @param[in] wOffset Destination starting X offset * @param[in] hOffset Destination starting Y offset * @param[in] src Source memory address * @param[in] count size in bytes to copy * @param[in] kind Type of transfer * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorInvalidPitchValue, * #hipErrorInvalidDevicePointer, #hipErrorInvalidMemcpyDirection * * @see hipMemcpy, hipMemcpy2DToArray, hipMemcpy2D, hipMemcpyFromArray, hipMemcpyToSymbol, * hipMemcpyAsync * @warning This API is deprecated. */ HIP_DEPRECATED(HIP_DEPRECATED_MSG) hipError_t hipMemcpyToArray(hipArray_t dst, size_t wOffset, size_t hOffset, const void* src, size_t count, hipMemcpyKind kind); /** * @brief Copies data between host and device [Deprecated] * * @ingroup MemoryD * * @param[in] dst Destination memory address * @param[in] srcArray Source memory address * @param[in] wOffset Source starting X offset * @param[in] hOffset Source starting Y offset * @param[in] count Size in bytes to copy * @param[in] kind Type of transfer * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorInvalidPitchValue, * #hipErrorInvalidDevicePointer, #hipErrorInvalidMemcpyDirection * * @see hipMemcpy, hipMemcpy2DToArray, hipMemcpy2D, hipMemcpyFromArray, hipMemcpyToSymbol, * hipMemcpyAsync * @warning This API is deprecated. */ HIP_DEPRECATED(HIP_DEPRECATED_MSG) hipError_t hipMemcpyFromArray(void* dst, hipArray_const_t srcArray, size_t wOffset, size_t hOffset, size_t count, hipMemcpyKind kind); /** * @brief Copies data between host and device. * * @param[in] dst Destination memory address * @param[in] dpitch Pitch of destination memory * @param[in] src Source memory address * @param[in] wOffset Source starting X offset * @param[in] hOffset Source starting Y offset * @param[in] width Width of matrix transfer (columns in bytes) * @param[in] height Height of matrix transfer (rows) * @param[in] kind Type of transfer * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorInvalidPitchValue, * #hipErrorInvalidDevicePointer, #hipErrorInvalidMemcpyDirection * * @see hipMemcpy, hipMemcpy2DToArray, hipMemcpy2D, hipMemcpyFromArray, hipMemcpyToSymbol, * hipMemcpyAsync */ hipError_t hipMemcpy2DFromArray( void* dst, size_t dpitch, hipArray_const_t src, size_t wOffset, size_t hOffset, size_t width, size_t height, hipMemcpyKind kind); /** * @brief Copies data between host and device asynchronously. * * @param[in] dst Destination memory address * @param[in] dpitch Pitch of destination memory * @param[in] src Source memory address * @param[in] wOffset Source starting X offset * @param[in] hOffset Source starting Y offset * @param[in] width Width of matrix transfer (columns in bytes) * @param[in] height Height of matrix transfer (rows) * @param[in] kind Type of transfer * @param[in] stream Accelerator view which the copy is being enqueued * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorInvalidPitchValue, * #hipErrorInvalidDevicePointer, #hipErrorInvalidMemcpyDirection * * @see hipMemcpy, hipMemcpy2DToArray, hipMemcpy2D, hipMemcpyFromArray, hipMemcpyToSymbol, * hipMemcpyAsync */ hipError_t hipMemcpy2DFromArrayAsync( void* dst, size_t dpitch, hipArray_const_t src, size_t wOffset, size_t hOffset, size_t width, size_t height, hipMemcpyKind kind, hipStream_t stream __dparm(0)); /** * @brief Copies data between host and device. * * @param[in] dst Destination memory address * @param[in] srcArray Source array * @param[in] srcOffset Offset in bytes of source array * @param[in] count Size of memory copy in bytes * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorInvalidPitchValue, * #hipErrorInvalidDevicePointer, #hipErrorInvalidMemcpyDirection * * @see hipMemcpy, hipMemcpy2DToArray, hipMemcpy2D, hipMemcpyFromArray, hipMemcpyToSymbol, * hipMemcpyAsync */ hipError_t hipMemcpyAtoH(void* dst, hipArray_t srcArray, size_t srcOffset, size_t count); /** * @brief Copies data between host and device. * * @param[in] dstArray Destination memory address * @param[in] dstOffset Offset in bytes of destination array * @param[in] srcHost Source host pointer * @param[in] count Size of memory copy in bytes * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorInvalidPitchValue, * #hipErrorInvalidDevicePointer, #hipErrorInvalidMemcpyDirection * * @see hipMemcpy, hipMemcpy2DToArray, hipMemcpy2D, hipMemcpyFromArray, hipMemcpyToSymbol, * hipMemcpyAsync */ hipError_t hipMemcpyHtoA(hipArray_t dstArray, size_t dstOffset, const void* srcHost, size_t count); /** * @brief Copies data between host and device. * * @param[in] p 3D memory copy parameters * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorInvalidPitchValue, * #hipErrorInvalidDevicePointer, #hipErrorInvalidMemcpyDirection * * @see hipMemcpy, hipMemcpy2DToArray, hipMemcpy2D, hipMemcpyFromArray, hipMemcpyToSymbol, * hipMemcpyAsync */ hipError_t hipMemcpy3D(const struct hipMemcpy3DParms* p); /** * @brief Copies data between host and device asynchronously. * * @param[in] p 3D memory copy parameters * @param[in] stream Stream to use * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorInvalidPitchValue, * #hipErrorInvalidDevicePointer, #hipErrorInvalidMemcpyDirection * * @see hipMemcpy, hipMemcpy2DToArray, hipMemcpy2D, hipMemcpyFromArray, hipMemcpyToSymbol, * hipMemcpyAsync */ hipError_t hipMemcpy3DAsync(const struct hipMemcpy3DParms* p, hipStream_t stream __dparm(0)); /** * @brief Copies data between host and device. * * @param[in] pCopy 3D memory copy parameters * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorInvalidPitchValue, * #hipErrorInvalidDevicePointer, #hipErrorInvalidMemcpyDirection * * @see hipMemcpy, hipMemcpy2DToArray, hipMemcpy2D, hipMemcpyFromArray, hipMemcpyToSymbol, * hipMemcpyAsync */ hipError_t hipDrvMemcpy3D(const HIP_MEMCPY3D* pCopy); /** * @brief Copies data between host and device asynchronously. * * @param[in] pCopy 3D memory copy parameters * @param[in] stream Stream to use * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorInvalidPitchValue, * #hipErrorInvalidDevicePointer, #hipErrorInvalidMemcpyDirection * * @see hipMemcpy, hipMemcpy2DToArray, hipMemcpy2D, hipMemcpyFromArray, hipMemcpyToSymbol, * hipMemcpyAsync */ hipError_t hipDrvMemcpy3DAsync(const HIP_MEMCPY3D* pCopy, hipStream_t stream); // doxygen end Memory /** * @} */ /** *------------------------------------------------------------------------------------------------- *------------------------------------------------------------------------------------------------- * @defgroup PeerToPeer PeerToPeer Device Memory Access * @{ * @warning PeerToPeer support is experimental. * This section describes the PeerToPeer device memory access functions of HIP runtime API. */ /** * @brief Determine if a device can access a peer's memory. * * @param [out] canAccessPeer Returns the peer access capability (0 or 1) * @param [in] deviceId - device from where memory may be accessed. * @param [in] peerDeviceId - device where memory is physically located * * Returns "1" in @p canAccessPeer if the specified @p device is capable * of directly accessing memory physically located on peerDevice , or "0" if not. * * Returns "0" in @p canAccessPeer if deviceId == peerDeviceId, and both are valid devices : a * device is not a peer of itself. * * @returns #hipSuccess, * @returns #hipErrorInvalidDevice if deviceId or peerDeviceId are not valid devices */ hipError_t hipDeviceCanAccessPeer(int* canAccessPeer, int deviceId, int peerDeviceId); /** * @brief Enable direct access from current device's virtual address space to memory allocations * physically located on a peer device. * * Memory which already allocated on peer device will be mapped into the address space of the * current device. In addition, all future memory allocations on peerDeviceId will be mapped into * the address space of the current device when the memory is allocated. The peer memory remains * accessible from the current device until a call to hipDeviceDisablePeerAccess or hipDeviceReset. * * * @param [in] peerDeviceId Peer device to enable direct access to from the current device * @param [in] flags Reserved for future use, must be zero * * Returns #hipSuccess, #hipErrorInvalidDevice, #hipErrorInvalidValue, * @returns #hipErrorPeerAccessAlreadyEnabled if peer access is already enabled for this device. */ hipError_t hipDeviceEnablePeerAccess(int peerDeviceId, unsigned int flags); /** * @brief Disable direct access from current device's virtual address space to memory allocations * physically located on a peer device. * * Returns hipErrorPeerAccessNotEnabled if direct access to memory on peerDevice has not yet been * enabled from the current device. * * @param [in] peerDeviceId Peer device to disable direct access to * * @returns #hipSuccess, #hipErrorPeerAccessNotEnabled */ hipError_t hipDeviceDisablePeerAccess(int peerDeviceId); /** * @brief Get information on memory allocations. * * @param [out] pbase - BAse pointer address * @param [out] psize - Size of allocation * @param [in] dptr- Device Pointer * * @returns #hipSuccess, #hipErrorNotFound * * @see hipCtxCreate, hipCtxDestroy, hipCtxGetFlags, hipCtxPopCurrent, hipCtxGetCurrent, * hipCtxSetCurrent, hipCtxPushCurrent, hipCtxSetCacheConfig, hipCtxSynchronize, hipCtxGetDevice */ hipError_t hipMemGetAddressRange(hipDeviceptr_t* pbase, size_t* psize, hipDeviceptr_t dptr); #ifndef USE_PEER_NON_UNIFIED #define USE_PEER_NON_UNIFIED 1 #endif #if USE_PEER_NON_UNIFIED == 1 /** * @brief Copies memory from one device to memory on another device. * * @param [out] dst - Destination device pointer. * @param [in] dstDeviceId - Destination device * @param [in] src - Source device pointer * @param [in] srcDeviceId - Source device * @param [in] sizeBytes - Size of memory copy in bytes * * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorInvalidDevice */ hipError_t hipMemcpyPeer(void* dst, int dstDeviceId, const void* src, int srcDeviceId, size_t sizeBytes); /** * @brief Copies memory from one device to memory on another device. * * @param [out] dst - Destination device pointer. * @param [in] dstDeviceId - Destination device * @param [in] src - Source device pointer * @param [in] srcDevice - Source device * @param [in] sizeBytes - Size of memory copy in bytes * @param [in] stream - Stream identifier * * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorInvalidDevice */ hipError_t hipMemcpyPeerAsync(void* dst, int dstDeviceId, const void* src, int srcDevice, size_t sizeBytes, hipStream_t stream __dparm(0)); #endif // doxygen end PeerToPeer /** * @} */ /** *------------------------------------------------------------------------------------------------- *------------------------------------------------------------------------------------------------- * @defgroup Context Context Management [Deprecated] * @{ * This section describes the context management functions of HIP runtime API. * * @warning * * On the AMD platform, context management APIs are deprecated as there are better alternate * interfaces, such as using hipSetDevice and stream APIs to achieve the required functionality. * * On the NVIDIA platform, CUDA supports the driver API that defines "Context" and "Devices" as * separate entities. Each context contains a single device, which can theoretically have multiple * contexts. HIP initially added limited support for these APIs to facilitate easy porting from * existing driver codes. * * These APIs are only for equivalent driver APIs on the NVIDIA platform. * */ /** * @brief Create a context and set it as current/default context * * @param [out] ctx Context to create * @param [in] flags Context creation flags * @param [in] device device handle * * @returns #hipSuccess * * @see hipCtxDestroy, hipCtxGetFlags, hipCtxPopCurrent, hipCtxGetCurrent, hipCtxPushCurrent, * hipCtxSetCacheConfig, hipCtxSynchronize, hipCtxGetDevice * * @warning This API is deprecated on the AMD platform, only for equivalent cuCtx driver API on the * NVIDIA platform. * */ HIP_DEPRECATED(HIP_DEPRECATED_MSG) hipError_t hipCtxCreate(hipCtx_t* ctx, unsigned int flags, hipDevice_t device); /** * @brief Destroy a HIP context [Deprecated] * * @param [in] ctx Context to destroy * * @returns #hipSuccess, #hipErrorInvalidValue * * @see hipCtxCreate, hipCtxGetFlags, hipCtxPopCurrent, hipCtxGetCurrent,hipCtxSetCurrent, * hipCtxPushCurrent, hipCtxSetCacheConfig, hipCtxSynchronize , hipCtxGetDevice * * @warning This API is deprecated on the AMD platform, only for equivalent cuCtx driver API on the * NVIDIA platform. */ HIP_DEPRECATED(HIP_DEPRECATED_MSG) hipError_t hipCtxDestroy(hipCtx_t ctx); /** * @brief Pop the current/default context and return the popped context [Deprecated] * * @param [out] ctx The current context to pop * * @returns #hipSuccess, #hipErrorInvalidContext * * @see hipCtxCreate, hipCtxDestroy, hipCtxGetFlags, hipCtxSetCurrent, hipCtxGetCurrent, * hipCtxPushCurrent, hipCtxSetCacheConfig, hipCtxSynchronize, hipCtxGetDevice * * @warning This API is deprecated on the AMD platform, only for equivalent cuCtx driver API on the * NVIDIA platform. */ HIP_DEPRECATED(HIP_DEPRECATED_MSG) hipError_t hipCtxPopCurrent(hipCtx_t* ctx); /** * @brief Push the context to be set as current/ default context [Deprecated] * * @param [in] ctx The current context to push * * @returns #hipSuccess, #hipErrorInvalidContext * * @see hipCtxCreate, hipCtxDestroy, hipCtxGetFlags, hipCtxPopCurrent, hipCtxGetCurrent, * hipCtxPushCurrent, hipCtxSetCacheConfig, hipCtxSynchronize , hipCtxGetDevice * * @warning This API is deprecated on the AMD platform, only for equivalent cuCtx driver API on the * NVIDIA platform. */ HIP_DEPRECATED(HIP_DEPRECATED_MSG) hipError_t hipCtxPushCurrent(hipCtx_t ctx); /** * @brief Set the passed context as current/default [Deprecated] * * @param [in] ctx The context to set as current * * @returns #hipSuccess, #hipErrorInvalidContext * * @see hipCtxCreate, hipCtxDestroy, hipCtxGetFlags, hipCtxPopCurrent, hipCtxGetCurrent, * hipCtxPushCurrent, hipCtxSetCacheConfig, hipCtxSynchronize , hipCtxGetDevice * * @warning This API is deprecated on the AMD platform, only for equivalent cuCtx driver API on the * NVIDIA platform. */ HIP_DEPRECATED(HIP_DEPRECATED_MSG) hipError_t hipCtxSetCurrent(hipCtx_t ctx); /** * @brief Get the handle of the current/ default context [Deprecated] * * @param [out] ctx The context to get as current * * @returns #hipSuccess, #hipErrorInvalidContext * * @see hipCtxCreate, hipCtxDestroy, hipCtxGetDevice, hipCtxGetFlags, hipCtxPopCurrent, * hipCtxPushCurrent, hipCtxSetCacheConfig, hipCtxSynchronize, hipCtxGetDevice * * @warning This API is deprecated on the AMD platform, only for equivalent cuCtx driver API on the * NVIDIA platform. */ HIP_DEPRECATED(HIP_DEPRECATED_MSG) hipError_t hipCtxGetCurrent(hipCtx_t* ctx); /** * @brief Get the handle of the device associated with current/default context [Deprecated] * * @param [out] device The device from the current context * * @returns #hipSuccess, #hipErrorInvalidContext * * @see hipCtxCreate, hipCtxDestroy, hipCtxGetFlags, hipCtxPopCurrent, hipCtxGetCurrent, * hipCtxPushCurrent, hipCtxSetCacheConfig, hipCtxSynchronize * * @warning This API is deprecated on the AMD platform, only for equivalent cuCtx driver API on the * NVIDIA platform. */ HIP_DEPRECATED(HIP_DEPRECATED_MSG) hipError_t hipCtxGetDevice(hipDevice_t* device); /** * @brief Returns the approximate HIP api version. * * @param [in] ctx Context to check [Deprecated] * @param [out] apiVersion API version to get * * @returns #hipSuccess * * @warning The HIP feature set does not correspond to an exact CUDA SDK api revision. * This function always set *apiVersion to 4 as an approximation though HIP supports * some features which were introduced in later CUDA SDK revisions. * HIP apps code should not rely on the api revision number here and should * use arch feature flags to test device capabilities or conditional compilation. * * @see hipCtxCreate, hipCtxDestroy, hipCtxGetDevice, hipCtxGetFlags, hipCtxPopCurrent, * hipCtxPushCurrent, hipCtxSetCacheConfig, hipCtxSynchronize, hipCtxGetDevice * * @warning This API is deprecated on the AMD platform, only for equivalent cuCtx driver API on the * NVIDIA platform. */ HIP_DEPRECATED(HIP_DEPRECATED_MSG) hipError_t hipCtxGetApiVersion(hipCtx_t ctx, int* apiVersion); /** * @brief Get Cache configuration for a specific function [Deprecated] * * @param [out] cacheConfig Cache configuration * * @returns #hipSuccess * * @warning AMD devices and some Nvidia GPUS do not support reconfigurable cache. This hint is * ignored on those architectures. * * @see hipCtxCreate, hipCtxDestroy, hipCtxGetFlags, hipCtxPopCurrent, hipCtxGetCurrent, * hipCtxSetCurrent, hipCtxPushCurrent, hipCtxSetCacheConfig, hipCtxSynchronize, hipCtxGetDevice * * @warning This API is deprecated on the AMD platform, only for equivalent cuCtx driver API on the * NVIDIA platform. */ HIP_DEPRECATED(HIP_DEPRECATED_MSG) hipError_t hipCtxGetCacheConfig(hipFuncCache_t* cacheConfig); /** * @brief Set L1/Shared cache partition [Deprecated] * * @param [in] cacheConfig Cache configuration to set * * @return #hipSuccess * * @warning AMD devices and some Nvidia GPUS do not support reconfigurable cache. This hint is * ignored on those architectures. * * @see hipCtxCreate, hipCtxDestroy, hipCtxGetFlags, hipCtxPopCurrent, hipCtxGetCurrent, * hipCtxSetCurrent, hipCtxPushCurrent, hipCtxSetCacheConfig, hipCtxSynchronize, hipCtxGetDevice * * @warning This API is deprecated on the AMD platform, only for equivalent cuCtx driver API on the * NVIDIA platform. */ HIP_DEPRECATED(HIP_DEPRECATED_MSG) hipError_t hipCtxSetCacheConfig(hipFuncCache_t cacheConfig); /** * @brief Set Shared memory bank configuration [Deprecated] * * @param [in] config Shared memory configuration to set * * @return #hipSuccess * * @warning AMD devices and some Nvidia GPUS do not support shared cache banking, and the hint is * ignored on those architectures. * * @see hipCtxCreate, hipCtxDestroy, hipCtxGetFlags, hipCtxPopCurrent, hipCtxGetCurrent, * hipCtxSetCurrent, hipCtxPushCurrent, hipCtxSetCacheConfig, hipCtxSynchronize, hipCtxGetDevice * * @warning This API is deprecated on the AMD platform, only for equivalent cuCtx driver API on the * NVIDIA platform. */ HIP_DEPRECATED(HIP_DEPRECATED_MSG) hipError_t hipCtxSetSharedMemConfig(hipSharedMemConfig config); /** * @brief Get Shared memory bank configuration [Deprecated] * * @param [out] pConfig Pointer of shared memory configuration * * @return #hipSuccess * * @warning AMD devices and some Nvidia GPUS do not support shared cache banking, and the hint is * ignored on those architectures. * * @see hipCtxCreate, hipCtxDestroy, hipCtxGetFlags, hipCtxPopCurrent, hipCtxGetCurrent, * hipCtxSetCurrent, hipCtxPushCurrent, hipCtxSetCacheConfig, hipCtxSynchronize, hipCtxGetDevice * * @warning This API is deprecated on the AMD platform, only for equivalent cuCtx driver API on the * NVIDIA platform. */ HIP_DEPRECATED(HIP_DEPRECATED_MSG) hipError_t hipCtxGetSharedMemConfig(hipSharedMemConfig* pConfig); /** * @brief Blocks until the default context has completed all preceding requested tasks [Deprecated] * * @return #hipSuccess * * @warning This function waits for all streams on the default context to complete execution, and * then returns. * * @see hipCtxCreate, hipCtxDestroy, hipCtxGetFlags, hipCtxPopCurrent, hipCtxGetCurrent, * hipCtxSetCurrent, hipCtxPushCurrent, hipCtxSetCacheConfig, hipCtxGetDevice * * @warning This API is deprecated on the AMD platform, only for equivalent cuCtx driver API on the * NVIDIA platform. */ HIP_DEPRECATED(HIP_DEPRECATED_MSG) hipError_t hipCtxSynchronize(void); /** * @brief Return flags used for creating default context [Deprecated] * * @param [out] flags Pointer of flags * * @returns #hipSuccess * * @see hipCtxCreate, hipCtxDestroy, hipCtxPopCurrent, hipCtxGetCurrent, hipCtxGetCurrent, * hipCtxSetCurrent, hipCtxPushCurrent, hipCtxSetCacheConfig, hipCtxSynchronize, hipCtxGetDevice * * @warning This API is deprecated on the AMD platform, only for equivalent cuCtx driver API on the * NVIDIA platform. */ HIP_DEPRECATED(HIP_DEPRECATED_MSG) hipError_t hipCtxGetFlags(unsigned int* flags); /** * @brief Enables direct access to memory allocations in a peer context [Deprecated] * * Memory which already allocated on peer device will be mapped into the address space of the * current device. In addition, all future memory allocations on peerDeviceId will be mapped into * the address space of the current device when the memory is allocated. The peer memory remains * accessible from the current device until a call to hipDeviceDisablePeerAccess or hipDeviceReset. * * * @param [in] peerCtx Peer context * @param [in] flags flags, need to set as 0 * * @returns #hipSuccess, #hipErrorInvalidDevice, #hipErrorInvalidValue, * #hipErrorPeerAccessAlreadyEnabled * * @see hipCtxCreate, hipCtxDestroy, hipCtxGetFlags, hipCtxPopCurrent, hipCtxGetCurrent, * hipCtxSetCurrent, hipCtxPushCurrent, hipCtxSetCacheConfig, hipCtxSynchronize, hipCtxGetDevice * @warning PeerToPeer support is experimental. * * @warning This API is deprecated on the AMD platform, only for equivalent cuCtx driver API on the * NVIDIA platform. */ HIP_DEPRECATED(HIP_DEPRECATED_MSG) hipError_t hipCtxEnablePeerAccess(hipCtx_t peerCtx, unsigned int flags); /** * @brief Disable direct access from current context's virtual address space to memory allocations * physically located on a peer context.Disables direct access to memory allocations in a peer * context and unregisters any registered allocations [Deprecated] * * Returns #hipErrorPeerAccessNotEnabled if direct access to memory on peerDevice has not yet been * enabled from the current device. * * @param [in] peerCtx Peer context to be disabled * * @returns #hipSuccess, #hipErrorPeerAccessNotEnabled * * @see hipCtxCreate, hipCtxDestroy, hipCtxGetFlags, hipCtxPopCurrent, hipCtxGetCurrent, * hipCtxSetCurrent, hipCtxPushCurrent, hipCtxSetCacheConfig, hipCtxSynchronize, hipCtxGetDevice * @warning PeerToPeer support is experimental. * * @warning This API is deprecated on the AMD platform, only for equivalent cuCtx driver API on the * NVIDIA platform. */ HIP_DEPRECATED(HIP_DEPRECATED_MSG) hipError_t hipCtxDisablePeerAccess(hipCtx_t peerCtx); /** * @brief Get the state of the primary context [Deprecated] * * @param [in] dev Device to get primary context flags for * @param [out] flags Pointer to store flags * @param [out] active Pointer to store context state; 0 = inactive, 1 = active * * @returns #hipSuccess * * @see hipCtxCreate, hipCtxDestroy, hipCtxGetFlags, hipCtxPopCurrent, hipCtxGetCurrent, * hipCtxSetCurrent, hipCtxPushCurrent, hipCtxSetCacheConfig, hipCtxSynchronize, hipCtxGetDevice * * @warning This API is deprecated on the AMD platform, only for equivalent driver API on the * NVIDIA platform. */ HIP_DEPRECATED(HIP_DEPRECATED_MSG) hipError_t hipDevicePrimaryCtxGetState(hipDevice_t dev, unsigned int* flags, int* active); /** * @brief Release the primary context on the GPU. * * @param [in] dev Device which primary context is released [Deprecated] * * @returns #hipSuccess * * @see hipCtxCreate, hipCtxDestroy, hipCtxGetFlags, hipCtxPopCurrent, hipCtxGetCurrent, * hipCtxSetCurrent, hipCtxPushCurrent, hipCtxSetCacheConfig, hipCtxSynchronize, hipCtxGetDevice * @warning This function return #hipSuccess though doesn't release the primaryCtx by design on * HIP/HCC path. * * @warning This API is deprecated on the AMD platform, only for equivalent driver API on the NVIDIA * platform. */ HIP_DEPRECATED(HIP_DEPRECATED_MSG) hipError_t hipDevicePrimaryCtxRelease(hipDevice_t dev); /** * @brief Retain the primary context on the GPU [Deprecated] * * @param [out] pctx Returned context handle of the new context * @param [in] dev Device which primary context is released * * @returns #hipSuccess * * @see hipCtxCreate, hipCtxDestroy, hipCtxGetFlags, hipCtxPopCurrent, hipCtxGetCurrent, * hipCtxSetCurrent, hipCtxPushCurrent, hipCtxSetCacheConfig, hipCtxSynchronize, hipCtxGetDevice * * @warning This API is deprecated on the AMD platform, only for equivalent driver API on the NVIDIA * platform. */ HIP_DEPRECATED(HIP_DEPRECATED_MSG) hipError_t hipDevicePrimaryCtxRetain(hipCtx_t* pctx, hipDevice_t dev); /** * @brief Resets the primary context on the GPU [Deprecated] * * @param [in] dev Device which primary context is reset * * @returns #hipSuccess * * @see hipCtxCreate, hipCtxDestroy, hipCtxGetFlags, hipCtxPopCurrent, hipCtxGetCurrent, * hipCtxSetCurrent, hipCtxPushCurrent, hipCtxSetCacheConfig, hipCtxSynchronize, hipCtxGetDevice * * @warning This API is deprecated on the AMD platform, only for equivalent driver API on the NVIDIA * platform. */ HIP_DEPRECATED(HIP_DEPRECATED_MSG) hipError_t hipDevicePrimaryCtxReset(hipDevice_t dev); /** * @brief Set flags for the primary context [Deprecated] * * @param [in] dev Device for which the primary context flags are set * @param [in] flags New flags for the device * * @returns #hipSuccess, #hipErrorContextAlreadyInUse * * @see hipCtxCreate, hipCtxDestroy, hipCtxGetFlags, hipCtxPopCurrent, hipCtxGetCurrent, * hipCtxSetCurrent, hipCtxPushCurrent, hipCtxSetCacheConfig, hipCtxSynchronize, hipCtxGetDevice * * @warning This API is deprecated on the AMD platform, only for equivalent driver API on the NVIDIA * platform. */ HIP_DEPRECATED(HIP_DEPRECATED_MSG) hipError_t hipDevicePrimaryCtxSetFlags(hipDevice_t dev, unsigned int flags); // doxygen end Context Management /** * @} */ /** *------------------------------------------------------------------------------------------------- *------------------------------------------------------------------------------------------------- * * @defgroup Module Module Management * @{ * @ingroup API * This section describes the module management functions of HIP runtime API. * */ /** * @brief Loads code object from file into a module the currrent context. * * @param [in] fname Filename of code object to load * @param [out] module Module * * @warning File/memory resources allocated in this function are released only in hipModuleUnload. * * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorInvalidContext, #hipErrorFileNotFound, * #hipErrorOutOfMemory, #hipErrorSharedObjectInitFailed, #hipErrorNotInitialized * */ hipError_t hipModuleLoad(hipModule_t* module, const char* fname); /** * @brief Frees the module * * @param [in] module Module to free * * @returns #hipSuccess, #hipErrorInvalidResourceHandle * * The module is freed, and the code objects associated with it are destroyed. */ hipError_t hipModuleUnload(hipModule_t module); /** * @brief Function with kname will be extracted if present in module * * @param [in] module Module to get function from * @param [in] kname Pointer to the name of function * @param [out] function Pointer to function handle * * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorInvalidContext, #hipErrorNotInitialized, * #hipErrorNotFound, */ hipError_t hipModuleGetFunction(hipFunction_t* function, hipModule_t module, const char* kname); /** * @brief Find out attributes for a given function. * @ingroup Execution * @param [out] attr Attributes of funtion * @param [in] func Pointer to the function handle * * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorInvalidDeviceFunction */ hipError_t hipFuncGetAttributes(struct hipFuncAttributes* attr, const void* func); /** * @brief Find out a specific attribute for a given function. * @ingroup Execution * @param [out] value Pointer to the value * @param [in] attrib Attributes of the given funtion * @param [in] hfunc Function to get attributes from * * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorInvalidDeviceFunction */ hipError_t hipFuncGetAttribute(int* value, hipFunction_attribute attrib, hipFunction_t hfunc); /** * @brief Gets pointer to device entry function that matches entry function symbolPtr. * * @param [out] functionPtr Device entry function * @param [in] symbolPtr Pointer to device entry function to search for * * @returns #hipSuccess, #hipErrorInvalidDeviceFunction * */ hipError_t hipGetFuncBySymbol(hipFunction_t* functionPtr, const void* symbolPtr); /** * @brief returns the handle of the texture reference with the name from the module. * * @param [in] hmod Module * @param [in] name Pointer of name of texture reference * @param [out] texRef Pointer of texture reference * * @returns #hipSuccess, #hipErrorNotInitialized, #hipErrorNotFound, #hipErrorInvalidValue */ hipError_t hipModuleGetTexRef(textureReference** texRef, hipModule_t hmod, const char* name); /** * @brief builds module from code object which resides in host memory. Image is pointer to that * location. * * @param [in] image The pointer to the location of data * @param [out] module Retuned module * * @returns hipSuccess, hipErrorNotInitialized, hipErrorOutOfMemory, hipErrorNotInitialized */ hipError_t hipModuleLoadData(hipModule_t* module, const void* image); /** * @brief builds module from code object which resides in host memory. Image is pointer to that * location. Options are not used. hipModuleLoadData is called. * * @param [in] image The pointer to the location of data * @param [out] module Retuned module * @param [in] numOptions Number of options * @param [in] options Options for JIT * @param [in] optionValues Option values for JIT * * @returns hipSuccess, hipErrorNotInitialized, hipErrorOutOfMemory, hipErrorNotInitialized */ hipError_t hipModuleLoadDataEx(hipModule_t* module, const void* image, unsigned int numOptions, hipJitOption* options, void** optionValues); /** * @brief Completes the linking of the given program. * @param [in] state hip link state * @param [in] type Type of the input data or bitcode * @param [in] data Input data which is null terminated * @param [in] size Size of the input data * @param [in] name Optional name for this input * @param [in] numOptions Size of the options * @param [in] options Array of options applied to this input * @param [in] optionValues Array of option values cast to void* * * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorInvalidHandle * * If adding the file fails, it will * @return #hipErrorInvalidConfiguration * * @see hipError_t */ hipError_t hipLinkAddData(hipLinkState_t state, hipJitInputType type, void* data, size_t size, const char* name, unsigned int numOptions, hipJitOption* options, void** optionValues); /** * @brief Adds a file with bit code to be linked with options * @param [in] state hip link state * @param [in] type Type of the input data or bitcode * @param [in] path Path to the input file where bitcode is present * @param [in] numOptions Size of the options * @param [in] options Array of options applied to this input * @param [in] optionValues Array of option values cast to void* * * @returns #hipSuccess, #hipErrorInvalidValue * * If adding the file fails, it will * @return #hipErrorInvalidConfiguration * * @see hipError_t */ hipError_t hipLinkAddFile(hipLinkState_t state, hipJitInputType type, const char* path, unsigned int numOptions, hipJitOption* options, void** optionValues); /** * @brief Completes the linking of the given program. * @param [in] state hip link state * @param [out] hipBinOut Upon success, points to the output binary * @param [out] sizeOut Size of the binary is stored (optional) * * @returns #hipSuccess #hipErrorInvalidValue * * If adding the data fails, it will * @return #hipErrorInvalidConfiguration * * @see hipError_t */ hipError_t hipLinkComplete(hipLinkState_t state, void** hipBinOut, size_t* sizeOut); /** * @brief Creates the link instance via hip APIs. * @param [in] numOptions Number of options * @param [in] option Array of options * @param [in] optionValues Array of option values cast to void* * @param [out] stateOut hip link state created upon success * * @returns #hipSuccess #hipErrorInvalidValue #hipErrorInvalidConfiguration * * @see hipSuccess */ hipError_t hipLinkCreate(unsigned int numOptions, hipJitOption* options, void** optionValues, hipLinkState_t* stateOut); /** * @brief Deletes the link instance via hip APIs. * @param [in] state link state instance * * @returns #hipSuccess #hipErrorInvalidValue * * @see hipSuccess */ hipError_t hipLinkDestroy(hipLinkState_t state); /** * @brief launches kernel f with launch parameters and shared memory on stream with arguments passed * to kernelparams or extra * @ingroup Execution * @param [in] f Kernel to launch. * @param [in] gridDimX X grid dimension specified as multiple of blockDimX. * @param [in] gridDimY Y grid dimension specified as multiple of blockDimY. * @param [in] gridDimZ Z grid dimension specified as multiple of blockDimZ. * @param [in] blockDimX X block dimensions specified in work-items * @param [in] blockDimY Y grid dimension specified in work-items * @param [in] blockDimZ Z grid dimension specified in work-items * @param [in] sharedMemBytes Amount of dynamic shared memory to allocate for this kernel. The * HIP-Clang compiler provides support for extern shared declarations. * @param [in] stream Stream where the kernel should be dispatched. May be 0, in which case th * default stream is used with associated synchronization rules. * @param [in] kernelParams Kernel parameters to launch * @param [in] extra Pointer to kernel arguments. These are passed directly to the kernel and * must be in the memory layout and alignment expected by the kernel. * All passed arguments must be naturally aligned according to their type. The memory address of each * argument should be a multiple of its size in bytes. Please refer to hip_porting_driver_api.md * for sample usage. * * Please note, HIP does not support kernel launch with total work items defined in dimension with * size gridDim x blockDim >= 2^32. So gridDim.x * blockDim.x, gridDim.y * blockDim.y * and gridDim.z * blockDim.z are always less than 2^32. * * @returns #hipSuccess, #hipErrorNotInitialized, #hipErrorInvalidValue */ hipError_t hipModuleLaunchKernel(hipFunction_t f, unsigned int gridDimX, unsigned int gridDimY, unsigned int gridDimZ, unsigned int blockDimX, unsigned int blockDimY, unsigned int blockDimZ, unsigned int sharedMemBytes, hipStream_t stream, void** kernelParams, void** extra); /** \addtogroup ModuleCooperativeG Cooperative groups kernel launch of Module management. * \ingroup Module * @{ */ /** * @brief launches kernel f with launch parameters and shared memory on stream with arguments passed * to kernelParams, where thread blocks can cooperate and synchronize as they execute * * @param [in] f Kernel to launch. * @param [in] gridDimX X grid dimension specified as multiple of blockDimX. * @param [in] gridDimY Y grid dimension specified as multiple of blockDimY. * @param [in] gridDimZ Z grid dimension specified as multiple of blockDimZ. * @param [in] blockDimX X block dimension specified in work-items. * @param [in] blockDimY Y block dimension specified in work-items. * @param [in] blockDimZ Z block dimension specified in work-items. * @param [in] sharedMemBytes Amount of dynamic shared memory to allocate for this kernel. The * HIP-Clang compiler provides support for extern shared declarations. * @param [in] stream Stream where the kernel should be dispatched. May be 0, * in which case the default stream is used with associated synchronization rules. * @param [in] kernelParams A list of kernel arguments. * * Please note, HIP does not support kernel launch with total work items defined in dimension with * size \f$ gridDim \cdot blockDim \geq 2^{32} \f$. * * @returns #hipSuccess, #hipErrorDeinitialized, #hipErrorNotInitialized, #hipErrorInvalidContext, * #hipErrorInvalidHandle, #hipErrorInvalidImage, #hipErrorInvalidValue, * #hipErrorInvalidConfiguration, #hipErrorLaunchFailure, #hipErrorLaunchOutOfResources, * #hipErrorLaunchTimeOut, #hipErrorCooperativeLaunchTooLarge, #hipErrorSharedObjectInitFailed */ hipError_t hipModuleLaunchCooperativeKernel(hipFunction_t f, unsigned int gridDimX, unsigned int gridDimY, unsigned int gridDimZ, unsigned int blockDimX, unsigned int blockDimY, unsigned int blockDimZ, unsigned int sharedMemBytes, hipStream_t stream, void** kernelParams); /** * @brief Launches kernels on multiple devices where thread blocks can cooperate and * synchronize as they execute. * * @param [in] launchParamsList List of launch parameters, one per device. * @param [in] numDevices Size of the launchParamsList array. * @param [in] flags Flags to control launch behavior. * * @returns #hipSuccess, #hipErrorDeinitialized, #hipErrorNotInitialized, #hipErrorInvalidContext, * #hipErrorInvalidHandle, #hipErrorInvalidImage, #hipErrorInvalidValue, * #hipErrorInvalidConfiguration, #hipErrorInvalidResourceHandle, #hipErrorLaunchFailure, * #hipErrorLaunchOutOfResources, #hipErrorLaunchTimeOut, #hipErrorCooperativeLaunchTooLarge, * #hipErrorSharedObjectInitFailed */ hipError_t hipModuleLaunchCooperativeKernelMultiDevice(hipFunctionLaunchParams* launchParamsList, unsigned int numDevices, unsigned int flags); /** * @brief Launches kernel f with launch parameters and shared memory on stream with arguments passed * to kernelparams or extra, where thread blocks can cooperate and synchronize as they execute. * * @param [in] f - Kernel to launch. * @param [in] gridDim - Grid dimensions specified as multiple of blockDim. * @param [in] blockDimX - Block dimensions specified in work-items * @param [in] kernelParams - Pointer of arguments passed to the kernel. If the kernel has multiple * parameters, 'kernelParams' should be array of pointers, each points the corresponding argument. * @param [in] sharedMemBytes - Amount of dynamic shared memory to allocate for this kernel. The * HIP-Clang compiler provides support for extern shared declarations. * @param [in] stream - Stream where the kernel should be dispatched. May be 0, in which case th * default stream is used with associated synchronization rules. * * Please note, HIP does not support kernel launch with total work items defined in dimension with * size \f$ gridDim \cdot blockDim \geq 2^{32} \f$. * * @returns #hipSuccess, #hipErrorNotInitialized, #hipErrorInvalidValue, * #hipErrorCooperativeLaunchTooLarge */ hipError_t hipLaunchCooperativeKernel(const void* f, dim3 gridDim, dim3 blockDimX, void** kernelParams, unsigned int sharedMemBytes, hipStream_t stream); /** * @brief Launches kernels on multiple devices where thread blocks can cooperate and * synchronize as they execute. * * @param [in] launchParamsList List of launch parameters, one per device. * @param [in] numDevices Size of the launchParamsList array. * @param [in] flags Flags to control launch behavior. * * @returns #hipSuccess, #hipErrorNotInitialized, #hipErrorInvalidValue, * #hipErrorCooperativeLaunchTooLarge */ hipError_t hipLaunchCooperativeKernelMultiDevice(hipLaunchParams* launchParamsList, int numDevices, unsigned int flags); // Doxygen end group ModuleCooperativeG /** @} */ /** * @brief Launches kernels on multiple devices and guarantees all specified kernels are dispatched * on respective streams before enqueuing any other work on the specified streams from any other threads * @ingroup Execution * @param [in] launchParamsList List of launch parameters, one per device. * @param [in] numDevices Size of the launchParamsList array. * @param [in] flags Flags to control launch behavior. * * @returns #hipSuccess, #hipErrorNotInitialized, #hipErrorInvalidValue */ hipError_t hipExtLaunchMultiKernelMultiDevice(hipLaunchParams* launchParamsList, int numDevices, unsigned int flags); // doxygen end Module /** * @} */ /** *------------------------------------------------------------------------------------------------- *------------------------------------------------------------------------------------------------- * @defgroup Occupancy Occupancy * @{ * This section describes the occupancy functions of HIP runtime API. * */ /** * @brief determine the grid and block sizes to achieves maximum occupancy for a kernel * * @param [out] gridSize minimum grid size for maximum potential occupancy * @param [out] blockSize block size for maximum potential occupancy * @param [in] f kernel function for which occupancy is calulated * @param [in] dynSharedMemPerBlk dynamic shared memory usage (in bytes) intended for each block * @param [in] blockSizeLimit the maximum block size for the kernel, use 0 for no limit * * Please note, HIP does not support kernel launch with total work items defined in dimension with * size gridDim x blockDim >= 2^32. * * @returns #hipSuccess, #hipErrorInvalidValue */ //TODO - Match CUoccupancyB2DSize hipError_t hipModuleOccupancyMaxPotentialBlockSize(int* gridSize, int* blockSize, hipFunction_t f, size_t dynSharedMemPerBlk, int blockSizeLimit); /** * @brief determine the grid and block sizes to achieves maximum occupancy for a kernel * * @param [out] gridSize minimum grid size for maximum potential occupancy * @param [out] blockSize block size for maximum potential occupancy * @param [in] f kernel function for which occupancy is calulated * @param [in] dynSharedMemPerBlk dynamic shared memory usage (in bytes) intended for each block * @param [in] blockSizeLimit the maximum block size for the kernel, use 0 for no limit * @param [in] flags Extra flags for occupancy calculation (only default supported) * * Please note, HIP does not support kernel launch with total work items defined in dimension with * size gridDim x blockDim >= 2^32. * * @returns #hipSuccess, #hipErrorInvalidValue */ //TODO - Match CUoccupancyB2DSize hipError_t hipModuleOccupancyMaxPotentialBlockSizeWithFlags(int* gridSize, int* blockSize, hipFunction_t f, size_t dynSharedMemPerBlk, int blockSizeLimit, unsigned int flags); /** * @brief Returns occupancy for a device function. * * @param [out] numBlocks Returned occupancy * @param [in] f Kernel function (hipFunction) for which occupancy is calulated * @param [in] blockSize Block size the kernel is intended to be launched with * @param [in] dynSharedMemPerBlk Dynamic shared memory usage (in bytes) intended for each block * @returns #hipSuccess, #hipErrorInvalidValue */ hipError_t hipModuleOccupancyMaxActiveBlocksPerMultiprocessor( int* numBlocks, hipFunction_t f, int blockSize, size_t dynSharedMemPerBlk); /** * @brief Returns occupancy for a device function. * * @param [out] numBlocks Returned occupancy * @param [in] f Kernel function(hipFunction_t) for which occupancy is calulated * @param [in] blockSize Block size the kernel is intended to be launched with * @param [in] dynSharedMemPerBlk Dynamic shared memory usage (in bytes) intended for each block * @param [in] flags Extra flags for occupancy calculation (only default supported) * @returns #hipSuccess, #hipErrorInvalidValue */ hipError_t hipModuleOccupancyMaxActiveBlocksPerMultiprocessorWithFlags( int* numBlocks, hipFunction_t f, int blockSize, size_t dynSharedMemPerBlk, unsigned int flags); /** * @brief Returns occupancy for a device function. * * @param [out] numBlocks Returned occupancy * @param [in] f Kernel function for which occupancy is calulated * @param [in] blockSize Block size the kernel is intended to be launched with * @param [in] dynSharedMemPerBlk Dynamic shared memory usage (in bytes) intended for each block * @returns #hipSuccess, #hipErrorInvalidDeviceFunction, #hipErrorInvalidValue */ hipError_t hipOccupancyMaxActiveBlocksPerMultiprocessor( int* numBlocks, const void* f, int blockSize, size_t dynSharedMemPerBlk); /** * @brief Returns occupancy for a device function. * * @param [out] numBlocks Returned occupancy * @param [in] f Kernel function for which occupancy is calulated * @param [in] blockSize Block size the kernel is intended to be launched with * @param [in] dynSharedMemPerBlk Dynamic shared memory usage (in bytes) intended for each block * @param [in] flags Extra flags for occupancy calculation (currently ignored) * @returns #hipSuccess, #hipErrorInvalidDeviceFunction, #hipErrorInvalidValue */ hipError_t hipOccupancyMaxActiveBlocksPerMultiprocessorWithFlags( int* numBlocks, const void* f, int blockSize, size_t dynSharedMemPerBlk, unsigned int flags __dparm(hipOccupancyDefault)); /** * @brief determine the grid and block sizes to achieves maximum occupancy for a kernel * * @param [out] gridSize minimum grid size for maximum potential occupancy * @param [out] blockSize block size for maximum potential occupancy * @param [in] f kernel function for which occupancy is calulated * @param [in] dynSharedMemPerBlk dynamic shared memory usage (in bytes) intended for each block * @param [in] blockSizeLimit the maximum block size for the kernel, use 0 for no limit * * Please note, HIP does not support kernel launch with total work items defined in dimension with * size gridDim x blockDim >= 2^32. * * @returns #hipSuccess, #hipErrorInvalidValue */ hipError_t hipOccupancyMaxPotentialBlockSize(int* gridSize, int* blockSize, const void* f, size_t dynSharedMemPerBlk, int blockSizeLimit); // doxygen end Occupancy /** * @} */ /** *------------------------------------------------------------------------------------------------- *------------------------------------------------------------------------------------------------- * @defgroup Profiler Profiler Control [Deprecated] * @{ * This section describes the profiler control functions of HIP runtime API. * * @warning The cudaProfilerInitialize API format for "configFile" is not supported. * */ // TODO - expand descriptions: /** * @brief Start recording of profiling information [Deprecated] * When using this API, start the profiler with profiling disabled. (--startdisabled) * @returns #hipErrorNotSupported * @warning hipProfilerStart API is deprecated, use roctracer/rocTX instead. */ HIP_DEPRECATED("use roctracer/rocTX instead") hipError_t hipProfilerStart(); /** * @brief Stop recording of profiling information [Deprecated] * When using this API, start the profiler with profiling disabled. (--startdisabled) * @returns #hipErrorNotSupported * @warning hipProfilerStart API is deprecated, use roctracer/rocTX instead. */ HIP_DEPRECATED("use roctracer/rocTX instead") hipError_t hipProfilerStop(); // doxygen end profiler /** * @} */ /** *------------------------------------------------------------------------------------------------- *------------------------------------------------------------------------------------------------- * @defgroup Clang Launch API to support the triple-chevron syntax * @{ * This section describes the API to support the triple-chevron syntax. */ /** * @brief Configure a kernel launch. * * @param [in] gridDim grid dimension specified as multiple of blockDim. * @param [in] blockDim block dimensions specified in work-items * @param [in] sharedMem Amount of dynamic shared memory to allocate for this kernel. The * HIP-Clang compiler provides support for extern shared declarations. * @param [in] stream Stream where the kernel should be dispatched. May be 0, in which case the * default stream is used with associated synchronization rules. * * Please note, HIP does not support kernel launch with total work items defined in dimension with * size gridDim x blockDim >= 2^32. * * @returns #hipSuccess, #hipErrorNotInitialized, #hipErrorInvalidValue * */ hipError_t hipConfigureCall(dim3 gridDim, dim3 blockDim, size_t sharedMem __dparm(0), hipStream_t stream __dparm(0)); /** * @brief Set a kernel argument. * * @returns #hipSuccess, #hipErrorNotInitialized, #hipErrorInvalidValue * * @param [in] arg Pointer the argument in host memory. * @param [in] size Size of the argument. * @param [in] offset Offset of the argument on the argument stack. * */ hipError_t hipSetupArgument(const void* arg, size_t size, size_t offset); /** * @brief Launch a kernel. * * @param [in] func Kernel to launch. * * @returns #hipSuccess, #hipErrorNotInitialized, #hipErrorInvalidValue * */ hipError_t hipLaunchByPtr(const void* func); /** * @brief Push configuration of a kernel launch. * * @param [in] gridDim grid dimension specified as multiple of blockDim. * @param [in] blockDim block dimensions specified in work-items * @param [in] sharedMem Amount of dynamic shared memory to allocate for this kernel. The * HIP-Clang compiler provides support for extern shared declarations. * @param [in] stream Stream where the kernel should be dispatched. May be 0, in which case the * default stream is used with associated synchronization rules. * * Please note, HIP does not support kernel launch with total work items defined in dimension with * size gridDim x blockDim >= 2^32. * * @returns #hipSuccess, #hipErrorNotInitialized, #hipErrorInvalidValue * */ hipError_t __hipPushCallConfiguration(dim3 gridDim, dim3 blockDim, size_t sharedMem __dparm(0), hipStream_t stream __dparm(0)); /** * @brief Pop configuration of a kernel launch. * * @param [out] gridDim grid dimension specified as multiple of blockDim. * @param [out] blockDim block dimensions specified in work-items * @param [out] sharedMem Amount of dynamic shared memory to allocate for this kernel. The * HIP-Clang compiler provides support for extern shared declarations. * @param [out] stream Stream where the kernel should be dispatched. May be 0, in which case the * default stream is used with associated synchronization rules. * * Please note, HIP does not support kernel launch with total work items defined in dimension with * size gridDim x blockDim >= 2^32. * * Please note, HIP does not support kernel launch with total work items defined in dimension with * size gridDim x blockDim >= 2^32. * * @returns #hipSuccess, #hipErrorNotInitialized, #hipErrorInvalidValue * */ hipError_t __hipPopCallConfiguration(dim3 *gridDim, dim3 *blockDim, size_t *sharedMem, hipStream_t *stream); /** * @brief C compliant kernel launch API * * @param [in] function_address - Kernel stub function pointer. * @param [in] numBlocks - Number of blocks. * @param [in] dimBlocks - Dimension of a block * @param [in] args - Pointer of arguments passed to the kernel. If the kernel has multiple * parameters, 'args' should be array of pointers, each points the corresponding argument. * @param [in] sharedMemBytes - Amount of dynamic shared memory to allocate for this kernel. The * HIP-Clang compiler provides support for extern shared declarations. * @param [in] stream - Stream where the kernel should be dispatched. May be 0, in which case th * default stream is used with associated synchronization rules. * * @returns #hipSuccess, #hipErrorInvalidValue * */ hipError_t hipLaunchKernel(const void* function_address, dim3 numBlocks, dim3 dimBlocks, void** args, size_t sharedMemBytes __dparm(0), hipStream_t stream __dparm(0)); /** * @brief Enqueues a host function call in a stream. * * @param [in] stream - The stream to enqueue work in. * @param [in] fn - The function to call once enqueued preceeding operations are complete. * @param [in] userData - User-specified data to be passed to the function. * * @returns #hipSuccess, #hipErrorInvalidResourceHandle, #hipErrorInvalidValue, * #hipErrorNotSupported * * The host function to call in this API will be executed after the preceding operations in * the stream are complete. The function is a blocking operation that blocks operations in the * stream that follow it, until the function is returned. * Event synchronization and internal callback functions make sure enqueued operations will * execute in order, in the stream. * * The host function must not make any HIP API calls. The host function is non-reentrant. It must * not perform sychronization with any operation that may depend on other processing execution * but is not enqueued to run earlier in the stream. * * Host functions that are enqueued respectively in different non-blocking streams can run concurrently. * * @warning This API is marked as beta, meaning, while this is feature complete, * it is still open to changes and may have outstanding issues. */ hipError_t hipLaunchHostFunc(hipStream_t stream, hipHostFn_t fn, void* userData); /** * Copies memory for 2D arrays. * * @param pCopy - Parameters for the memory copy * * @returns #hipSuccess, #hipErrorInvalidValue */ hipError_t hipDrvMemcpy2DUnaligned(const hip_Memcpy2D* pCopy); //TODO: Move this to hip_ext.h /** * @brief Launches kernel from the pointer address, with arguments and shared memory on stream. * * @param [in] function_address - Pointer to the Kernel to launch. * @param [in] numBlocks - Number of blocks. * @param [in] dimBlocks - Dimension of a block. * @param [in] args - Pointer of arguments passed to the kernel. If the kernel has multiple * parameters, 'args' should be array of pointers, each points the corresponding argument. * @param [in] sharedMemBytes - Amount of dynamic shared memory to allocate for this kernel. * HIP-Clang compiler provides support for extern shared declarations. * @param [in] stream - Stream where the kernel should be dispatched. * May be 0, in which case the default stream is used with associated synchronization rules. * @param [in] startEvent - If non-null, specified event will be updated to track the start time of * the kernel launch. The event must be created before calling this API. * @param [in] stopEvent - If non-null, specified event will be updated to track the stop time of * the kernel launch. The event must be created before calling this API. * @param [in] flags - The value of hipExtAnyOrderLaunch, signifies if kernel can be * launched in any order. * @returns #hipSuccess, #hipErrorNotInitialized, #hipErrorInvalidValue. * */ hipError_t hipExtLaunchKernel(const void* function_address, dim3 numBlocks, dim3 dimBlocks, void** args, size_t sharedMemBytes, hipStream_t stream, hipEvent_t startEvent, hipEvent_t stopEvent, int flags); // doxygen end Clang launch /** * @} */ /** *------------------------------------------------------------------------------------------------- *------------------------------------------------------------------------------------------------- * @defgroup Texture Texture Management * @{ * This section describes the texture management functions of HIP runtime API. */ /** * @brief Creates a texture object. * * @param [out] pTexObject pointer to the texture object to create * @param [in] pResDesc pointer to resource descriptor * @param [in] pTexDesc pointer to texture descriptor * @param [in] pResViewDesc pointer to resource view descriptor * * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported, #hipErrorOutOfMemory * * @note 3D liner filter isn't supported on GFX90A boards, on which the API @p hipCreateTextureObject will * return hipErrorNotSupported. * */ hipError_t hipCreateTextureObject( hipTextureObject_t* pTexObject, const hipResourceDesc* pResDesc, const hipTextureDesc* pTexDesc, const struct hipResourceViewDesc* pResViewDesc); /** * @brief Destroys a texture object. * * @param [in] textureObject texture object to destroy * * @returns #hipSuccess, #hipErrorInvalidValue * */ hipError_t hipDestroyTextureObject(hipTextureObject_t textureObject); /** * @brief Gets the channel descriptor in an array. * * @param [in] desc pointer to channel format descriptor * @param [out] array memory array on the device * * @returns #hipSuccess, #hipErrorInvalidValue * */ hipError_t hipGetChannelDesc( hipChannelFormatDesc* desc, hipArray_const_t array); /** * @brief Gets resource descriptor for the texture object. * * @param [out] pResDesc pointer to resource descriptor * @param [in] textureObject texture object * * @returns #hipSuccess, #hipErrorInvalidValue * */ hipError_t hipGetTextureObjectResourceDesc( hipResourceDesc* pResDesc, hipTextureObject_t textureObject); /** * @brief Gets resource view descriptor for the texture object. * * @param [out] pResViewDesc pointer to resource view descriptor * @param [in] textureObject texture object * * @returns #hipSuccess, #hipErrorInvalidValue * */ hipError_t hipGetTextureObjectResourceViewDesc( struct hipResourceViewDesc* pResViewDesc, hipTextureObject_t textureObject); /** * @brief Gets texture descriptor for the texture object. * * @param [out] pTexDesc pointer to texture descriptor * @param [in] textureObject texture object * * @returns #hipSuccess, #hipErrorInvalidValue * */ hipError_t hipGetTextureObjectTextureDesc( hipTextureDesc* pTexDesc, hipTextureObject_t textureObject); /** * @brief Creates a texture object. * * @param [out] pTexObject pointer to texture object to create * @param [in] pResDesc pointer to resource descriptor * @param [in] pTexDesc pointer to texture descriptor * @param [in] pResViewDesc pointer to resource view descriptor * * @returns #hipSuccess, #hipErrorInvalidValue * */ hipError_t hipTexObjectCreate( hipTextureObject_t* pTexObject, const HIP_RESOURCE_DESC* pResDesc, const HIP_TEXTURE_DESC* pTexDesc, const HIP_RESOURCE_VIEW_DESC* pResViewDesc); /** * @brief Destroys a texture object. * * @param [in] texObject texture object to destroy * * @returns #hipSuccess, #hipErrorInvalidValue * */ hipError_t hipTexObjectDestroy( hipTextureObject_t texObject); /** * @brief Gets resource descriptor of a texture object. * * @param [out] pResDesc pointer to resource descriptor * @param [in] texObject texture object * * @returns #hipSuccess, #hipErrorNotSupported, #hipErrorInvalidValue * */ hipError_t hipTexObjectGetResourceDesc( HIP_RESOURCE_DESC* pResDesc, hipTextureObject_t texObject); /** * @brief Gets resource view descriptor of a texture object. * * @param [out] pResViewDesc pointer to resource view descriptor * @param [in] texObject texture object * * @returns #hipSuccess, #hipErrorNotSupported, #hipErrorInvalidValue * */ hipError_t hipTexObjectGetResourceViewDesc( HIP_RESOURCE_VIEW_DESC* pResViewDesc, hipTextureObject_t texObject); /** * @brief Gets texture descriptor of a texture object. * * @param [out] pTexDesc pointer to texture descriptor * @param [in] texObject texture object * * @returns #hipSuccess, #hipErrorNotSupported, #hipErrorInvalidValue * */ hipError_t hipTexObjectGetTextureDesc( HIP_TEXTURE_DESC* pTexDesc, hipTextureObject_t texObject); /** * @brief Allocate a mipmapped array on the device. * * @param[out] mipmappedArray - Pointer to allocated mipmapped array in device memory * @param[in] desc - Requested channel format * @param[in] extent - Requested allocation size (width field in elements) * @param[in] numLevels - Number of mipmap levels to allocate * @param[in] flags - Flags for extensions * * @return #hipSuccess, #hipErrorInvalidValue, #hipErrorMemoryAllocation * * @note This API is implemented on Linux and is under development on Microsoft Windows. * */ hipError_t hipMallocMipmappedArray( hipMipmappedArray_t *mipmappedArray, const struct hipChannelFormatDesc* desc, struct hipExtent extent, unsigned int numLevels, unsigned int flags __dparm(0)); /** * @brief Frees a mipmapped array on the device. * * @param[in] mipmappedArray - Pointer to mipmapped array to free * * @return #hipSuccess, #hipErrorInvalidValue * * @note This API is implemented on Linux and is under development on Microsoft Windows. * */ hipError_t hipFreeMipmappedArray(hipMipmappedArray_t mipmappedArray); /** * @brief Gets a mipmap level of a HIP mipmapped array. * * @param[out] levelArray - Returned mipmap level HIP array * @param[in] mipmappedArray - HIP mipmapped array * @param[in] level - Mipmap level * * @return #hipSuccess, #hipErrorInvalidValue * * @note This API is implemented on Linux and is under development on Microsoft Windows. * */ hipError_t hipGetMipmappedArrayLevel( hipArray_t *levelArray, hipMipmappedArray_const_t mipmappedArray, unsigned int level); /** * @brief Create a mipmapped array. * * @param [out] pHandle pointer to mipmapped array * @param [in] pMipmappedArrayDesc mipmapped array descriptor * @param [in] numMipmapLevels mipmap level * * @returns #hipSuccess, #hipErrorNotSupported, #hipErrorInvalidValue * * @note This API is implemented on Linux and is under development on Microsoft Windows. */ hipError_t hipMipmappedArrayCreate( hipMipmappedArray_t* pHandle, HIP_ARRAY3D_DESCRIPTOR* pMipmappedArrayDesc, unsigned int numMipmapLevels); /** * @brief Destroy a mipmapped array. * * @param [out] hMipmappedArray pointer to mipmapped array to destroy * * @returns #hipSuccess, #hipErrorInvalidValue * * @note This API is implemented on Linux and is under development on Microsoft Windows. * */ hipError_t hipMipmappedArrayDestroy(hipMipmappedArray_t hMipmappedArray); /** * @brief Get a mipmapped array on a mipmapped level. * * @param [in] pLevelArray Pointer of array * @param [out] hMipMappedArray Pointer of mipmapped array on the requested mipmap level * @param [out] level Mipmap level * * @returns #hipSuccess, #hipErrorInvalidValue * * @note This API is implemented on Linux and is under development on Microsoft Windows. * */ hipError_t hipMipmappedArrayGetLevel( hipArray_t* pLevelArray, hipMipmappedArray_t hMipMappedArray, unsigned int level); /** * * @addtogroup TextureD Texture Management [Deprecated] * @{ * @ingroup Texture * This section describes the deprecated texture management functions of HIP runtime API. */ /** * @brief Binds a mipmapped array to a texture [Deprecated] * * @param [in] tex pointer to the texture reference to bind * @param [in] mipmappedArray memory mipmapped array on the device * @param [in] desc opointer to the channel format * * @returns #hipSuccess, #hipErrorInvalidValue * */ HIP_DEPRECATED(HIP_DEPRECATED_MSG) hipError_t hipBindTextureToMipmappedArray( const textureReference* tex, hipMipmappedArray_const_t mipmappedArray, const hipChannelFormatDesc* desc); /** * @brief Gets the texture reference related with the symbol [Deprecated] * * @param [out] texref texture reference * @param [in] symbol pointer to the symbol related with the texture for the reference * * @returns #hipSuccess, #hipErrorInvalidValue * @warning This API is deprecated. * */ HIP_DEPRECATED(HIP_DEPRECATED_MSG) hipError_t hipGetTextureReference( const textureReference** texref, const void* symbol); /** * @brief Gets the border color used by a texture reference [Deprecated] * * @param [out] pBorderColor Returned Type and Value of RGBA color. * @param [in] texRef Texture reference. * * @returns #hipSuccess, #hipErrorInvalidValue * @warning This API is deprecated. * */ HIP_DEPRECATED(HIP_DEPRECATED_MSG) hipError_t hipTexRefGetBorderColor(float* pBorderColor, const textureReference* texRef); /** * @brief Gets the array bound to a texture reference [Deprecated] * * @param [in] pArray Returned array. * @param [in] texRef texture reference. * * @returns #hipSuccess, #hipErrorInvalidValue * @warning This API is deprecated. * */ HIP_DEPRECATED(HIP_DEPRECATED_MSG) hipError_t hipTexRefGetArray(hipArray_t* pArray, const textureReference* texRef); /** * @brief Sets address mode for a texture reference [Deprecated] * * @param [in] texRef texture reference. * @param [in] dim Dimension of the texture. * @param [in] am Value of the texture address mode. * * @returns #hipSuccess, #hipErrorInvalidValue * @warning This API is deprecated. * */ HIP_DEPRECATED(HIP_DEPRECATED_MSG) hipError_t hipTexRefSetAddressMode( textureReference* texRef, int dim, enum hipTextureAddressMode am); /** * @brief Binds an array as a texture reference [Deprecated] * * @param [in] tex Pointer texture reference. * @param [in] array Array to bind. * @param [in] flags Flags should be set as HIP_TRSA_OVERRIDE_FORMAT, as a valid value. * * @returns #hipSuccess, #hipErrorInvalidValue * * @warning This API is deprecated. * */ HIP_DEPRECATED(HIP_DEPRECATED_MSG) hipError_t hipTexRefSetArray( textureReference* tex, hipArray_const_t array, unsigned int flags); /** * @brief Set filter mode for a texture reference [Deprecated] * * @param [in] texRef Pointer texture reference. * @param [in] fm Value of texture filter mode. * * @returns #hipSuccess, #hipErrorInvalidValue * * @warning This API is deprecated. * */ HIP_DEPRECATED(HIP_DEPRECATED_MSG) hipError_t hipTexRefSetFilterMode( textureReference* texRef, enum hipTextureFilterMode fm); /** * @brief Set flags for a texture reference [Deprecated] * * @param [in] texRef Pointer texture reference. * @param [in] Flags Value of flags. * * @returns #hipSuccess, #hipErrorInvalidValue * * @warning This API is deprecated. * */ HIP_DEPRECATED(HIP_DEPRECATED_MSG) hipError_t hipTexRefSetFlags( textureReference* texRef, unsigned int Flags); /** * @brief Set format for a texture reference [Deprecated] * * @param [in] texRef Pointer texture reference. * @param [in] fmt Value of format. * @param [in] NumPackedComponents Number of components per array. * * @returns #hipSuccess, #hipErrorInvalidValue * * @warning This API is deprecated. * */ HIP_DEPRECATED(HIP_DEPRECATED_MSG) hipError_t hipTexRefSetFormat( textureReference* texRef, hipArray_Format fmt, int NumPackedComponents); /** * @brief Binds a memory area to a texture [Deprecated] * * @param [in] offset Offset in bytes. * @param [in] tex Texture to bind. * @param [in] devPtr Pointer of memory on the device. * @param [in] desc Pointer of channel format descriptor. * @param [in] size Size of memory in bites. * * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported * * @warning This API is deprecated. * */ HIP_DEPRECATED(HIP_DEPRECATED_MSG) hipError_t hipBindTexture( size_t* offset, const textureReference* tex, const void* devPtr, const hipChannelFormatDesc* desc, size_t size __dparm(UINT_MAX)); /** * @brief Binds a 2D memory area to a texture [Deprecated] * * @param [in] offset Offset in bytes. * @param [in] tex Texture to bind. * @param [in] devPtr Pointer of 2D memory area on the device. * @param [in] desc Pointer of channel format descriptor. * @param [in] width Width in texel units. * @param [in] height Height in texel units. * @param [in] pitch Pitch in bytes. * * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported * * @warning This API is deprecated. * */ HIP_DEPRECATED(HIP_DEPRECATED_MSG) hipError_t hipBindTexture2D( size_t* offset, const textureReference* tex, const void* devPtr, const hipChannelFormatDesc* desc, size_t width, size_t height, size_t pitch); /** * @brief Binds a memory area to a texture [Deprecated] * * @param [in] tex Pointer of texture reference. * @param [in] array Array to bind. * @param [in] desc Pointer of channel format descriptor. * * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported * * @warning This API is deprecated. * */ HIP_DEPRECATED(HIP_DEPRECATED_MSG) hipError_t hipBindTextureToArray( const textureReference* tex, hipArray_const_t array, const hipChannelFormatDesc* desc); /** * @brief Get the offset of the alignment in a texture [Deprecated] * * @param [in] offset Offset in bytes. * @param [in] texref Pointer of texture reference. * * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported * * @warning This API is deprecated. * */ HIP_DEPRECATED(HIP_DEPRECATED_MSG) hipError_t hipGetTextureAlignmentOffset( size_t* offset, const textureReference* texref); /** * @brief Unbinds a texture [Deprecated] * * @param [in] tex Texture to unbind. * * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported * * @warning This API is deprecated. * */ HIP_DEPRECATED(HIP_DEPRECATED_MSG) hipError_t hipUnbindTexture(const textureReference* tex); /** * @brief Gets the address for a texture reference [Deprecated] * * @param [out] dev_ptr Pointer of device address. * @param [in] texRef Pointer of texture reference. * * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported * * @warning This API is deprecated. * */ HIP_DEPRECATED(HIP_DEPRECATED_MSG) hipError_t hipTexRefGetAddress( hipDeviceptr_t* dev_ptr, const textureReference* texRef); /** * @brief Gets the address mode for a texture reference [Deprecated] * * @param [out] pam Pointer of address mode. * @param [in] texRef Pointer of texture reference. * @param [in] dim Dimension. * * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported * * @warning This API is deprecated. * */ HIP_DEPRECATED(HIP_DEPRECATED_MSG) hipError_t hipTexRefGetAddressMode( enum hipTextureAddressMode* pam, const textureReference* texRef, int dim); /** * @brief Gets filter mode for a texture reference [Deprecated] * * @param [out] pfm Pointer of filter mode. * @param [in] texRef Pointer of texture reference. * * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported * * @warning This API is deprecated. * */ HIP_DEPRECATED(HIP_DEPRECATED_MSG) hipError_t hipTexRefGetFilterMode( enum hipTextureFilterMode* pfm, const textureReference* texRef); /** * @brief Gets flags for a texture reference [Deprecated] * * @param [out] pFlags Pointer of flags. * @param [in] texRef Pointer of texture reference. * * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported * * @warning This API is deprecated. * */ HIP_DEPRECATED(HIP_DEPRECATED_MSG) hipError_t hipTexRefGetFlags( unsigned int* pFlags, const textureReference* texRef); /** * @brief Gets texture format for a texture reference [Deprecated] * * @param [out] pFormat Pointer of the format. * @param [out] pNumChannels Pointer of number of channels. * @param [in] texRef Pointer of texture reference. * * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported * * @warning This API is deprecated. * */ HIP_DEPRECATED(HIP_DEPRECATED_MSG) hipError_t hipTexRefGetFormat( hipArray_Format* pFormat, int* pNumChannels, const textureReference* texRef); /** * @brief Gets the maximum anisotropy for a texture reference [Deprecated] * * @param [out] pmaxAnsio Pointer of the maximum anisotropy. * @param [in] texRef Pointer of texture reference. * * @returns #hipErrorInvalidValue, #hipErrorNotSupported * * @warning This API is deprecated. * */ HIP_DEPRECATED(HIP_DEPRECATED_MSG) hipError_t hipTexRefGetMaxAnisotropy( int* pmaxAnsio, const textureReference* texRef); /** * @brief Gets the mipmap filter mode for a texture reference [Deprecated] * * @param [out] pfm Pointer of the mipmap filter mode. * @param [in] texRef Pointer of texture reference. * * @returns #hipErrorInvalidValue, #hipErrorNotSupported * * @warning This API is deprecated. * */ HIP_DEPRECATED(HIP_DEPRECATED_MSG) hipError_t hipTexRefGetMipmapFilterMode( enum hipTextureFilterMode* pfm, const textureReference* texRef); /** * @brief Gets the mipmap level bias for a texture reference [Deprecated] * * @param [out] pbias Pointer of the mipmap level bias. * @param [in] texRef Pointer of texture reference. * * @returns #hipErrorInvalidValue, #hipErrorNotSupported * * @warning This API is deprecated. * */ HIP_DEPRECATED(HIP_DEPRECATED_MSG) hipError_t hipTexRefGetMipmapLevelBias( float* pbias, const textureReference* texRef); /** * @brief Gets the minimum and maximum mipmap level clamps for a texture reference [Deprecated] * * @param [out] pminMipmapLevelClamp Pointer of the minimum mipmap level clamp. * @param [out] pmaxMipmapLevelClamp Pointer of the maximum mipmap level clamp. * @param [in] texRef Pointer of texture reference. * * @returns #hipErrorInvalidValue, #hipErrorNotSupported * * @warning This API is deprecated. * */ HIP_DEPRECATED(HIP_DEPRECATED_MSG) hipError_t hipTexRefGetMipmapLevelClamp( float* pminMipmapLevelClamp, float* pmaxMipmapLevelClamp, const textureReference* texRef); /** * @brief Gets the mipmapped array bound to a texture reference [Deprecated] * * @param [out] pArray Pointer of the mipmapped array. * @param [in] texRef Pointer of texture reference. * * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported * * @warning This API is deprecated. * */ HIP_DEPRECATED(HIP_DEPRECATED_MSG) hipError_t hipTexRefGetMipMappedArray( hipMipmappedArray_t* pArray, const textureReference* texRef); /** * @brief Sets an bound address for a texture reference [Deprecated] * * @param [out] ByteOffset Pointer of the offset in bytes. * @param [in] texRef Pointer of texture reference. * @param [in] dptr Pointer of device address to bind. * @param [in] bytes Size in bytes. * * @returns #hipSuccess, #hipErrorInvalidValue * * @warning This API is deprecated. * */ HIP_DEPRECATED(HIP_DEPRECATED_MSG) hipError_t hipTexRefSetAddress( size_t* ByteOffset, textureReference* texRef, hipDeviceptr_t dptr, size_t bytes); /** * @brief Set a bind an address as a 2D texture reference [Deprecated] * * @param [in] texRef Pointer of texture reference. * @param [in] desc Pointer of array descriptor. * @param [in] dptr Pointer of device address to bind. * @param [in] Pitch Pitch in bytes. * * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported * * @warning This API is deprecated. * */ HIP_DEPRECATED(HIP_DEPRECATED_MSG) hipError_t hipTexRefSetAddress2D( textureReference* texRef, const HIP_ARRAY_DESCRIPTOR* desc, hipDeviceptr_t dptr, size_t Pitch); /** * @brief Sets the maximum anisotropy for a texture reference [Deprecated] * * @param [in] texRef Pointer of texture reference. * @param [out] maxAniso Value of the maximum anisotropy. * * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported * * @warning This API is deprecated. * */ HIP_DEPRECATED(HIP_DEPRECATED_MSG) hipError_t hipTexRefSetMaxAnisotropy( textureReference* texRef, unsigned int maxAniso); /** * @brief Sets border color for a texture reference [Deprecated] * * @param [in] texRef Pointer of texture reference. * @param [in] pBorderColor Pointer of border color. * * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported * * @warning This API is deprecated. * */ HIP_DEPRECATED(HIP_DEPRECATED_MSG) hipError_t hipTexRefSetBorderColor( textureReference* texRef, float* pBorderColor); /** * @brief Sets mipmap filter mode for a texture reference [Deprecated] * * @param [in] texRef Pointer of texture reference. * @param [in] fm Value of filter mode. * * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported * * @warning This API is deprecated. * */ HIP_DEPRECATED(HIP_DEPRECATED_MSG) hipError_t hipTexRefSetMipmapFilterMode( textureReference* texRef, enum hipTextureFilterMode fm); /** * @brief Sets mipmap level bias for a texture reference [Deprecated] * * @param [in] texRef Pointer of texture reference. * @param [in] bias Value of mipmap bias. * * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported * * @warning This API is deprecated. * */ HIP_DEPRECATED(HIP_DEPRECATED_MSG) hipError_t hipTexRefSetMipmapLevelBias( textureReference* texRef, float bias); /** * @brief Sets mipmap level clamp for a texture reference [Deprecated] * * @param [in] texRef Pointer of texture reference. * @param [in] minMipMapLevelClamp Value of minimum mipmap level clamp. * @param [in] maxMipMapLevelClamp Value of maximum mipmap level clamp. * * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported * * @warning This API is deprecated. * */ HIP_DEPRECATED(HIP_DEPRECATED_MSG) hipError_t hipTexRefSetMipmapLevelClamp( textureReference* texRef, float minMipMapLevelClamp, float maxMipMapLevelClamp); /** * @brief Binds mipmapped array to a texture reference [Deprecated] * * @param [in] texRef Pointer of texture reference to bind. * @param [in] mipmappedArray Pointer of mipmapped array to bind. * @param [in] Flags Flags should be set as HIP_TRSA_OVERRIDE_FORMAT, as a valid value. * * @returns #hipSuccess, #hipErrorInvalidValue * * @warning This API is deprecated. * */ HIP_DEPRECATED(HIP_DEPRECATED_MSG) hipError_t hipTexRefSetMipmappedArray( textureReference* texRef, struct hipMipmappedArray* mipmappedArray, unsigned int Flags); // doxygen end deprecated texture management /** * @} */ // doxygen end Texture management /** * @} */ /** *------------------------------------------------------------------------------------------------- *------------------------------------------------------------------------------------------------- * @defgroup Runtime Runtime Compilation * @{ * This section describes the runtime compilation functions of HIP runtime API. * */ // This group is for HIPrtc // doxygen end Runtime /** * @} */ /** * * @defgroup Callback Callback Activity APIs * @{ * This section describes the callback/Activity of HIP runtime API. */ /** * @brief Returns HIP API name by ID. * * @param [in] id ID of HIP API * * @returns #hipSuccess, #hipErrorInvalidValue * */ const char* hipApiName(uint32_t id); /** * @brief Returns kernel name reference by function name. * * @param [in] f Name of function * * @returns #hipSuccess, #hipErrorInvalidValue * */ const char* hipKernelNameRef(const hipFunction_t f); /** * @brief Retrives kernel for a given host pointer, unless stated otherwise. * * @param [in] hostFunction Pointer of host function. * @param [in] stream Stream the kernel is executed on. * * @returns #hipSuccess, #hipErrorInvalidValue * */ const char* hipKernelNameRefByPtr(const void* hostFunction, hipStream_t stream); /** * @brief Returns device ID on the stream. * * @param [in] stream Stream of device executed on. * * @returns #hipSuccess, #hipErrorInvalidValue * */ int hipGetStreamDeviceId(hipStream_t stream); // doxygen end Callback /** * @} */ /** *------------------------------------------------------------------------------------------------- *------------------------------------------------------------------------------------------------- * @defgroup Graph Graph Management * @{ * This section describes the graph management types & functions of HIP runtime API. */ /** * @brief Begins graph capture on a stream. * * @param [in] stream - Stream to initiate capture. * @param [in] mode - Controls the interaction of this capture sequence with other API calls that * are not safe. * * @returns #hipSuccess, #hipErrorInvalidValue * * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. * */ hipError_t hipStreamBeginCapture(hipStream_t stream, hipStreamCaptureMode mode); /** * @brief Begins graph capture on a stream to an existing graph. * * @param [in] stream - Stream to initiate capture. * @param [in] graph - Graph to capture into. * @param [in] dependencies - Dependencies of the first node captured in the stream. Can be NULL if * numDependencies is 0. * @param [in] dependencyData - Optional array of data associated with each dependency. * @param [in] numDependencies - Number of dependencies. * @param [in] mode - Controls the interaction of this capture sequence with other API calls that are not safe. * * @returns #hipSuccess, #hipErrorInvalidValue * * @warning param "const hipGraphEdgeData* dependencyData" is currently not supported and has to be passed as nullptr. This API is marked as beta, meaning, while this is feature complete, it is still open to changes and may have outstanding issues. * */ hipError_t hipStreamBeginCaptureToGraph(hipStream_t stream, hipGraph_t graph, const hipGraphNode_t* dependencies, const hipGraphEdgeData* dependencyData, size_t numDependencies, hipStreamCaptureMode mode); /** * @brief Ends capture on a stream, returning the captured graph. * * @param [in] stream - Stream to end capture. * @param [out] pGraph - Captured graph. * * @returns #hipSuccess, #hipErrorInvalidValue * * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. * */ hipError_t hipStreamEndCapture(hipStream_t stream, hipGraph_t* pGraph); /** * @brief Get capture status of a stream. * * @param [in] stream - Stream of which to get capture status from. * @param [out] pCaptureStatus - Returns current capture status. * @param [out] pId - Unique capture ID. * * @returns #hipSuccess, #hipErrorStreamCaptureImplicit * * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. * */ hipError_t hipStreamGetCaptureInfo(hipStream_t stream, hipStreamCaptureStatus* pCaptureStatus, unsigned long long* pId); /** * @brief Get stream's capture state * * @param [in] stream - Stream of which to get capture status from. * @param [out] captureStatus_out - Returns current capture status. * @param [out] id_out - Unique capture ID. * @param [out] graph_out - Returns the graph being captured into. * @param [out] dependencies_out - Pointer to an array of nodes representing the graphs dependencies. * @param [out] numDependencies_out - Returns size of the array returned in dependencies_out. * * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorStreamCaptureImplicit * * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. * */ hipError_t hipStreamGetCaptureInfo_v2(hipStream_t stream, hipStreamCaptureStatus* captureStatus_out, unsigned long long* id_out __dparm(0), hipGraph_t* graph_out __dparm(0), const hipGraphNode_t** dependencies_out __dparm(0), size_t* numDependencies_out __dparm(0)); /** * @brief Get stream's capture state * * @param [in] stream - Stream of which to get capture status from. * @param [out] pCaptureStatus - Returns current capture status. * * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorStreamCaptureImplicit * * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. * */ hipError_t hipStreamIsCapturing(hipStream_t stream, hipStreamCaptureStatus* pCaptureStatus); /** * @brief Update the set of dependencies in a capturing stream * * @param [in] stream Stream that is being captured. * @param [in] dependencies Pointer to an array of nodes to add/replace. * @param [in] numDependencies Size of the dependencies array. * @param [in] flags Flag to update dependency set. Should be one of the values * in enum #hipStreamUpdateCaptureDependenciesFlags. * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorIllegalState * * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. * */ hipError_t hipStreamUpdateCaptureDependencies(hipStream_t stream, hipGraphNode_t* dependencies, size_t numDependencies, unsigned int flags __dparm(0)); /** * @brief Swaps the stream capture mode of a thread. * * @param [in] mode - Pointer to mode value to swap with the current mode. * @returns #hipSuccess, #hipErrorInvalidValue * * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. * */ hipError_t hipThreadExchangeStreamCaptureMode(hipStreamCaptureMode* mode); /** * @brief Creates a graph * * @param [out] pGraph - pointer to graph to create. * @param [in] flags - flags for graph creation, must be 0. * * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorMemoryAllocation * * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. * */ hipError_t hipGraphCreate(hipGraph_t* pGraph, unsigned int flags); /** * @brief Destroys a graph * * @param [in] graph - instance of graph to destroy. * * @returns #hipSuccess, #hipErrorInvalidValue * * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. * */ hipError_t hipGraphDestroy(hipGraph_t graph); /** * @brief Adds dependency edges to a graph. * * @param [in] graph - Instance of the graph to add dependencies to. * @param [in] from - Pointer to the graph nodes with dependencies to add from. * @param [in] to - Pointer to the graph nodes to add dependencies to. * @param [in] numDependencies - Number of dependencies to add. * @returns #hipSuccess, #hipErrorInvalidValue * * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. * */ hipError_t hipGraphAddDependencies(hipGraph_t graph, const hipGraphNode_t* from, const hipGraphNode_t* to, size_t numDependencies); /** * @brief Removes dependency edges from a graph. * * @param [in] graph - Instance of the graph to remove dependencies from. * @param [in] from - Array of nodes that provide the dependencies. * @param [in] to - Array of dependent nodes. * @param [in] numDependencies - Number of dependencies to remove. * @returns #hipSuccess, #hipErrorInvalidValue * * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. * */ hipError_t hipGraphRemoveDependencies(hipGraph_t graph, const hipGraphNode_t* from, const hipGraphNode_t* to, size_t numDependencies); /** * @brief Returns a graph's dependency edges. * * @param [in] graph - Instance of the graph to get the edges from. * @param [out] from - Pointer to the graph nodes to return edge endpoints. * @param [out] to - Pointer to the graph nodes to return edge endpoints. * @param [out] numEdges - Returns number of edges. * @returns #hipSuccess, #hipErrorInvalidValue * * from and to may both be NULL, in which case this function only returns the number of edges in * numEdges. Otherwise, numEdges entries will be filled in. If numEdges is higher than the actual * number of edges, the remaining entries in from and to will be set to NULL, and the number of * edges actually returned will be written to numEdges. * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. * */ hipError_t hipGraphGetEdges(hipGraph_t graph, hipGraphNode_t* from, hipGraphNode_t* to, size_t* numEdges); /** * @brief Returns a graph's nodes. * * @param [in] graph - Instance of graph to get the nodes from. * @param [out] nodes - Pointer to return the graph nodes. * @param [out] numNodes - Returns the number of graph nodes. * @returns #hipSuccess, #hipErrorInvalidValue * * nodes may be NULL, in which case this function will return the number of nodes in numNodes. * Otherwise, numNodes entries will be filled in. If numNodes is higher than the actual number of * nodes, the remaining entries in nodes will be set to NULL, and the number of nodes actually * obtained will be returned in numNodes. * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. * */ hipError_t hipGraphGetNodes(hipGraph_t graph, hipGraphNode_t* nodes, size_t* numNodes); /** * @brief Returns a graph's root nodes. * * @param [in] graph - Instance of the graph to get the nodes from. * @param [out] pRootNodes - Pointer to return the graph's root nodes. * @param [out] pNumRootNodes - Returns the number of graph's root nodes. * @returns #hipSuccess, #hipErrorInvalidValue * * pRootNodes may be NULL, in which case this function will return the number of root nodes in * pNumRootNodes. Otherwise, pNumRootNodes entries will be filled in. If pNumRootNodes is higher * than the actual number of root nodes, the remaining entries in pRootNodes will be set to NULL, * and the number of nodes actually obtained will be returned in pNumRootNodes. * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. * */ hipError_t hipGraphGetRootNodes(hipGraph_t graph, hipGraphNode_t* pRootNodes, size_t* pNumRootNodes); /** * @brief Returns a node's dependencies. * * @param [in] node - Graph node to get the dependencies from. * @param [out] pDependencies - Pointer to return the dependencies. * @param [out] pNumDependencies - Returns the number of graph node dependencies. * @returns #hipSuccess, #hipErrorInvalidValue * * pDependencies may be NULL, in which case this function will return the number of dependencies in * pNumDependencies. Otherwise, pNumDependencies entries will be filled in. If pNumDependencies is * higher than the actual number of dependencies, the remaining entries in pDependencies will be set * to NULL, and the number of nodes actually obtained will be returned in pNumDependencies. * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. * */ hipError_t hipGraphNodeGetDependencies(hipGraphNode_t node, hipGraphNode_t* pDependencies, size_t* pNumDependencies); /** * @brief Returns a node's dependent nodes. * * @param [in] node - Graph node to get the dependent nodes from. * @param [out] pDependentNodes - Pointer to return the graph dependent nodes. * @param [out] pNumDependentNodes - Returns the number of graph node dependent nodes. * @returns #hipSuccess, #hipErrorInvalidValue * * pDependentNodes may be NULL, in which case this function will return the number of dependent nodes * in pNumDependentNodes. Otherwise, pNumDependentNodes entries will be filled in. If * pNumDependentNodes is higher than the actual number of dependent nodes, the remaining entries in * pDependentNodes will be set to NULL, and the number of nodes actually obtained will be returned * in pNumDependentNodes. * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. * */ hipError_t hipGraphNodeGetDependentNodes(hipGraphNode_t node, hipGraphNode_t* pDependentNodes, size_t* pNumDependentNodes); /** * @brief Returns a node's type. * * @param [in] node - Node to get type of. * @param [out] pType - Returns the node's type. * @returns #hipSuccess, #hipErrorInvalidValue * * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. * */ hipError_t hipGraphNodeGetType(hipGraphNode_t node, hipGraphNodeType* pType); /** * @brief Remove a node from the graph. * * @param [in] node - graph node to remove * @returns #hipSuccess, #hipErrorInvalidValue * * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. * */ hipError_t hipGraphDestroyNode(hipGraphNode_t node); /** * @brief Clones a graph. * * @param [out] pGraphClone - Returns newly created cloned graph. * @param [in] originalGraph - original graph to clone from. * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorMemoryAllocation * * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. * */ hipError_t hipGraphClone(hipGraph_t* pGraphClone, hipGraph_t originalGraph); /** * @brief Finds a cloned version of a node. * * @param [out] pNode - Returns the cloned node. * @param [in] originalNode - original node handle. * @param [in] clonedGraph - Cloned graph to query. * @returns #hipSuccess, #hipErrorInvalidValue * * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. * */ hipError_t hipGraphNodeFindInClone(hipGraphNode_t* pNode, hipGraphNode_t originalNode, hipGraph_t clonedGraph); /** * @brief Creates an executable graph from a graph * * @param [out] pGraphExec - Pointer to instantiated executable graph. * @param [in] graph - Instance of graph to instantiate. * @param [out] pErrorNode - Pointer to error node. In case an error occured during * graph instantiation, it could modify the corresponding node. * @param [out] pLogBuffer - Pointer to log buffer. * @param [out] bufferSize - Size of the log buffer. * * @returns #hipSuccess, #hipErrorOutOfMemory * * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. * */ hipError_t hipGraphInstantiate(hipGraphExec_t* pGraphExec, hipGraph_t graph, hipGraphNode_t* pErrorNode, char* pLogBuffer, size_t bufferSize); /** * @brief Creates an executable graph from a graph. * * @param [out] pGraphExec - Pointer to instantiated executable graph. * @param [in] graph - Instance of graph to instantiate. * @param [in] flags - Flags to control instantiation. * @returns #hipSuccess, #hipErrorInvalidValue * * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. It does not support any of * flag and is behaving as hipGraphInstantiate. */ hipError_t hipGraphInstantiateWithFlags(hipGraphExec_t* pGraphExec, hipGraph_t graph, unsigned long long flags); /** * @brief Creates an executable graph from a graph. * * @param [out] pGraphExec - Pointer to instantiated executable graph. * @param [in] graph - Instance of graph to instantiate. * @param [in] instantiateParams - Graph instantiation Params * @returns #hipSuccess, #hipErrorInvalidValue * * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipGraphInstantiateWithParams(hipGraphExec_t* pGraphExec, hipGraph_t graph, hipGraphInstantiateParams *instantiateParams); /** * @brief Launches an executable graph in the specified stream. * * @param [in] graphExec - Instance of executable graph to launch. * @param [in] stream - Instance of stream in which to launch executable graph. * @returns #hipSuccess, #hipErrorInvalidValue * * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipGraphLaunch(hipGraphExec_t graphExec, hipStream_t stream); /** * @brief Uploads an executable graph to a stream * * @param [in] graphExec - Instance of executable graph to be uploaded. * @param [in] stream - Instance of stream to which the executable graph is uploaded to. * @returns #hipSuccess, #hipErrorInvalidValue * * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipGraphUpload(hipGraphExec_t graphExec, hipStream_t stream); /** * @brief Creates a kernel execution node and adds it to a graph. * * @param [out] pGraphNode - Pointer to kernel graph node that is created. * @param [in] graph - Instance of graph to add the created node to. * @param [in] pDependencies - Pointer to the dependencies on the kernel execution node. * @param [in] numDependencies - Number of dependencies. * @param [in] nodeParams - Pointer to the node parameters. * @returns #hipSuccess, #hipErrorInvalidValue. * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipGraphAddNode(hipGraphNode_t *pGraphNode, hipGraph_t graph, const hipGraphNode_t *pDependencies, size_t numDependencies, hipGraphNodeParams *nodeParams); /** * @brief Return the flags of an executable graph. * * @param [in] graphExec - Executable graph to get the flags from. * @param [out] flags - Flags used to instantiate this executable graph. * @returns #hipSuccess, #hipErrorInvalidValue. * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipGraphExecGetFlags(hipGraphExec_t graphExec, unsigned long long* flags); /** * @brief Updates parameters of a graph's node. * * @param [in] node - Instance of the node to set parameters for. * @param [in] nodeParams - Pointer to the parameters to be set. * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorInvalidDeviceFunction, #hipErrorNotSupported. * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipGraphNodeSetParams(hipGraphNode_t node, hipGraphNodeParams *nodeParams); /** * @brief Updates parameters of an executable graph's node. * * @param [in] graphExec - Instance of the executable graph. * @param [in] node - Instance of the node to set parameters to. * @param [in] nodeParams - Pointer to the parameters to be set. * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorInvalidDeviceFunction, #hipErrorNotSupported. * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipGraphExecNodeSetParams(hipGraphExec_t graphExec, hipGraphNode_t node, hipGraphNodeParams* nodeParams); /** * @brief Destroys an executable graph * * @param [in] graphExec - Instance of executable graph to destroy. * * @returns #hipSuccess. * * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipGraphExecDestroy(hipGraphExec_t graphExec); // Check whether an executable graph can be updated with a graph and perform the update if possible. /** * @brief Check whether an executable graph can be updated with a graph and perform the update if * * possible. * * @param [in] hGraphExec - instance of executable graph to update. * @param [in] hGraph - graph that contains the updated parameters. * @param [in] hErrorNode_out - node which caused the permissibility check to forbid the update. * @param [in] updateResult_out - Return code whether the graph update was performed. * @returns #hipSuccess, #hipErrorGraphExecUpdateFailure * * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipGraphExecUpdate(hipGraphExec_t hGraphExec, hipGraph_t hGraph, hipGraphNode_t* hErrorNode_out, hipGraphExecUpdateResult* updateResult_out); /** * @brief Creates a kernel execution node and adds it to a graph. * * @param [out] pGraphNode - Pointer to graph node that is created * @param [in] graph - Instance of graph to add the created node to. * @param [in] pDependencies - Pointer to the dependencies of the kernel execution node. * @param [in] numDependencies - The number of the dependencies. * @param [in] pNodeParams - Pointer to the parameters of the kernel execution node. * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorInvalidDeviceFunction * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipGraphAddKernelNode(hipGraphNode_t* pGraphNode, hipGraph_t graph, const hipGraphNode_t* pDependencies, size_t numDependencies, const hipKernelNodeParams* pNodeParams); /** * @brief Gets kernel node's parameters. * * @param [in] node - instance of the node to get parameters from. * @param [out] pNodeParams - pointer to the parameters * @returns #hipSuccess, #hipErrorInvalidValue * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipGraphKernelNodeGetParams(hipGraphNode_t node, hipKernelNodeParams* pNodeParams); /** * @brief Sets a kernel node's parameters. * * @param [in] node - Instance of the node to set parameters of. * @param [in] pNodeParams - const pointer to the parameters. * @returns #hipSuccess, #hipErrorInvalidValue * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipGraphKernelNodeSetParams(hipGraphNode_t node, const hipKernelNodeParams* pNodeParams); /** * @brief Sets the parameters for a kernel node in the given graphExec. * * @param [in] hGraphExec - Instance of the executable graph with the node. * @param [in] node - Instance of the node to set parameters of. * @param [in] pNodeParams - const pointer to the kernel node parameters. * @returns #hipSuccess, #hipErrorInvalidValue * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipGraphExecKernelNodeSetParams(hipGraphExec_t hGraphExec, hipGraphNode_t node, const hipKernelNodeParams* pNodeParams); /** * @brief Creates a memcpy node and adds it to a graph. * * @param [out] phGraphNode - Pointer to graph node that is created. * @param [in] hGraph - Instance of graph to add the created node to. * @param [in] dependencies - const pointer to the dependencies of the memcpy execution node. * @param [in] numDependencies - The number of dependencies. * @param [in] copyParams - const pointer to the parameters for the memory copy. * @param [in] ctx - context related to current device. * @returns #hipSuccess, #hipErrorInvalidValue * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipDrvGraphAddMemcpyNode(hipGraphNode_t* phGraphNode, hipGraph_t hGraph, const hipGraphNode_t* dependencies, size_t numDependencies, const HIP_MEMCPY3D* copyParams, hipCtx_t ctx); /** * @brief Creates a memcpy node and adds it to a graph. * * @param [out] pGraphNode - Pointer to graph node that is created. * @param [in] graph - Instance of graph to add the created node to. * @param [in] pDependencies - const pointer to the dependencies of the memcpy execution node. * @param [in] numDependencies - The number of dependencies. * @param [in] pCopyParams - const pointer to the parameters for the memory copy. * @returns #hipSuccess, #hipErrorInvalidValue * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipGraphAddMemcpyNode(hipGraphNode_t* pGraphNode, hipGraph_t graph, const hipGraphNode_t* pDependencies, size_t numDependencies, const hipMemcpy3DParms* pCopyParams); /** * @brief Gets a memcpy node's parameters. * * @param [in] node - instance of the node to get parameters from. * @param [out] pNodeParams - pointer to the parameters. * @returns #hipSuccess, #hipErrorInvalidValue * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipGraphMemcpyNodeGetParams(hipGraphNode_t node, hipMemcpy3DParms* pNodeParams); /** * @brief Sets a memcpy node's parameters. * * @param [in] node - instance of the node to set parameters to. * @param [in] pNodeParams - const pointer to the parameters. * @returns #hipSuccess, #hipErrorInvalidValue * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipGraphMemcpyNodeSetParams(hipGraphNode_t node, const hipMemcpy3DParms* pNodeParams); /** * @brief Sets a node's attribute. * * @param [in] hNode - Instance of the node to set parameters of. * @param [in] attr - The attribute type to be set. * @param [in] value - const pointer to the parameters. * @returns #hipSuccess, #hipErrorInvalidValue * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipGraphKernelNodeSetAttribute(hipGraphNode_t hNode, hipKernelNodeAttrID attr, const hipKernelNodeAttrValue* value); /** * @brief Gets a node's attribute. * * @param [in] hNode - Instance of the node to set parameters of. * @param [in] attr - The attribute type to be set. * @param [in] value - const pointer to the parameters. * @returns #hipSuccess, #hipErrorInvalidValue * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipGraphKernelNodeGetAttribute(hipGraphNode_t hNode, hipKernelNodeAttrID attr, hipKernelNodeAttrValue* value); /** * @brief Sets the parameters of a memcpy node in the given graphExec. * * @param [in] hGraphExec - Instance of the executable graph with the node. * @param [in] node - Instance of the node to set parameters of. * @param [in] pNodeParams - const pointer to the kernel node parameters. * @returns #hipSuccess, #hipErrorInvalidValue * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipGraphExecMemcpyNodeSetParams(hipGraphExec_t hGraphExec, hipGraphNode_t node, hipMemcpy3DParms* pNodeParams); /** * @brief Creates a 1D memcpy node and adds it to a graph. * * @param [out] pGraphNode - Pointer to graph node that is created. * @param [in] graph - Instance of graph to add the created node to. * @param [in] pDependencies - const pointer to the dependencies of the memcpy execution node. * @param [in] numDependencies - The number of dependencies. * @param [in] dst - Pointer to memory address of the destination. * @param [in] src - Pointer to memory address of the source. * @param [in] count - Size of the memory to copy. * @param [in] kind - Type of memory copy. * @returns #hipSuccess, #hipErrorInvalidValue * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipGraphAddMemcpyNode1D(hipGraphNode_t* pGraphNode, hipGraph_t graph, const hipGraphNode_t* pDependencies, size_t numDependencies, void* dst, const void* src, size_t count, hipMemcpyKind kind); /** * @brief Sets a memcpy node's parameters to perform a 1-dimensional copy. * * @param [in] node - Instance of the node to set parameters of. * @param [in] dst - Pointer to memory address of the destination. * @param [in] src - Pointer to memory address of the source. * @param [in] count - Size of the memory to copy. * @param [in] kind - Type of memory copy. * @returns #hipSuccess, #hipErrorInvalidValue * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipGraphMemcpyNodeSetParams1D(hipGraphNode_t node, void* dst, const void* src, size_t count, hipMemcpyKind kind); /** * @brief Sets the parameters for a memcpy node in the given graphExec to perform a 1-dimensional * copy. * * @param [in] hGraphExec - Instance of the executable graph with the node. * @param [in] node - Instance of the node to set parameters of. * @param [in] dst - Pointer to memory address of the destination. * @param [in] src - Pointer to memory address of the source. * @param [in] count - Size of the memory to copy. * @param [in] kind - Type of memory copy. * @returns #hipSuccess, #hipErrorInvalidValue * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipGraphExecMemcpyNodeSetParams1D(hipGraphExec_t hGraphExec, hipGraphNode_t node, void* dst, const void* src, size_t count, hipMemcpyKind kind); /** * @brief Creates a memcpy node to copy from a symbol on the device and adds it to a graph. * * @param [out] pGraphNode - Pointer to graph node that is created. * @param [in] graph - Instance of graph to add the created node to. * @param [in] pDependencies - const pointer to the dependencies of the memcpy execution node. * @param [in] numDependencies - Number of the dependencies. * @param [in] dst - Pointer to memory address of the destination. * @param [in] symbol - Device symbol address. * @param [in] count - Size of the memory to copy. * @param [in] offset - Offset from start of symbol in bytes. * @param [in] kind - Type of memory copy. * @returns #hipSuccess, #hipErrorInvalidValue * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipGraphAddMemcpyNodeFromSymbol(hipGraphNode_t* pGraphNode, hipGraph_t graph, const hipGraphNode_t* pDependencies, size_t numDependencies, void* dst, const void* symbol, size_t count, size_t offset, hipMemcpyKind kind); /** * @brief Sets a memcpy node's parameters to copy from a symbol on the device. * * @param [in] node - Instance of the node to set parameters of. * @param [in] dst - Pointer to memory address of the destination. * @param [in] symbol - Device symbol address. * @param [in] count - Size of the memory to copy. * @param [in] offset - Offset from start of symbol in bytes. * @param [in] kind - Type of memory copy. * @returns #hipSuccess, #hipErrorInvalidValue * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipGraphMemcpyNodeSetParamsFromSymbol(hipGraphNode_t node, void* dst, const void* symbol, size_t count, size_t offset, hipMemcpyKind kind); /** * @brief Sets the parameters for a memcpy node in the given graphExec to copy from a symbol on the * * device. * * @param [in] hGraphExec - Instance of the executable graph with the node. * @param [in] node - Instance of the node to set parameters of. * @param [in] dst - Pointer to memory address of the destination. * @param [in] symbol - Device symbol address. * @param [in] count - Size of the memory to copy. * @param [in] offset - Offset from start of symbol in bytes. * @param [in] kind - Type of memory copy. * @returns #hipSuccess, #hipErrorInvalidValue * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipGraphExecMemcpyNodeSetParamsFromSymbol(hipGraphExec_t hGraphExec, hipGraphNode_t node, void* dst, const void* symbol, size_t count, size_t offset, hipMemcpyKind kind); /** * @brief Creates a memcpy node to copy to a symbol on the device and adds it to a graph. * * @param [out] pGraphNode - Pointer to graph node that is created. * @param [in] graph - Instance of graph to add the created node to. * @param [in] pDependencies - const pointer to the dependencies on the memcpy execution node. * @param [in] numDependencies - Number of dependencies. * @param [in] symbol - Device symbol address. * @param [in] src - Pointer to memory address of the src. * @param [in] count - Size of the memory to copy. * @param [in] offset - Offset from start of symbol in bytes. * @param [in] kind - Type of memory copy. * @returns #hipSuccess, #hipErrorInvalidValue * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipGraphAddMemcpyNodeToSymbol(hipGraphNode_t* pGraphNode, hipGraph_t graph, const hipGraphNode_t* pDependencies, size_t numDependencies, const void* symbol, const void* src, size_t count, size_t offset, hipMemcpyKind kind); /** * @brief Sets a memcpy node's parameters to copy to a symbol on the device. * * @param [in] node - Instance of the node to set parameters of. * @param [in] symbol - Device symbol address. * @param [in] src - Pointer to memory address of the src. * @param [in] count - Size of the memory to copy. * @param [in] offset - Offset from start of symbol in bytes. * @param [in] kind - Type of memory copy. * @returns #hipSuccess, #hipErrorInvalidValue * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipGraphMemcpyNodeSetParamsToSymbol(hipGraphNode_t node, const void* symbol, const void* src, size_t count, size_t offset, hipMemcpyKind kind); /** * @brief Sets the parameters for a memcpy node in the given graphExec to copy to a symbol on the * device. * @param [in] hGraphExec - Instance of the executable graph with the node. * @param [in] node - Instance of the node to set parameters of. * @param [in] symbol - Device symbol address. * @param [in] src - Pointer to memory address of the src. * @param [in] count - Size of the memory to copy. * @param [in] offset - Offset from start of symbol in bytes. * @param [in] kind - Type of memory copy. * @returns #hipSuccess, #hipErrorInvalidValue * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipGraphExecMemcpyNodeSetParamsToSymbol(hipGraphExec_t hGraphExec, hipGraphNode_t node, const void* symbol, const void* src, size_t count, size_t offset, hipMemcpyKind kind); /** * @brief Creates a memset node and adds it to a graph. * * @param [out] pGraphNode - Pointer to graph node that is created. * @param [in] graph - Instance of the graph to add the created node to. * @param [in] pDependencies - const pointer to the dependencies on the memset execution node. * @param [in] numDependencies - Number of dependencies. * @param [in] pMemsetParams - const pointer to the parameters for the memory set. * @returns #hipSuccess, #hipErrorInvalidValue * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipGraphAddMemsetNode(hipGraphNode_t* pGraphNode, hipGraph_t graph, const hipGraphNode_t* pDependencies, size_t numDependencies, const hipMemsetParams* pMemsetParams); /** * @brief Gets a memset node's parameters. * * @param [in] node - Instance of the node to get parameters of. * @param [out] pNodeParams - Pointer to the parameters. * @returns #hipSuccess, #hipErrorInvalidValue * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipGraphMemsetNodeGetParams(hipGraphNode_t node, hipMemsetParams* pNodeParams); /** * @brief Sets a memset node's parameters. * * @param [in] node - Instance of the node to set parameters of. * @param [in] pNodeParams - Pointer to the parameters. * @returns #hipSuccess, #hipErrorInvalidValue * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipGraphMemsetNodeSetParams(hipGraphNode_t node, const hipMemsetParams* pNodeParams); /** * @brief Sets the parameters for a memset node in the given graphExec. * * @param [in] hGraphExec - Instance of the executable graph with the node. * @param [in] node - Instance of the node to set parameters of. * @param [in] pNodeParams - Pointer to the parameters. * @returns #hipSuccess, #hipErrorInvalidValue * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipGraphExecMemsetNodeSetParams(hipGraphExec_t hGraphExec, hipGraphNode_t node, const hipMemsetParams* pNodeParams); /** * @brief Creates a host execution node and adds it to a graph. * * @param [out] pGraphNode - Pointer to graph node that is created. * @param [in] graph - Instance of the graph to add the created node to. * @param [in] pDependencies - const pointer to the dependencies of the memset execution node. * @param [in] numDependencies - Number of dependencies. * @param [in] pNodeParams - Pointer to the parameters. * @returns #hipSuccess, #hipErrorInvalidValue * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipGraphAddHostNode(hipGraphNode_t* pGraphNode, hipGraph_t graph, const hipGraphNode_t* pDependencies, size_t numDependencies, const hipHostNodeParams* pNodeParams); /** * @brief Returns a host node's parameters. * * @param [in] node - Instance of the node to get parameters of. * @param [out] pNodeParams - Pointer to the parameters. * @returns #hipSuccess, #hipErrorInvalidValue * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipGraphHostNodeGetParams(hipGraphNode_t node, hipHostNodeParams* pNodeParams); /** * @brief Sets a host node's parameters. * * @param [in] node - Instance of the node to set parameters of. * @param [in] pNodeParams - Pointer to the parameters. * @returns #hipSuccess, #hipErrorInvalidValue * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipGraphHostNodeSetParams(hipGraphNode_t node, const hipHostNodeParams* pNodeParams); /** * @brief Sets the parameters for a host node in the given graphExec. * * @param [in] hGraphExec - Instance of the executable graph with the node. * @param [in] node - Instance of the node to set parameters of. * @param [in] pNodeParams - Pointer to the parameters. * @returns #hipSuccess, #hipErrorInvalidValue * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipGraphExecHostNodeSetParams(hipGraphExec_t hGraphExec, hipGraphNode_t node, const hipHostNodeParams* pNodeParams); /** * @brief Creates a child graph node and adds it to a graph. * * @param [out] pGraphNode - Pointer to graph node that is created. * @param [in] graph - Instance of the graph to add the created node. * @param [in] pDependencies - const pointer to the dependencies of the memset execution node. * @param [in] numDependencies - Number of dependencies. * @param [in] childGraph - Graph to clone into this node * @returns #hipSuccess, #hipErrorInvalidValue * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipGraphAddChildGraphNode(hipGraphNode_t* pGraphNode, hipGraph_t graph, const hipGraphNode_t* pDependencies, size_t numDependencies, hipGraph_t childGraph); /** * @brief Gets a handle to the embedded graph of a child graph node. * * @param [in] node - Instance of the node to get child graph of. * @param [out] pGraph - Pointer to get the graph. * @returns #hipSuccess, #hipErrorInvalidValue * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipGraphChildGraphNodeGetGraph(hipGraphNode_t node, hipGraph_t* pGraph); /** * @brief Updates node parameters in the child graph node in the given graphExec. * * @param [in] hGraphExec - instance of the executable graph with the node. * @param [in] node - node from the graph which was used to instantiate graphExec. * @param [in] childGraph - child graph with updated parameters. * @returns #hipSuccess, #hipErrorInvalidValue * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipGraphExecChildGraphNodeSetParams(hipGraphExec_t hGraphExec, hipGraphNode_t node, hipGraph_t childGraph); /** * @brief Creates an empty node and adds it to a graph. * * @param [out] pGraphNode - Pointer to graph node that is created. * @param [in] graph - Instance of the graph the node is added to. * @param [in] pDependencies - const pointer to the node dependencies. * @param [in] numDependencies - Number of dependencies. * @returns #hipSuccess, #hipErrorInvalidValue * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipGraphAddEmptyNode(hipGraphNode_t* pGraphNode, hipGraph_t graph, const hipGraphNode_t* pDependencies, size_t numDependencies); /** * @brief Creates an event record node and adds it to a graph. * * @param [out] pGraphNode - Pointer to graph node that is created. * @param [in] graph - Instance of the graph the node is added to. * @param [in] pDependencies - const pointer to the node dependencies. * @param [in] numDependencies - Number of dependencies. * @param [in] event - Event of the node. * @returns #hipSuccess, #hipErrorInvalidValue * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipGraphAddEventRecordNode(hipGraphNode_t* pGraphNode, hipGraph_t graph, const hipGraphNode_t* pDependencies, size_t numDependencies, hipEvent_t event); /** * @brief Returns the event associated with an event record node. * * @param [in] node - Instance of the node to get event of. * @param [out] event_out - Pointer to return the event. * @returns #hipSuccess, #hipErrorInvalidValue * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipGraphEventRecordNodeGetEvent(hipGraphNode_t node, hipEvent_t* event_out); /** * @brief Sets an event record node's event. * * @param [in] node - Instance of the node to set event to. * @param [in] event - Pointer to the event. * @returns #hipSuccess, #hipErrorInvalidValue * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipGraphEventRecordNodeSetEvent(hipGraphNode_t node, hipEvent_t event); /** * @brief Sets the event for an event record node in the given graphExec. * * @param [in] hGraphExec - instance of the executable graph with the node. * @param [in] hNode - node from the graph which was used to instantiate graphExec. * @param [in] event - pointer to the event. * @returns #hipSuccess, #hipErrorInvalidValue * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipGraphExecEventRecordNodeSetEvent(hipGraphExec_t hGraphExec, hipGraphNode_t hNode, hipEvent_t event); /** * @brief Creates an event wait node and adds it to a graph. * * @param [out] pGraphNode - Pointer to graph node that is created. * @param [in] graph - Instance of the graph the node to be added. * @param [in] pDependencies - const pointer to the node dependencies. * @param [in] numDependencies - Number of dependencies. * @param [in] event - Event for the node. * @returns #hipSuccess, #hipErrorInvalidValue * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipGraphAddEventWaitNode(hipGraphNode_t* pGraphNode, hipGraph_t graph, const hipGraphNode_t* pDependencies, size_t numDependencies, hipEvent_t event); /** * @brief Returns the event associated with an event wait node. * * @param [in] node - Instance of the node to get event of. * @param [out] event_out - Pointer to return the event. * @returns #hipSuccess, #hipErrorInvalidValue * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipGraphEventWaitNodeGetEvent(hipGraphNode_t node, hipEvent_t* event_out); /** * @brief Sets an event wait node's event. * * @param [in] node - Instance of the node to set event of. * @param [in] event - Pointer to the event. * @returns #hipSuccess, #hipErrorInvalidValue * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipGraphEventWaitNodeSetEvent(hipGraphNode_t node, hipEvent_t event); /** * @brief Sets the event for an event record node in the given graphExec. * * @param [in] hGraphExec - instance of the executable graph with the node. * @param [in] hNode - node from the graph which was used to instantiate graphExec. * @param [in] event - pointer to the event. * @returns #hipSuccess, #hipErrorInvalidValue * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipGraphExecEventWaitNodeSetEvent(hipGraphExec_t hGraphExec, hipGraphNode_t hNode, hipEvent_t event); /** * @brief Creates a memory allocation node and adds it to a graph * * @param [out] pGraphNode - Pointer to the graph node to create and add to the graph * @param [in] graph - Instance of the graph node to be added * @param [in] pDependencies - Const pointer to the node dependencies * @param [in] numDependencies - The number of dependencies * @param [in, out] pNodeParams - Node parameters for memory allocation, returns a pointer to the allocated memory. * @returns #hipSuccess, #hipErrorInvalidValue * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipGraphAddMemAllocNode(hipGraphNode_t* pGraphNode, hipGraph_t graph, const hipGraphNode_t* pDependencies, size_t numDependencies, hipMemAllocNodeParams* pNodeParams); /** * @brief Returns parameters for memory allocation node * * @param [in] node - Memory allocation node to query * @param [out] pNodeParams - Parameters for the specified memory allocation node * @returns #hipSuccess, #hipErrorInvalidValue * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipGraphMemAllocNodeGetParams(hipGraphNode_t node, hipMemAllocNodeParams* pNodeParams); /** * @brief Creates a memory free node and adds it to a graph * * @param [out] pGraphNode - Pointer to the graph node to create and add to the graph * @param [in] graph - Instance of the graph node to be added * @param [in] pDependencies - Const pointer to the node dependencies * @param [in] numDependencies - The number of dependencies * @param [in] dev_ptr - Pointer to the memory to be freed * @returns #hipSuccess, #hipErrorInvalidValue * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipGraphAddMemFreeNode(hipGraphNode_t* pGraphNode, hipGraph_t graph, const hipGraphNode_t* pDependencies, size_t numDependencies, void* dev_ptr); /** * @brief Returns parameters for memory free node * * @param [in] node - Memory free node to query * @param [out] dev_ptr - Device pointer of the specified memory free node * @returns #hipSuccess, #hipErrorInvalidValue * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipGraphMemFreeNodeGetParams(hipGraphNode_t node, void* dev_ptr); /** * @brief Get the mem attribute for graphs. * * @param [in] device - Device to get attributes from * @param [in] attr - Attribute type to be queried * @param [out] value - Value of the queried attribute * @returns #hipSuccess, #hipErrorInvalidDevice * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipDeviceGetGraphMemAttribute(int device, hipGraphMemAttributeType attr, void* value); /** * @brief Set the mem attribute for graphs. * * @param [in] device - Device to set attribute of. * @param [in] attr - Attribute type to be set. * @param [in] value - Value of the attribute. * @returns #hipSuccess, #hipErrorInvalidDevice * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipDeviceSetGraphMemAttribute(int device, hipGraphMemAttributeType attr, void* value); /** * @brief Free unused memory reserved for graphs on a specific device and return it back to the OS. * * @param [in] device - Device for which memory should be trimmed * @returns #hipSuccess, #hipErrorInvalidDevice * * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipDeviceGraphMemTrim(int device); /** * @brief Create an instance of userObject to manage lifetime of a resource. * * @param [out] object_out - pointer to instace of userobj. * @param [in] ptr - pointer to pass to destroy function. * @param [in] destroy - destroy callback to remove resource. * @param [in] initialRefcount - reference to resource. * @param [in] flags - flags passed to API. * @returns #hipSuccess, #hipErrorInvalidValue * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipUserObjectCreate(hipUserObject_t* object_out, void* ptr, hipHostFn_t destroy, unsigned int initialRefcount, unsigned int flags); /** * @brief Release number of references to resource. * * @param [in] object - pointer to instace of userobj. * @param [in] count - reference to resource to be retained. * @returns #hipSuccess, #hipErrorInvalidValue * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipUserObjectRelease(hipUserObject_t object, unsigned int count __dparm(1)); /** * @brief Retain number of references to resource. * * @param [in] object - pointer to instace of userobj. * @param [in] count - reference to resource to be retained. * @returns #hipSuccess, #hipErrorInvalidValue * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipUserObjectRetain(hipUserObject_t object, unsigned int count __dparm(1)); /** * @brief Retain user object for graphs. * * @param [in] graph - pointer to graph to retain the user object for. * @param [in] object - pointer to instace of userobj. * @param [in] count - reference to resource to be retained. * @param [in] flags - flags passed to API. * @returns #hipSuccess, #hipErrorInvalidValue * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipGraphRetainUserObject(hipGraph_t graph, hipUserObject_t object, unsigned int count __dparm(1), unsigned int flags __dparm(0)); /** * @brief Release user object from graphs. * * @param [in] graph - pointer to graph to retain the user object for. * @param [in] object - pointer to instace of userobj. * @param [in] count - reference to resource to be retained. * @returns #hipSuccess, #hipErrorInvalidValue * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipGraphReleaseUserObject(hipGraph_t graph, hipUserObject_t object, unsigned int count __dparm(1)); /** * @brief Write a DOT file describing graph structure. * * @param [in] graph - graph object for which DOT file has to be generated. * @param [in] path - path to write the DOT file. * @param [in] flags - Flags from hipGraphDebugDotFlags to get additional node information. * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorOperatingSystem * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipGraphDebugDotPrint(hipGraph_t graph, const char* path, unsigned int flags); /** * @brief Copies attributes from source node to destination node. * * Copies attributes from source node to destination node. * Both node must have the same context. * * @param [out] hDst - Destination node. * @param [in] hSrc - Source node. * For list of attributes see ::hipKernelNodeAttrID. * * @returns #hipSuccess, #hipErrorInvalidContext * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipGraphKernelNodeCopyAttributes(hipGraphNode_t hSrc, hipGraphNode_t hDst); /** * @brief Enables or disables the specified node in the given graphExec * * Sets hNode to be either enabled or disabled. Disabled nodes are functionally equivalent * to empty nodes until they are reenabled. Existing node parameters are not affected by * disabling/enabling the node. * * The node is identified by the corresponding hNode in the non-executable graph, from which the * executable graph was instantiated. * * hNode must not have been removed from the original graph. * * @note Currently only kernel, memset and memcpy nodes are supported. * * @param [in] hGraphExec - The executable graph in which to set the specified node. * @param [in] hNode - Node from the graph from which graphExec was instantiated. * @param [in] isEnabled - Node is enabled if != 0, otherwise the node is disabled. * * @returns #hipSuccess, #hipErrorInvalidValue, * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipGraphNodeSetEnabled(hipGraphExec_t hGraphExec, hipGraphNode_t hNode, unsigned int isEnabled); /** * @brief Query whether a node in the given graphExec is enabled * * Sets isEnabled to 1 if hNode is enabled, or 0 if it is disabled. * * The node is identified by the corresponding node in the non-executable graph, from which the * executable graph was instantiated. * * hNode must not have been removed from the original graph. * * @note Currently only kernel, memset and memcpy nodes are supported. * * @param [in] hGraphExec - The executable graph in which to set the specified node. * @param [in] hNode - Node from the graph from which graphExec was instantiated. * @param [out] isEnabled - Location to return the enabled status of the node. * * @returns #hipSuccess, #hipErrorInvalidValue * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipGraphNodeGetEnabled(hipGraphExec_t hGraphExec, hipGraphNode_t hNode, unsigned int* isEnabled); /** * @brief Creates a external semaphor wait node and adds it to a graph. * * @param [out] pGraphNode - pointer to the graph node to create. * @param [in] graph - instance of the graph to add the created node. * @param [in] pDependencies - const pointer to the dependencies on the memset execution node. * @param [in] numDependencies - the number of the dependencies. * @param [in] nodeParams -pointer to the parameters. * @returns #hipSuccess, #hipErrorInvalidValue * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipGraphAddExternalSemaphoresWaitNode(hipGraphNode_t* pGraphNode, hipGraph_t graph, const hipGraphNode_t* pDependencies, size_t numDependencies, const hipExternalSemaphoreWaitNodeParams* nodeParams); /** * @brief Creates a external semaphor signal node and adds it to a graph. * * @param [out] pGraphNode - pointer to the graph node to create. * @param [in] graph - instance of the graph to add the created node. * @param [in] pDependencies - const pointer to the dependencies on the memset execution node. * @param [in] numDependencies - the number of the dependencies. * @param [in] nodeParams -pointer to the parameters. * @returns #hipSuccess, #hipErrorInvalidValue * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipGraphAddExternalSemaphoresSignalNode(hipGraphNode_t* pGraphNode, hipGraph_t graph, const hipGraphNode_t* pDependencies, size_t numDependencies, const hipExternalSemaphoreSignalNodeParams* nodeParams); /** * @brief Updates node parameters in the external semaphore signal node. * * @param [in] hNode - Node from the graph from which graphExec was instantiated. * @param [in] nodeParams - Pointer to the params to be set. * @returns #hipSuccess, #hipErrorInvalidValue * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipGraphExternalSemaphoresSignalNodeSetParams(hipGraphNode_t hNode, const hipExternalSemaphoreSignalNodeParams* nodeParams); /** * @brief Updates node parameters in the external semaphore wait node. * * @param [in] hNode - Node from the graph from which graphExec was instantiated. * @param [in] nodeParams - Pointer to the params to be set. * @returns #hipSuccess, #hipErrorInvalidValue * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipGraphExternalSemaphoresWaitNodeSetParams(hipGraphNode_t hNode, const hipExternalSemaphoreWaitNodeParams* nodeParams); /** * @brief Returns external semaphore signal node params. * * @param [in] hNode - Node from the graph from which graphExec was instantiated. * @param [out] params_out - Pointer to params. * @returns #hipSuccess, #hipErrorInvalidValue * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipGraphExternalSemaphoresSignalNodeGetParams(hipGraphNode_t hNode, hipExternalSemaphoreSignalNodeParams* params_out); /** * @brief Returns external semaphore wait node params. * * @param [in] hNode - Node from the graph from which graphExec was instantiated. * @param [out] params_out - Pointer to params. * @returns #hipSuccess, #hipErrorInvalidValue * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipGraphExternalSemaphoresWaitNodeGetParams(hipGraphNode_t hNode, hipExternalSemaphoreWaitNodeParams* params_out); /** * @brief Updates node parameters in the external semaphore signal node in the given graphExec. * * @param [in] hGraphExec - The executable graph in which to set the specified node. * @param [in] hNode - Node from the graph from which graphExec was instantiated. * @param [in] nodeParams - Pointer to the params to be set. * @returns #hipSuccess, #hipErrorInvalidValue * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipGraphExecExternalSemaphoresSignalNodeSetParams(hipGraphExec_t hGraphExec, hipGraphNode_t hNode, const hipExternalSemaphoreSignalNodeParams* nodeParams); /** * @brief Updates node parameters in the external semaphore wait node in the given graphExec. * * @param [in] hGraphExec - The executable graph in which to set the specified node. * @param [in] hNode - Node from the graph from which graphExec was instantiated. * @param [in] nodeParams - Pointer to the params to be set. * @returns #hipSuccess, #hipErrorInvalidValue * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipGraphExecExternalSemaphoresWaitNodeSetParams(hipGraphExec_t hGraphExec, hipGraphNode_t hNode, const hipExternalSemaphoreWaitNodeParams* nodeParams); /** * @brief Gets a memcpy node's parameters. * * @param [in] hNode - instance of the node to get parameters from. * @param [out] nodeParams - pointer to the parameters. * @returns #hipSuccess, #hipErrorInvalidValue * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipDrvGraphMemcpyNodeGetParams(hipGraphNode_t hNode, HIP_MEMCPY3D* nodeParams); /** * @brief Sets a memcpy node's parameters. * * @param [in] hNode - instance of the node to Set parameters for. * @param [out] nodeParams - pointer to the parameters. * @returns #hipSuccess, #hipErrorInvalidValue * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipDrvGraphMemcpyNodeSetParams(hipGraphNode_t hNode, const HIP_MEMCPY3D* nodeParams); /** * @brief Creates a memset node and adds it to a graph. * * @param [out] phGraphNode - pointer to graph node to create. * @param [in] hGraph - instance of graph to add the created node to. * @param [in] dependencies - const pointer to the dependencies on the memset execution node. * @param [in] numDependencies - number of the dependencies. * @param [in] memsetParams - const pointer to the parameters for the memory set. * @param [in] ctx - cotext related to current device. * @returns #hipSuccess, #hipErrorInvalidValue * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipDrvGraphAddMemsetNode(hipGraphNode_t* phGraphNode, hipGraph_t hGraph, const hipGraphNode_t* dependencies, size_t numDependencies, const HIP_MEMSET_NODE_PARAMS* memsetParams, hipCtx_t ctx); /** * @brief Creates a memory free node and adds it to a graph * * @param [out] phGraphNode - Pointer to the graph node to create and add to the graph * @param [in] hGraph - Instance of the graph the node to be added * @param [in] dependencies - Const pointer to the node dependencies * @param [in] numDependencies - The number of dependencies * @param [in] dptr - Pointer to the memory to be freed * @returns #hipSuccess, #hipErrorInvalidValue * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipDrvGraphAddMemFreeNode(hipGraphNode_t* phGraphNode, hipGraph_t hGraph, const hipGraphNode_t* dependencies, size_t numDependencies, hipDeviceptr_t dptr); /** * @brief Sets the parameters for a memcpy node in the given graphExec. * * @param [in] hGraphExec - instance of the executable graph with the node. * @param [in] hNode - instance of the node to set parameters to. * @param [in] copyParams - const pointer to the memcpy node params. * @param [in] ctx - cotext related to current device. * @returns #hipSuccess, #hipErrorInvalidValue * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipDrvGraphExecMemcpyNodeSetParams(hipGraphExec_t hGraphExec, hipGraphNode_t hNode, const HIP_MEMCPY3D* copyParams, hipCtx_t ctx); /** * @brief Sets the parameters for a memset node in the given graphExec. * * @param [in] hGraphExec - instance of the executable graph with the node. * @param [in] hNode - instance of the node to set parameters to. * @param [in] memsetParams - pointer to the parameters. * @param [in] ctx - cotext related to current device. * @returns #hipSuccess, #hipErrorInvalidValue * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. */ hipError_t hipDrvGraphExecMemsetNodeSetParams(hipGraphExec_t hGraphExec, hipGraphNode_t hNode, const HIP_MEMSET_NODE_PARAMS* memsetParams, hipCtx_t ctx); // doxygen end graph API /** * @} */ /** *------------------------------------------------------------------------------------------------- *------------------------------------------------------------------------------------------------- * @defgroup Virtual Virtual Memory Management * @{ * This section describes the virtual memory management functions of HIP runtime API. * * @note Please note, the virtual memory management functions of HIP runtime * API are implemented on Linux, under development on Windows. The * following Virtual Memory Management APIs are not (yet) * supported in HIP: * - hipMemMapArrayAsync */ /** * @brief Frees an address range reservation made via hipMemAddressReserve * * @param [in] devPtr - starting address of the range. * @param [in] size - size of the range. * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. * * @note This API is implemented on Linux and is under development on Microsoft Windows. */ hipError_t hipMemAddressFree(void* devPtr, size_t size); /** * @brief Reserves an address range * * @param [out] ptr - starting address of the reserved range. * @param [in] size - size of the reservation. * @param [in] alignment - alignment of the address. * @param [in] addr - requested starting address of the range. * @param [in] flags - currently unused, must be zero. * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. * * @note This API is implemented on Linux and is under development on Microsoft Windows. */ hipError_t hipMemAddressReserve(void** ptr, size_t size, size_t alignment, void* addr, unsigned long long flags); /** * @brief Creates a memory allocation described by the properties and size * * @param [out] handle - value of the returned handle. * @param [in] size - size of the allocation. * @param [in] prop - properties of the allocation. * @param [in] flags - currently unused, must be zero. * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. * * @note This API is implemented on Linux and is under development on Microsoft Windows. */ hipError_t hipMemCreate(hipMemGenericAllocationHandle_t* handle, size_t size, const hipMemAllocationProp* prop, unsigned long long flags); /** * @brief Exports an allocation to a requested shareable handle type. * * @param [out] shareableHandle - value of the returned handle. * @param [in] handle - handle to share. * @param [in] handleType - type of the shareable handle. * @param [in] flags - currently unused, must be zero. * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. * * @note This API is implemented on Linux and is under development on Microsoft Windows. */ hipError_t hipMemExportToShareableHandle(void* shareableHandle, hipMemGenericAllocationHandle_t handle, hipMemAllocationHandleType handleType, unsigned long long flags); /** * @brief Get the access flags set for the given location and ptr. * * @param [out] flags - flags for this location. * @param [in] location - target location. * @param [in] ptr - address to check the access flags. * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. * * @note This API is implemented on Linux and is under development on Microsoft Windows. */ hipError_t hipMemGetAccess(unsigned long long* flags, const hipMemLocation* location, void* ptr); /** * @brief Calculates either the minimal or recommended granularity. * * @param [out] granularity - returned granularity. * @param [in] prop - location properties. * @param [in] option - determines which granularity to return. * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. * * @note This API is implemented on Linux and is under development on Microsoft Windows. * */ hipError_t hipMemGetAllocationGranularity(size_t* granularity, const hipMemAllocationProp* prop, hipMemAllocationGranularity_flags option); /** * @brief Retrieve the property structure of the given handle. * * @param [out] prop - properties of the given handle. * @param [in] handle - handle to perform the query on. * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. * * @note This API is implemented on Linux and is under development on Microsoft Windows. */ hipError_t hipMemGetAllocationPropertiesFromHandle(hipMemAllocationProp* prop, hipMemGenericAllocationHandle_t handle); /** * @brief Imports an allocation from a requested shareable handle type. * * @param [out] handle - returned value. * @param [in] osHandle - shareable handle representing the memory allocation. * @param [in] shHandleType - handle type. * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. * * @note This API is implemented on Linux and is under development on Microsoft Windows. */ hipError_t hipMemImportFromShareableHandle(hipMemGenericAllocationHandle_t* handle, void* osHandle, hipMemAllocationHandleType shHandleType); /** * @brief Maps an allocation handle to a reserved virtual address range. * * @param [in] ptr - address where the memory will be mapped. * @param [in] size - size of the mapping. * @param [in] offset - offset into the memory, currently must be zero. * @param [in] handle - memory allocation to be mapped. * @param [in] flags - currently unused, must be zero. * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. * * @note This API is implemented on Linux and is under development on Microsoft Windows. */ hipError_t hipMemMap(void* ptr, size_t size, size_t offset, hipMemGenericAllocationHandle_t handle, unsigned long long flags); /** * @brief Maps or unmaps subregions of sparse HIP arrays and sparse HIP mipmapped arrays. * * @param [in] mapInfoList - list of hipArrayMapInfo. * @param [in] count - number of hipArrayMapInfo in mapInfoList. * @param [in] stream - stream identifier for the stream to use for map or unmap operations. * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported * @warning This API is under development. Currently it is not supported on AMD * GPUs and returns #hipErrorNotSupported. */ hipError_t hipMemMapArrayAsync(hipArrayMapInfo* mapInfoList, unsigned int count, hipStream_t stream); /** * @brief Release a memory handle representing a memory allocation which was previously allocated through hipMemCreate. * * @param [in] handle - handle of the memory allocation. * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. * * @note This API is implemented on Linux and is under development on Microsoft Windows. */ hipError_t hipMemRelease(hipMemGenericAllocationHandle_t handle); /** * @brief Returns the allocation handle of the backing memory allocation given the address. * * @param [out] handle - handle representing addr. * @param [in] addr - address to look up. * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. * * @note This API is implemented on Linux and is under development on Microsoft Windows. */ hipError_t hipMemRetainAllocationHandle(hipMemGenericAllocationHandle_t* handle, void* addr); /** * @brief Set the access flags for each location specified in desc for the given virtual address range. * * @param [in] ptr - starting address of the virtual address range. * @param [in] size - size of the range. * @param [in] desc - array of hipMemAccessDesc. * @param [in] count - number of hipMemAccessDesc in desc. * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. * * @note This API is implemented on Linux and is under development on Microsoft Windows. */ hipError_t hipMemSetAccess(void* ptr, size_t size, const hipMemAccessDesc* desc, size_t count); /** * @brief Unmap memory allocation of a given address range. * * @param [in] ptr - starting address of the range to unmap. * @param [in] size - size of the virtual address range. * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported * @warning This API is marked as Beta. While this feature is complete, it can * change and might have outstanding issues. * * @note This API is implemented on Linux and is under development on Microsoft Windows. */ hipError_t hipMemUnmap(void* ptr, size_t size); // doxygen end virtual memory management API /** * @} */ /** *------------------------------------------------------------------------------------------------- *------------------------------------------------------------------------------------------------- * @defgroup GraphicsInterop Graphics Interoperability * @{ * This section describes graphics interoperability functions of HIP runtime API. */ /** * @brief Maps a graphics resource for access. * * @param [in] count - Number of resources to map. * @param [in] resources - Pointer of resources to map. * @param [in] stream - Stream for synchronization. * * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorUnknown, #hipErrorInvalidResourceHandle * */ hipError_t hipGraphicsMapResources(int count, hipGraphicsResource_t* resources, hipStream_t stream __dparm(0) ); /** * @brief Get an array through which to access a subresource of a mapped graphics resource. * * @param [out] array - Pointer of array through which a subresource of resource may be accessed. * @param [in] resource - Mapped resource to access. * @param [in] arrayIndex - Array index for the subresource to access. * @param [in] mipLevel - Mipmap level for the subresource to access. * * @returns #hipSuccess, #hipErrorInvalidValue * * @note In this API, the value of arrayIndex higher than zero is currently not supported. * */ hipError_t hipGraphicsSubResourceGetMappedArray(hipArray_t* array, hipGraphicsResource_t resource, unsigned int arrayIndex, unsigned int mipLevel); /** * @brief Gets device accessible address of a graphics resource. * * @param [out] devPtr - Pointer of device through which graphic resource may be accessed. * @param [out] size - Size of the buffer accessible from devPtr. * @param [in] resource - Mapped resource to access. * * @returns #hipSuccess, #hipErrorInvalidValue * */ hipError_t hipGraphicsResourceGetMappedPointer(void** devPtr, size_t* size, hipGraphicsResource_t resource); /** * @brief Unmaps graphics resources. * * @param [in] count - Number of resources to unmap. * @param [in] resources - Pointer of resources to unmap. * @param [in] stream - Stream for synchronization. * * @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorUnknown, #hipErrorContextIsDestroyed * */ hipError_t hipGraphicsUnmapResources(int count, hipGraphicsResource_t* resources, hipStream_t stream __dparm(0)); /** * @brief Unregisters a graphics resource. * * @param [in] resource - Graphics resources to unregister. * * @returns #hipSuccess * */ hipError_t hipGraphicsUnregisterResource(hipGraphicsResource_t resource); // doxygen end GraphicsInterop /** * @} */ /** *------------------------------------------------------------------------------------------------- *------------------------------------------------------------------------------------------------- * @defgroup Surface Surface Object * @{ * * This section describes surface object functions of HIP runtime API. * * @note APIs in this section are under development. * */ /** * @brief Create a surface object. * * @param [out] pSurfObject Pointer of surface object to be created. * @param [in] pResDesc Pointer of suface object descriptor. * * @returns #hipSuccess, #hipErrorInvalidValue * */ hipError_t hipCreateSurfaceObject(hipSurfaceObject_t* pSurfObject, const hipResourceDesc* pResDesc); /** * @brief Destroy a surface object. * * @param [in] surfaceObject Surface object to be destroyed. * * @returns #hipSuccess, #hipErrorInvalidValue */ hipError_t hipDestroySurfaceObject(hipSurfaceObject_t surfaceObject); // end of surface /** * @} */ #ifdef __cplusplus } /* extern "c" */ #endif #ifdef __cplusplus #if defined(__clang__) && defined(__HIP__) template static hipError_t __host__ inline hipOccupancyMaxPotentialBlockSize(int* gridSize, int* blockSize, T f, size_t dynSharedMemPerBlk = 0, int blockSizeLimit = 0) { return hipOccupancyMaxPotentialBlockSize(gridSize, blockSize, reinterpret_cast(f),dynSharedMemPerBlk,blockSizeLimit); } template static hipError_t __host__ inline hipOccupancyMaxPotentialBlockSizeWithFlags(int* gridSize, int* blockSize, T f, size_t dynSharedMemPerBlk = 0, int blockSizeLimit = 0, unsigned int flags = 0 ) { return hipOccupancyMaxPotentialBlockSize(gridSize, blockSize, reinterpret_cast(f),dynSharedMemPerBlk,blockSizeLimit); } #endif // defined(__clang__) && defined(__HIP__) /** * @brief Gets the address of a symbol. * @ingroup Memory * @param [out] devPtr - Returns device pointer associated with symbol. * @param [in] symbol - Device symbol. * * @returns #hipSuccess, #hipErrorInvalidValue * */ template hipError_t hipGetSymbolAddress(void** devPtr, const T &symbol) { return ::hipGetSymbolAddress(devPtr, (const void *)&symbol); } /** * @ingroup Memory * @brief Gets the size of a symbol. * * @param [out] size - Returns the size of a symbol. * @param [in] symbol - Device symbol address. * * @returns #hipSuccess, #hipErrorInvalidValue * */ template hipError_t hipGetSymbolSize(size_t* size, const T &symbol) { return ::hipGetSymbolSize(size, (const void *)&symbol); } /** * @ingroup Memory * @brief Copies data to the given symbol on the device. * * @returns #hipSuccess, #hipErrorInvalidMemcpyDirection, #hipErrorInvalidValue * * @see hipMemcpyToSymbol */ template hipError_t hipMemcpyToSymbol(const T& symbol, const void* src, size_t sizeBytes, size_t offset __dparm(0), hipMemcpyKind kind __dparm(hipMemcpyHostToDevice)) { return ::hipMemcpyToSymbol((const void*)&symbol, src, sizeBytes, offset, kind); } /** * @ingroup Memory * @brief Copies data to the given symbol on the device asynchronously on the stream. * * @returns #hipSuccess, #hipErrorInvalidMemcpyDirection, #hipErrorInvalidValue * * @see hipMemcpyToSymbolAsync */ template hipError_t hipMemcpyToSymbolAsync(const T& symbol, const void* src, size_t sizeBytes, size_t offset, hipMemcpyKind kind, hipStream_t stream __dparm(0)) { return ::hipMemcpyToSymbolAsync((const void*)&symbol, src, sizeBytes, offset, kind, stream); } /** * @brief Copies data from the given symbol on the device. * @ingroup Memory * @returns #hipSuccess, #hipErrorInvalidMemcpyDirection, #hipErrorInvalidValue * * @see hipMemcpyFromSymbol */ template hipError_t hipMemcpyFromSymbol(void* dst, const T &symbol, size_t sizeBytes, size_t offset __dparm(0), hipMemcpyKind kind __dparm(hipMemcpyDeviceToHost)) { return ::hipMemcpyFromSymbol(dst, (const void*)&symbol, sizeBytes, offset, kind); } /** * @brief Copies data from the given symbol on the device asynchronously on the stream. * @ingroup Memory * @returns #hipSuccess, #hipErrorInvalidMemcpyDirection, #hipErrorInvalidValue * * @see hipMemcpyFromSymbolAsync */ template hipError_t hipMemcpyFromSymbolAsync(void* dst, const T& symbol, size_t sizeBytes, size_t offset, hipMemcpyKind kind, hipStream_t stream __dparm(0)) { return ::hipMemcpyFromSymbolAsync(dst, (const void*)&symbol, sizeBytes, offset, kind, stream); } /** * @brief Returns occupancy for a kernel function. * @ingroup Occupancy * @param [out] numBlocks - Pointer of occupancy in number of blocks. * @param [in] f - The kernel function to launch on the device. * @param [in] blockSize - The block size as kernel launched. * @param [in] dynSharedMemPerBlk - Dynamic shared memory in bytes per block. * * @returns #hipSuccess, #hipErrorInvalidValue * */ template inline hipError_t hipOccupancyMaxActiveBlocksPerMultiprocessor( int* numBlocks, T f, int blockSize, size_t dynSharedMemPerBlk) { return hipOccupancyMaxActiveBlocksPerMultiprocessor( numBlocks, reinterpret_cast(f), blockSize, dynSharedMemPerBlk); } /** * @brief Returns occupancy for a device function with the specified flags. * * @ingroup Occupancy * @param [out] numBlocks - Pointer of occupancy in number of blocks. * @param [in] f - The kernel function to launch on the device. * @param [in] blockSize - The block size as kernel launched. * @param [in] dynSharedMemPerBlk - Dynamic shared memory in bytes per block. * @param [in] flags - Flag to handle the behavior for the occupancy calculator. * * @returns #hipSuccess, #hipErrorInvalidValue * */ template inline hipError_t hipOccupancyMaxActiveBlocksPerMultiprocessorWithFlags( int* numBlocks, T f, int blockSize, size_t dynSharedMemPerBlk, unsigned int flags) { return hipOccupancyMaxActiveBlocksPerMultiprocessorWithFlags( numBlocks, reinterpret_cast(f), blockSize, dynSharedMemPerBlk, flags); } /** * @brief Returns grid and block size that achieves maximum potential occupancy for a device function * * @ingroup Occupancy * Returns in \p *min_grid_size and \p *block_size a suggested grid / * block size pair that achieves the best potential occupancy * (i.e. the maximum number of active warps on the current device with the smallest number * of blocks for a particular function). * * @param [out] min_grid_size minimum grid size needed to achieve the best potential occupancy * @param [out] block_size block size required for the best potential occupancy * @param [in] func device function symbol * @param [in] block_size_to_dynamic_smem_size - a unary function/functor that takes block size, * and returns the size, in bytes, of dynamic shared memory needed for a block * @param [in] block_size_limit the maximum block size \p func is designed to work with. 0 means no limit. * @param [in] flags reserved * * @return #hipSuccess, #hipErrorInvalidDevice, #hipErrorInvalidDeviceFunction, #hipErrorInvalidValue, * #hipErrorUnknown */ template static hipError_t __host__ inline hipOccupancyMaxPotentialBlockSizeVariableSMemWithFlags( int* min_grid_size, int* block_size, T func, UnaryFunction block_size_to_dynamic_smem_size, int block_size_limit = 0, unsigned int flags = 0) { if (min_grid_size == nullptr || block_size == nullptr || reinterpret_cast(func) == nullptr) { return hipErrorInvalidValue; } int dev; hipError_t status; if ((status = hipGetDevice(&dev)) != hipSuccess) { return status; } int max_threads_per_cu; if ((status = hipDeviceGetAttribute(&max_threads_per_cu, hipDeviceAttributeMaxThreadsPerMultiProcessor, dev)) != hipSuccess) { return status; } int warp_size; if ((status = hipDeviceGetAttribute(&warp_size, hipDeviceAttributeWarpSize, dev)) != hipSuccess) { return status; } int max_cu_count; if ((status = hipDeviceGetAttribute(&max_cu_count, hipDeviceAttributeMultiprocessorCount, dev)) != hipSuccess) { return status; } struct hipFuncAttributes attr; if ((status = hipFuncGetAttributes(&attr, reinterpret_cast(func))) != hipSuccess) { return status; } // Initial limits for the execution const int func_max_threads_per_block = attr.maxThreadsPerBlock; if (block_size_limit == 0) { block_size_limit = func_max_threads_per_block; } if (func_max_threads_per_block < block_size_limit) { block_size_limit = func_max_threads_per_block; } const int block_size_limit_aligned = ((block_size_limit + (warp_size - 1)) / warp_size) * warp_size; // For maximum search int max_threads = 0; int max_block_size{}; int max_num_blocks{}; for (int block_size_check_aligned = block_size_limit_aligned; block_size_check_aligned > 0; block_size_check_aligned -= warp_size) { // Make sure the logic uses the requested limit and not aligned int block_size_check = (block_size_limit < block_size_check_aligned) ? block_size_limit : block_size_check_aligned; size_t dyn_smem_size = block_size_to_dynamic_smem_size(block_size_check); int optimal_blocks; if ((status = hipOccupancyMaxActiveBlocksPerMultiprocessorWithFlags( &optimal_blocks, func, block_size_check, dyn_smem_size, flags)) != hipSuccess) { return status; } int total_threads = block_size_check * optimal_blocks; if (total_threads > max_threads) { max_block_size = block_size_check; max_num_blocks = optimal_blocks; max_threads = total_threads; } // Break if the logic reached possible maximum if (max_threads_per_cu == max_threads) { break; } } // Grid size is the number of blocks per CU * CU count *min_grid_size = max_num_blocks * max_cu_count; *block_size = max_block_size; return status; } /** * @brief Returns grid and block size that achieves maximum potential occupancy for a device function * * @ingroup Occupancy * Returns in \p *min_grid_size and \p *block_size a suggested grid / * block size pair that achieves the best potential occupancy * (i.e. the maximum number of active warps on the current device with the smallest number * of blocks for a particular function). * * @param [out] min_grid_size minimum grid size needed to achieve the best potential occupancy * @param [out] block_size block size required for the best potential occupancy * @param [in] func device function symbol * @param [in] block_size_to_dynamic_smem_size - a unary function/functor that takes block size, * and returns the size, in bytes, of dynamic shared memory needed for a block * @param [in] block_size_limit the maximum block size \p func is designed to work with. 0 means no limit. * * @return #hipSuccess, #hipErrorInvalidDevice, #hipErrorInvalidDeviceFunction, #hipErrorInvalidValue, * #hipErrorUnknown */ template static hipError_t __host__ inline hipOccupancyMaxPotentialBlockSizeVariableSMem( int* min_grid_size, int* block_size, T func, UnaryFunction block_size_to_dynamic_smem_size, int block_size_limit = 0) { return hipOccupancyMaxPotentialBlockSizeVariableSMemWithFlags(min_grid_size, block_size, func, block_size_to_dynamic_smem_size, block_size_limit); } /** * @brief Returns grid and block size that achieves maximum potential occupancy for a device function * * @ingroup Occupancy * * Returns in \p *min_grid_size and \p *block_size a suggested grid / * block size pair that achieves the best potential occupancy * (i.e. the maximum number of active warps on the current device with the smallest number * of blocks for a particular function). * * @return #hipSuccess, #hipErrorInvalidDevice, #hipErrorInvalidValue * * @see hipOccupancyMaxPotentialBlockSize */ template inline hipError_t hipOccupancyMaxPotentialBlockSize(int* gridSize, int* blockSize, F kernel, size_t dynSharedMemPerBlk, uint32_t blockSizeLimit) { return hipOccupancyMaxPotentialBlockSize(gridSize, blockSize,(hipFunction_t)kernel, dynSharedMemPerBlk, blockSizeLimit); } /** * @brief Launches a device function * * @ingroup Execution * @ingroup ModuleCooperativeG * * \tparam T The type of the kernel function. * * @param [in] f Kernel function to launch. * @param [in] gridDim Grid dimensions specified as multiple of blockDim. * @param [in] blockDim Block dimensions specified in work-items. * @param [in] kernelParams A list of kernel arguments. * @param [in] sharedMemBytes Amount of dynamic shared memory to allocate for * this kernel. The HIP-Clang compiler provides * support for extern shared declarations. * @param [in] stream Stream which on the kernel launched. * * @return #hipSuccess, #hipErrorLaunchFailure, #hipErrorInvalidValue, * #hipErrorInvalidResourceHandle * */ template inline hipError_t hipLaunchCooperativeKernel(T f, dim3 gridDim, dim3 blockDim, void** kernelParams, unsigned int sharedMemBytes, hipStream_t stream) { return hipLaunchCooperativeKernel(reinterpret_cast(f), gridDim, blockDim, kernelParams, sharedMemBytes, stream); } /** * @brief Launches kernel function on multiple devices, where thread blocks can * cooperate and synchronize on execution. * * @ingroup Execution * @ingroup ModuleCooperativeG * * @param [in] launchParamsList List of kernel launch parameters, one per device. * @param [in] numDevices Size of launchParamsList array. * @param [in] flags Flag to handle launch behavior. * * @return #hipSuccess, #hipErrorLaunchFailure, #hipErrorInvalidValue, * #hipErrorInvalidResourceHandle * */ template inline hipError_t hipLaunchCooperativeKernelMultiDevice(hipLaunchParams* launchParamsList, unsigned int numDevices, unsigned int flags = 0) { return hipLaunchCooperativeKernelMultiDevice(launchParamsList, numDevices, flags); } /** * @brief Launches kernels on multiple devices and guarantees all specified kernels are dispatched * on respective streams before enqueuing any other work on the specified streams from any other threads * @ingroup Execution * * @param [in] launchParamsList List of launch parameters, one per device. * @param [in] numDevices Size of the launchParamsList array. * @param [in] flags Flags to control launch behavior. * * @returns #hipSuccess, #hipErrorInvalidValue */ template inline hipError_t hipExtLaunchMultiKernelMultiDevice(hipLaunchParams* launchParamsList, unsigned int numDevices, unsigned int flags = 0) { return hipExtLaunchMultiKernelMultiDevice(launchParamsList, numDevices, flags); } /** * @brief Binds a memory area to a texture [Deprecated] * * @ingroup TextureD * * @param [in] offset Offset in bytes. * @param [in] tex Texture to bind. * @param [in] devPtr Pointer of memory on the device. * @param [in] size Size of memory in bites. * * @warning This API is deprecated. * */ template HIP_DEPRECATED(HIP_DEPRECATED_MSG) static inline hipError_t hipBindTexture(size_t* offset, const struct texture& tex, const void* devPtr, size_t size = UINT_MAX) { return hipBindTexture(offset, &tex, devPtr, &tex.channelDesc, size); } /** * @brief Binds a memory area to a texture [Deprecated] * * @ingroup TextureD * * @param [in] offset Offset in bytes. * @param [in] tex Texture to bind. * @param [in] devPtr Pointer of memory on the device. * @param [in] desc Texture channel format. * @param [in] size Size of memory in bites. * * @warning This API is deprecated. * */ template HIP_DEPRECATED(HIP_DEPRECATED_MSG) static inline hipError_t hipBindTexture(size_t* offset, const struct texture& tex, const void* devPtr, const struct hipChannelFormatDesc& desc, size_t size = UINT_MAX) { return hipBindTexture(offset, &tex, devPtr, &desc, size); } /** * @brief Binds a 2D memory area to a texture [Deprecated] * * @ingroup TextureD * * @param [in] offset Offset in bytes. * @param [in] tex Texture to bind. * @param [in] devPtr Pointer of 2D memory area on the device. * @param [in] width Width in texel units. * @param [in] height Height in texel units. * @param [in] pitch Pitch in bytes. * * @warning This API is deprecated. * */ template HIP_DEPRECATED(HIP_DEPRECATED_MSG) static inline hipError_t hipBindTexture2D( size_t *offset, const struct texture &tex, const void *devPtr, size_t width, size_t height, size_t pitch) { return hipBindTexture2D(offset, &tex, devPtr, &tex.channelDesc, width, height, pitch); } /** * @brief Binds a 2D memory area to a texture [Deprecated] * * @ingroup TextureD * * @param [in] offset Offset in bytes. * @param [in] tex Texture to bind. * @param [in] devPtr Pointer of 2D memory area on the device. * @param [in] desc Texture channel format. * @param [in] width Width in texel units. * @param [in] height Height in texel units. * @param [in] pitch Pitch in bytes. * * @warning This API is deprecated. * */ template HIP_DEPRECATED(HIP_DEPRECATED_MSG) static inline hipError_t hipBindTexture2D( size_t *offset, const struct texture &tex, const void *devPtr, const struct hipChannelFormatDesc &desc, size_t width, size_t height, size_t pitch) { return hipBindTexture2D(offset, &tex, devPtr, &desc, width, height, pitch); } /** * @brief Binds an array to a texture [Deprecated] * * @ingroup TextureD * * @param [in] tex Texture to bind. * @param [in] array Array of memory on the device. * * @warning This API is deprecated. * */ template HIP_DEPRECATED(HIP_DEPRECATED_MSG) static inline hipError_t hipBindTextureToArray( const struct texture &tex, hipArray_const_t array) { struct hipChannelFormatDesc desc; hipError_t err = hipGetChannelDesc(&desc, array); return (err == hipSuccess) ? hipBindTextureToArray(&tex, array, &desc) : err; } /** * @brief Binds an array to a texture [Deprecated] * * @ingroup TextureD * * @param [in] tex Texture to bind. * @param [in] array Array of memory on the device. * @param [in] desc Texture channel format. * * @warning This API is deprecated. * */ template HIP_DEPRECATED(HIP_DEPRECATED_MSG) static inline hipError_t hipBindTextureToArray( const struct texture &tex, hipArray_const_t array, const struct hipChannelFormatDesc &desc) { return hipBindTextureToArray(&tex, array, &desc); } /** * @brief Binds a mipmapped array to a texture [Deprecated] * * @ingroup TextureD * * @param [in] tex Texture to bind. * @param [in] mipmappedArray Mipmapped Array of memory on the device. * * @warning This API is deprecated. * */ template HIP_DEPRECATED(HIP_DEPRECATED_MSG) static inline hipError_t hipBindTextureToMipmappedArray( const struct texture &tex, hipMipmappedArray_const_t mipmappedArray) { struct hipChannelFormatDesc desc; hipArray_t levelArray; hipError_t err = hipGetMipmappedArrayLevel(&levelArray, mipmappedArray, 0); if (err != hipSuccess) { return err; } err = hipGetChannelDesc(&desc, levelArray); return (err == hipSuccess) ? hipBindTextureToMipmappedArray(&tex, mipmappedArray, &desc) : err; } /** * @brief Binds a mipmapped array to a texture [Deprecated] * * @ingroup TextureD * * @param [in] tex Texture to bind. * @param [in] mipmappedArray Mipmapped Array of memory on the device. * @param [in] desc Texture channel format. * * @warning This API is deprecated. * */ template HIP_DEPRECATED(HIP_DEPRECATED_MSG) static inline hipError_t hipBindTextureToMipmappedArray( const struct texture &tex, hipMipmappedArray_const_t mipmappedArray, const struct hipChannelFormatDesc &desc) { return hipBindTextureToMipmappedArray(&tex, mipmappedArray, &desc); } /** * @brief Unbinds a texture [Depreacated] * * @ingroup TextureD * * @param [in] tex Texture to unbind. * * @warning This API is deprecated. * */ template HIP_DEPRECATED(HIP_DEPRECATED_MSG) static inline hipError_t hipUnbindTexture( const struct texture &tex) { return hipUnbindTexture(&tex); } /** *------------------------------------------------------------------------------------------------- *------------------------------------------------------------------------------------------------- * @ingroup StreamO * @{ * * This section describes wrappers for stream Ordered allocation from memory pool functions of * HIP runtime API. * * @note APIs in this section are implemented on Linux, under development on Windows. * */ /** * @brief C++ wrappers for allocations from a memory pool * * This is an alternate C++ calls for @p hipMallocFromPoolAsync made available through * function overloading. * * @see hipMallocFromPoolAsync * * @note This API is implemented on Linux and is under development on Microsoft Windows. */ static inline hipError_t hipMallocAsync( void** dev_ptr, size_t size, hipMemPool_t mem_pool, hipStream_t stream) { return hipMallocFromPoolAsync(dev_ptr, size, mem_pool, stream); } /** * @brief C++ wrappers for allocations from a memory pool on the stream * * This is an alternate C++ calls for @p hipMallocFromPoolAsync made available through * function overloading. * * @see hipMallocFromPoolAsync * * @note This API is implemented on Linux and is under development on Microsoft Windows. */ template static inline hipError_t hipMallocAsync( T** dev_ptr, size_t size, hipMemPool_t mem_pool, hipStream_t stream) { return hipMallocFromPoolAsync(reinterpret_cast(dev_ptr), size, mem_pool, stream); } /** * @brief C++ wrappers for allocations from a memory pool * * This is an alternate C++ calls for @p hipMallocFromPoolAsync made available through * function overloading. * * @see hipMallocFromPoolAsync * * @note This API is implemented on Linux and is under development on Microsoft Windows. */ template static inline hipError_t hipMallocAsync( T** dev_ptr, size_t size, hipStream_t stream) { return hipMallocAsync(reinterpret_cast(dev_ptr), size, stream); } /** * @brief C++ wrappers for allocations from a memory pool * * This is an alternate C++ calls for @p hipMallocFromPoolAsync made available through * function overloading. * * @see hipMallocFromPoolAsync * * @note This API is implemented on Linux and is under development on Microsoft Windows. */ template static inline hipError_t hipMallocFromPoolAsync( T** dev_ptr, size_t size, hipMemPool_t mem_pool, hipStream_t stream) { return hipMallocFromPoolAsync(reinterpret_cast(dev_ptr), size, mem_pool, stream); } /** * @} */ #endif // __cplusplus #ifdef __GNUC__ #pragma GCC visibility pop #endif #elif !defined(__HIP_PLATFORM_AMD__) && defined(__HIP_PLATFORM_NVIDIA__) #include "hip/nvidia_detail/nvidia_hip_runtime_api.h" #else #error("Must define exactly one of __HIP_PLATFORM_AMD__ or __HIP_PLATFORM_NVIDIA__"); #endif /** * @brief: C++ wrapper for hipMalloc * @ingroup Memory * Perform automatic type conversion to eliminate the need for excessive typecasting (ie void**) * * __HIP_DISABLE_CPP_FUNCTIONS__ macro can be defined to suppress these * wrappers. It is useful for applications which need to obtain decltypes of * HIP runtime APIs. * * @see hipMalloc */ #if defined(__cplusplus) && !defined(__HIP_DISABLE_CPP_FUNCTIONS__) template static inline hipError_t hipMalloc(T** devPtr, size_t size) { return hipMalloc((void**)devPtr, size); } /** * @brief: C++ wrapper for hipMallocPitch * @ingroup Memory * Perform automatic type conversion to eliminate the need for excessive typecasting (ie void**) * * __HIP_DISABLE_CPP_FUNCTIONS__ macro can be defined to suppress these * wrappers. It is useful for applications which need to obtain decltypes of * HIP runtime APIs. * * @see hipMallocPitch */ template static inline hipError_t hipMallocPitch(T** devPtr, size_t* pitch, size_t width, size_t height) { return hipMallocPitch((void**)devPtr, pitch, width, height); } /** * @brief: C++ wrapper for hipHostMalloc * @ingroup Memory * Provide an override to automatically typecast the pointer type from void**, and also provide a * default for the flags. * * __HIP_DISABLE_CPP_FUNCTIONS__ macro can be defined to suppress these * wrappers. It is useful for applications which need to obtain decltypes of * HIP runtime APIs. * * @see hipHostMalloc */ template static inline hipError_t hipHostMalloc(T** ptr, size_t size, unsigned int flags = hipHostMallocDefault) { return hipHostMalloc((void**)ptr, size, flags); } /** * @brief: C++ wrapper for hipHostAlloc * @ingroup Memory * Provide an override to automatically typecast the pointer type from void**, and also provide a * default for the flags. * * __HIP_DISABLE_CPP_FUNCTIONS__ macro can be defined to suppress these * wrappers. It is useful for applications which need to obtain decltypes of * HIP runtime APIs. * * @see hipHostAlloc */ template static inline hipError_t hipHostAlloc(T** ptr, size_t size, unsigned int flags = hipHostAllocDefault) { return hipHostAlloc((void**)ptr, size, flags); } /** * @brief: C++ wrapper for hipMallocManaged * * @ingroup MemoryM * Provide an override to automatically typecast the pointer type from void**, and also provide a * default for the flags. * * __HIP_DISABLE_CPP_FUNCTIONS__ macro can be defined to suppress these * wrappers. It is useful for applications which need to obtain decltypes of * HIP runtime APIs. * * @see hipMallocManaged * */ template static inline hipError_t hipMallocManaged(T** devPtr, size_t size, unsigned int flags = hipMemAttachGlobal) { return hipMallocManaged((void**)devPtr, size, flags); } #endif #endif // doxygen end HIP API /** * @} */ #include #if USE_PROF_API #include #endif hip-rocm-6.4.3/include/hip/hip_texture_types.h000066400000000000000000000023251503277241100214060ustar00rootroot00000000000000/* Copyright (c) 2015 - 2021 Advanced Micro Devices, Inc. All rights reserved. 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 HIP_INCLUDE_HIP_HIP_TEXTURE_TYPES_H #define HIP_INCLUDE_HIP_HIP_TEXTURE_TYPES_H #include #endif hip-rocm-6.4.3/include/hip/hip_vector_types.h000066400000000000000000000031361503277241100212110ustar00rootroot00000000000000/* Copyright (c) 2015 - 2021 Advanced Micro Devices, Inc. All rights reserved. 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. */ //! hip_vector_types.h : Defines the HIP vector types. #ifndef HIP_INCLUDE_HIP_HIP_VECTOR_TYPES_H #define HIP_INCLUDE_HIP_HIP_VECTOR_TYPES_H #include #if defined(__HIP_PLATFORM_AMD__) && !defined(__HIP_PLATFORM_NVIDIA__) #if __cplusplus #include #endif #elif !defined(__HIP_PLATFORM_AMD__) && defined(__HIP_PLATFORM_NVIDIA__) #include #else #error("Must define exactly one of __HIP_PLATFORM_AMD__ or __HIP_PLATFORM_NVIDIA__"); #endif #endif hip-rocm-6.4.3/include/hip/hiprtc.h000066400000000000000000000476141503277241100171250ustar00rootroot00000000000000/* Copyright (c) 2015 - 2023 Advanced Micro Devices, Inc. All rights reserved. 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. */ #pragma once #include #include #if !defined(__HIP_PLATFORM_AMD__) && defined(__HIP_PLATFORM_NVIDIA__) #include #elif defined(__HIP_PLATFORM_AMD__) && !defined(__HIP_PLATFORM_NVIDIA__) #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ #include #if !defined(_WIN32) #pragma GCC visibility push(default) #endif /** * * @addtogroup GlobalDefs * @{ * */ /** * hiprtc error code */ typedef enum hiprtcResult { HIPRTC_SUCCESS = 0, ///< Success HIPRTC_ERROR_OUT_OF_MEMORY = 1, ///< Out of memory HIPRTC_ERROR_PROGRAM_CREATION_FAILURE = 2, ///< Failed to create program HIPRTC_ERROR_INVALID_INPUT = 3, ///< Invalid input HIPRTC_ERROR_INVALID_PROGRAM = 4, ///< Invalid program HIPRTC_ERROR_INVALID_OPTION = 5, ///< Invalid option HIPRTC_ERROR_COMPILATION = 6, ///< Compilation error HIPRTC_ERROR_BUILTIN_OPERATION_FAILURE = 7, ///< Failed in builtin operation HIPRTC_ERROR_NO_NAME_EXPRESSIONS_AFTER_COMPILATION = 8, ///< No name expression after compilation HIPRTC_ERROR_NO_LOWERED_NAMES_BEFORE_COMPILATION = 9, ///< No lowered names before compilation HIPRTC_ERROR_NAME_EXPRESSION_NOT_VALID = 10, ///< Invalid name expression HIPRTC_ERROR_INTERNAL_ERROR = 11, ///< Internal error HIPRTC_ERROR_LINKING = 100 ///< Error in linking } hiprtcResult; /** * hiprtc JIT option */ #define hiprtcJIT_option hipJitOption #define HIPRTC_JIT_MAX_REGISTERS hipJitOptionMaxRegisters ///< CUDA Only Maximum registers may be used in a ///< thread, passed to compiler #define HIPRTC_JIT_THREADS_PER_BLOCK hipJitOptionThreadsPerBlock ///< CUDA Only Number of thread per block #define HIPRTC_JIT_WALL_TIME hipJitOptionWallTime ///< CUDA Only Value for total wall clock time #define HIPRTC_JIT_INFO_LOG_BUFFER hipJitOptionInfoLogBuffer ///< CUDA Only Pointer to the buffer with ///< logged information #define HIPRTC_JIT_INFO_LOG_BUFFER_SIZE_BYTES hipJitOptionInfoLogBufferSizeBytes ///< CUDA Only Size of the buffer ///< in bytes for logged info #define HIPRTC_JIT_ERROR_LOG_BUFFER hipJitOptionErrorLogBuffer ///< CUDA Only Pointer to the buffer ///< with logged error(s) #define HIPRTC_JIT_ERROR_LOG_BUFFER_SIZE_BYTES hipJitOptionErrorLogBufferSizeBytes ///< CUDA Only Size of the buffer in ///< bytes for logged error(s) #define HIPRTC_JIT_OPTIMIZATION_LEVEL hipJitOptionOptimizationLevel ///< Value of optimization level for ///< generated codes, acceptable ///< options -O0, -O1, -O2, -O3 #define HIPRTC_JIT_TARGET_FROM_HIPCONTEXT hipJitOptionTargetFromContext ///< CUDA Only The target context, ///< which is the default #define HIPRTC_JIT_TARGET hipJitOptionTarget ///< CUDA Only JIT target #define HIPRTC_JIT_FALLBACK_STRATEGY hipJitOptionFallbackStrategy ///< CUDA Only Fallback strategy #define HIPRTC_JIT_GENERATE_DEBUG_INFO hipJitOptionGenerateDebugInfo ///< CUDA Only Generate debug information #define HIPRTC_JIT_LOG_VERBOSE hipJitOptionLogVerbose ///< CUDA Only Generate log verbose #define HIPRTC_JIT_GENERATE_LINE_INFO hipJitOptionGenerateLineInfo ///< CUDA Only Generate line number information #define HIPRTC_JIT_CACHE_MODE hipJitOptionCacheMode ///< CUDA Only Set cache mode #define HIPRTC_JIT_NEW_SM3X_OPT hipJitOptionSm3xOpt ///< @deprecated CUDA Only New SM3X option. #define HIPRTC_JIT_FAST_COMPILE hipJitOptionFastCompile ///< CUDA Only Set fast compile #define HIPRTC_JIT_GLOBAL_SYMBOL_NAMES hipJitOptionGlobalSymbolNames ///< CUDA Only Array of device symbol names to be ///< relocated to the host #define HIPRTC_JIT_GLOBAL_SYMBOL_ADDRESS hipJitOptionGlobalSymbolAddresses ///< CUDA Only Array of host addresses to be ///< relocated to the device #define HIPRTC_JIT_GLOBAL_SYMBOL_COUNT hipJitOptionGlobalSymbolCount ///< CUDA Only Number of symbol count. #define HIPRTC_JIT_LTO hipJitOptionLto ///< @deprecated CUDA Only Enable link-time ///< optimization for device code #define HIPRTC_JIT_FTZ hipJitOptionFtz ///< @deprecated CUDA Only Set ///< single-precision denormals. #define HIPRTC_JIT_PREC_DIV hipJitOptionPrecDiv ///< @deprecated CUDA Only Set ///< single-precision floating-point division ///< and reciprocals #define HIPRTC_JIT_PREC_SQRT hipJitOptionPrecSqrt ///< @deprecated CUDA Only Set ///< single-precision floating-point ///< square root #define HIPRTC_JIT_FMA hipJitOptionFma ///< @deprecated CUDA Only Enable ///< floating-point multiplies and ///< adds/subtracts operations #define HIPRTC_JIT_POSITION_INDEPENDENT_CODE hipJitOptionPositionIndependentCode ///< CUDA Only Generates ///< Position Independent code #define HIPRTC_JIT_MIN_CTA_PER_SM hipJitOptionMinCTAPerSM ///< CUDA Only Hints to JIT compiler ///< the minimum number of CTAs frin ///< kernel's grid to be mapped to SM #define HIPRTC_JIT_MAX_THREADS_PER_BLOCK hipJitOptionMaxThreadsPerBlock ///< CUDA only Maximum number of ///< threads in a thread block #define HIPRTC_JIT_OVERRIDE_DIRECT_VALUES hipJitOptionOverrideDirectiveValues ///< CUDA only Override Directive ///< Values #define HIPRTC_JIT_NUM_OPTIONS hipJitOptionNumOptions ///< Number of options #define HIPRTC_JIT_IR_TO_ISA_OPT_EXT hipJitOptionIRtoISAOptExt ///< HIP Only Linker options to be ///< passed on to compiler #define HIPRTC_JIT_IR_TO_ISA_OPT_COUNT_EXT hipJitOptionIRtoISAOptCountExt ///< HIP Only Count of linker options ///< to be passed on to /** * hiprtc JIT input type */ #define hiprtcJITInputType hipJitInputType #define HIPRTC_JIT_INPUT_CUBIN hipJitInputCubin ///< Cuda only Input Cubin #define HIPRTC_JIT_INPUT_PTX hipJitInputPtx ///< Cuda only Input PTX #define HIPRTC_JIT_INPUT_FATBINARY hipJitInputFatBinary ///< Cuda Only Input FAT Binary #define HIPRTC_JIT_INPUT_OBJECT hipJitInputObject ///< Cuda Only Host Object with embedded device code #define HIPRTC_JIT_INPUT_LIBRARY hipJitInputLibrary ///< Cuda Only Archive of Host Objects with embedded device code #define HIPRTC_JIT_INPUT_NVVM hipJitInputNvvm ///< @deprecated CUDA only High Level intermediate code for LTO #define HIPRTC_JIT_NUM_LEGACY_INPUT_TYPES hipJitNumLegacyInputTypes ///< Count of Legacy Input Types #define HIPRTC_JIT_INPUT_LLVM_BITCODE hipJitInputLLVMBitcode ///< HIP Only LLVM Bitcode or IR assembly #define HIPRTC_JIT_INPUT_LLVM_BUNDLED_BITCODE hipJitInputLLVMBundledBitcode ///< HIP Only LLVM Clang Bundled Code #define HIPRTC_JIT_INPUT_LLVM_ARCHIVES_OF_BUNDLED_BITCODE hipJitInputLLVMArchivesOfBundledBitcode ///< HIP Only LLVM ///< Archives of ///< Bundled Bitcode #define HIPRTC_JIT_INPUT_SPIRV hipJitInputSpirv ///< HIP Only SPIRV Code Object #define HIPRTC_JIT_NUM_INPUT_TYPES hipJitNumInputTypes ///< Count of Input Types /** * @} */ /** * hiprtc link state * */ typedef struct ihiprtcLinkState* hiprtcLinkState; /** * @ingroup Runtime * * @brief Returns text string message to explain the error which occurred * * @param [in] result code to convert to string. * @returns const char pointer to the NULL-terminated error string * * @warning In HIP, this function returns the name of the error, * if the hiprtc result is defined, it will return "Invalid HIPRTC error code" * * @see hiprtcResult */ const char* hiprtcGetErrorString(hiprtcResult result); /** * @ingroup Runtime * @brief Sets the parameters as major and minor version. * * @param [out] major HIP Runtime Compilation major version. * @param [out] minor HIP Runtime Compilation minor version. * * @returns #HIPRTC_ERROR_INVALID_INPUT, #HIPRTC_SUCCESS * */ hiprtcResult hiprtcVersion(int* major, int* minor); /** * hiprtc program * */ typedef struct _hiprtcProgram* hiprtcProgram; /** * @ingroup Runtime * @brief Adds the given name exprssion to the runtime compilation program. * * @param [in] prog runtime compilation program instance. * @param [in] name_expression const char pointer to the name expression. * @returns #HIPRTC_SUCCESS * * If const char pointer is NULL, it will return #HIPRTC_ERROR_INVALID_INPUT. * * @see hiprtcResult */ hiprtcResult hiprtcAddNameExpression(hiprtcProgram prog, const char* name_expression); /** * @ingroup Runtime * @brief Compiles the given runtime compilation program. * * @param [in] prog runtime compilation program instance. * @param [in] numOptions number of compiler options. * @param [in] options compiler options as const array of strins. * @returns #HIPRTC_SUCCESS * * If the compiler failed to build the runtime compilation program, * it will return #HIPRTC_ERROR_COMPILATION. * * @see hiprtcResult */ hiprtcResult hiprtcCompileProgram(hiprtcProgram prog, int numOptions, const char** options); /** * @ingroup Runtime * @brief Creates an instance of hiprtcProgram with the given input parameters, * and sets the output hiprtcProgram prog with it. * * @param [in, out] prog runtime compilation program instance. * @param [in] src const char pointer to the program source. * @param [in] name const char pointer to the program name. * @param [in] numHeaders number of headers. * @param [in] headers array of strings pointing to headers. * @param [in] includeNames array of strings pointing to names included in program source. * @returns #HIPRTC_SUCCESS * * Any invalide input parameter, it will return #HIPRTC_ERROR_INVALID_INPUT * or #HIPRTC_ERROR_INVALID_PROGRAM. * * If failed to create the program, it will return #HIPRTC_ERROR_PROGRAM_CREATION_FAILURE. * * @see hiprtcResult */ hiprtcResult hiprtcCreateProgram(hiprtcProgram* prog, const char* src, const char* name, int numHeaders, const char** headers, const char** includeNames); /** * @brief Destroys an instance of given hiprtcProgram. * @ingroup Runtime * @param [in] prog runtime compilation program instance. * @returns #HIPRTC_SUCCESS * * If prog is NULL, it will return #HIPRTC_ERROR_INVALID_INPUT. * * @see hiprtcResult */ hiprtcResult hiprtcDestroyProgram(hiprtcProgram* prog); /** * @brief Gets the lowered (mangled) name from an instance of hiprtcProgram with the given input parameters, * and sets the output lowered_name with it. * @ingroup Runtime * @param [in] prog runtime compilation program instance. * @param [in] name_expression const char pointer to the name expression. * @param [in, out] lowered_name const char array to the lowered (mangled) name. * @returns #HIPRTC_SUCCESS * * If any invalide nullptr input parameters, it will return #HIPRTC_ERROR_INVALID_INPUT * * If name_expression is not found, it will return #HIPRTC_ERROR_NAME_EXPRESSION_NOT_VALID * * If failed to get lowered_name from the program, it will return #HIPRTC_ERROR_COMPILATION. * * @see hiprtcResult */ hiprtcResult hiprtcGetLoweredName(hiprtcProgram prog, const char* name_expression, const char** lowered_name); /** * @brief Gets the log generated by the runtime compilation program instance. * @ingroup Runtime * @param [in] prog runtime compilation program instance. * @param [out] log memory pointer to the generated log. * @returns #HIPRTC_SUCCESS * * @see hiprtcResult */ hiprtcResult hiprtcGetProgramLog(hiprtcProgram prog, char* log); /** * @brief Gets the size of log generated by the runtime compilation program instance. * * @param [in] prog runtime compilation program instance. * @param [out] logSizeRet size of generated log. * @returns #HIPRTC_SUCCESS * * @see hiprtcResult */ hiprtcResult hiprtcGetProgramLogSize(hiprtcProgram prog, size_t* logSizeRet); /** * @brief Gets the pointer of compilation binary by the runtime compilation program instance. * @ingroup Runtime * @param [in] prog runtime compilation program instance. * @param [out] code char pointer to binary. * @returns #HIPRTC_SUCCESS * * @see hiprtcResult */ hiprtcResult hiprtcGetCode(hiprtcProgram prog, char* code); /** * @brief Gets the size of compilation binary by the runtime compilation program instance. * @ingroup Runtime * @param [in] prog runtime compilation program instance. * @param [out] codeSizeRet the size of binary. * @returns #HIPRTC_SUCCESS * * @see hiprtcResult */ hiprtcResult hiprtcGetCodeSize(hiprtcProgram prog, size_t* codeSizeRet); /** * @brief Gets the pointer of compiled bitcode by the runtime compilation program instance. * * @param [in] prog runtime compilation program instance. * @param [out] bitcode char pointer to bitcode. * @return HIPRTC_SUCCESS * * @see hiprtcResult */ hiprtcResult hiprtcGetBitcode(hiprtcProgram prog, char* bitcode); /** * @brief Gets the size of compiled bitcode by the runtime compilation program instance. * @ingroup Runtime * * @param [in] prog runtime compilation program instance. * @param [out] bitcode_size the size of bitcode. * @returns #HIPRTC_SUCCESS * * @see hiprtcResult */ hiprtcResult hiprtcGetBitcodeSize(hiprtcProgram prog, size_t* bitcode_size); /** * @brief Creates the link instance via hiprtc APIs. * @ingroup Runtime * @param [in] num_options Number of options * @param [in] option_ptr Array of options * @param [in] option_vals_pptr Array of option values cast to void* * @param [out] hip_link_state_ptr hiprtc link state created upon success * * @returns #HIPRTC_SUCCESS, #HIPRTC_ERROR_INVALID_INPUT, #HIPRTC_ERROR_INVALID_OPTION * * @see hiprtcResult */ hiprtcResult hiprtcLinkCreate(unsigned int num_options, hiprtcJIT_option* option_ptr, void** option_vals_pptr, hiprtcLinkState* hip_link_state_ptr); /** * @brief Adds a file with bit code to be linked with options * @ingroup Runtime * @param [in] hip_link_state hiprtc link state * @param [in] input_type Type of the input data or bitcode * @param [in] file_path Path to the input file where bitcode is present * @param [in] num_options Size of the options * @param [in] options_ptr Array of options applied to this input * @param [in] option_values Array of option values cast to void* * * @returns #HIPRTC_SUCCESS * * If input values are invalid, it will * @return #HIPRTC_ERROR_INVALID_INPUT * * @see hiprtcResult */ hiprtcResult hiprtcLinkAddFile(hiprtcLinkState hip_link_state, hiprtcJITInputType input_type, const char* file_path, unsigned int num_options, hiprtcJIT_option* options_ptr, void** option_values); /** * @brief Completes the linking of the given program. * @ingroup Runtime * @param [in] hip_link_state hiprtc link state * @param [in] input_type Type of the input data or bitcode * @param [in] image Input data which is null terminated * @param [in] image_size Size of the input data * @param [in] name Optional name for this input * @param [in] num_options Size of the options * @param [in] options_ptr Array of options applied to this input * @param [in] option_values Array of option values cast to void* * * @returns #HIPRTC_SUCCESS, #HIPRTC_ERROR_INVALID_INPUT * * If adding the file fails, it will * @return #HIPRTC_ERROR_PROGRAM_CREATION_FAILURE * * @see hiprtcResult */ hiprtcResult hiprtcLinkAddData(hiprtcLinkState hip_link_state, hiprtcJITInputType input_type, void* image, size_t image_size, const char* name, unsigned int num_options, hiprtcJIT_option* options_ptr, void** option_values); /** * @brief Completes the linking of the given program. * @ingroup Runtime * @param [in] hip_link_state hiprtc link state * @param [out] bin_out Upon success, points to the output binary * @param [out] size_out Size of the binary is stored (optional) * * @returns #HIPRTC_SUCCESS * * If adding the data fails, it will * @return #HIPRTC_ERROR_LINKING * * @see hiprtcResult */ hiprtcResult hiprtcLinkComplete(hiprtcLinkState hip_link_state, void** bin_out, size_t* size_out); /** * @brief Deletes the link instance via hiprtc APIs. * @ingroup Runtime * @param [in] hip_link_state link state instance * * @returns #HIPRTC_SUCCESS * * @see hiprtcResult */ hiprtcResult hiprtcLinkDestroy(hiprtcLinkState hip_link_state); #if !defined(_WIN32) #pragma GCC visibility pop #endif #ifdef __cplusplus } #endif /* __cplusplus */ #else #error("Must define exactly one of __HIP_PLATFORM_AMD__ or __HIP_PLATFORM_NVIDIA__"); #endif hip-rocm-6.4.3/include/hip/library_types.h000066400000000000000000000045561503277241100205220ustar00rootroot00000000000000/* Copyright (c) 2015 - 2023 Advanced Micro Devices, Inc. All rights reserved. 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 HIP_INCLUDE_HIP_LIBRARY_TYPES_H #define HIP_INCLUDE_HIP_LIBRARY_TYPES_H #if !defined(__HIPCC_RTC__) #include #endif #if defined(__HIP_PLATFORM_AMD__) && !defined(__HIP_PLATFORM_NVIDIA__) typedef enum hipDataType { HIP_R_32F = 0, HIP_R_64F = 1, HIP_R_16F = 2, HIP_R_8I = 3, HIP_C_32F = 4, HIP_C_64F = 5, HIP_C_16F = 6, HIP_C_8I = 7, HIP_R_8U = 8, HIP_C_8U = 9, HIP_R_32I = 10, HIP_C_32I = 11, HIP_R_32U = 12, HIP_C_32U = 13, HIP_R_16BF = 14, HIP_C_16BF = 15, HIP_R_4I = 16, HIP_C_4I = 17, HIP_R_4U = 18, HIP_C_4U = 19, HIP_R_16I = 20, HIP_C_16I = 21, HIP_R_16U = 22, HIP_C_16U = 23, HIP_R_64I = 24, HIP_C_64I = 25, HIP_R_64U = 26, HIP_C_64U = 27, HIP_R_8F_E4M3 = 28, HIP_R_8F_E5M2 = 29, // HIP specific Data Types HIP_R_8F_E4M3_FNUZ = 1000, HIP_R_8F_E5M2_FNUZ = 1001 } hipDataType; typedef enum hipLibraryPropertyType { HIP_LIBRARY_MAJOR_VERSION, HIP_LIBRARY_MINOR_VERSION, HIP_LIBRARY_PATCH_LEVEL } hipLibraryPropertyType; #elif !defined(__HIP_PLATFORM_AMD__) && defined(__HIP_PLATFORM_NVIDIA__) #include "library_types.h" #else #error("Must define exactly one of __HIP_PLATFORM_AMD__ or __HIP_PLATFORM_NVIDIA__"); #endif #endif hip-rocm-6.4.3/include/hip/linker_types.h000077500000000000000000000154501503277241100203400ustar00rootroot00000000000000 /* Copyright (c) 2015 - 2023 Advanced Micro Devices, Inc. All rights reserved. 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 HIP_INCLUDE_HIP_LINKER_TYPES_H #define HIP_INCLUDE_HIP_LINKER_TYPES_H #if defined(__clang__) #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wreserved-identifier" #pragma clang diagnostic ignored "-Wreserved-macro-identifier" #endif #if !defined(__HIP_PLATFORM_AMD__) && defined(__HIP_PLATFORM_NVIDIA__) #elif defined(__HIP_PLATFORM_AMD__) && !defined(__HIP_PLATFORM_NVIDIA__) /** * @defgroup LinkerTypes Jit Linker Data Types * @{ * This section describes the Jit Linker data types. * */ /** * hipJitOption */ typedef enum hipJitOption { hipJitOptionMaxRegisters = 0, ///< CUDA Only Maximum registers may be used in a thread, ///< passed to compiler hipJitOptionThreadsPerBlock, ///< CUDA Only Number of thread per block hipJitOptionWallTime, ///< CUDA Only Value for total wall clock time hipJitOptionInfoLogBuffer, ///< CUDA Only Pointer to the buffer with logged information hipJitOptionInfoLogBufferSizeBytes, ///< CUDA Only Size of the buffer in bytes for logged info hipJitOptionErrorLogBuffer, ///< CUDA Only Pointer to the buffer with logged error(s) hipJitOptionErrorLogBufferSizeBytes, ///< CUDA Only Size of the buffer in bytes for logged error(s) hipJitOptionOptimizationLevel, ///< Value of optimization level for generated codes, acceptable options ///< -O0, -O1, -O2, -O3 hipJitOptionTargetFromContext, ///< CUDA Only The target context, which is the default hipJitOptionTarget, ///< CUDA Only JIT target hipJitOptionFallbackStrategy, ///< CUDA Only Fallback strategy hipJitOptionGenerateDebugInfo, ///< CUDA Only Generate debug information hipJitOptionLogVerbose, ///< CUDA Only Generate log verbose hipJitOptionGenerateLineInfo, ///< CUDA Only Generate line number information hipJitOptionCacheMode, ///< CUDA Only Set cache mode hipJitOptionSm3xOpt, ///< @deprecated CUDA Only New SM3X option. hipJitOptionFastCompile, ///< CUDA Only Set fast compile hipJitOptionGlobalSymbolNames, ///< CUDA Only Array of device symbol names to be relocated to the host hipJitOptionGlobalSymbolAddresses, ///< CUDA Only Array of host addresses to be relocated to the device hipJitOptionGlobalSymbolCount, ///< CUDA Only Number of symbol count. hipJitOptionLto, ///< @deprecated CUDA Only Enable link-time optimization for device code hipJitOptionFtz, ///< @deprecated CUDA Only Set single-precision denormals. hipJitOptionPrecDiv, ///< @deprecated CUDA Only Set single-precision floating-point division ///< and reciprocals hipJitOptionPrecSqrt, ///< @deprecated CUDA Only Set single-precision floating-point square root hipJitOptionFma, ///< @deprecated CUDA Only Enable floating-point multiplies and ///< adds/subtracts operations hipJitOptionPositionIndependentCode, ///< CUDA Only Generates Position Independent code hipJitOptionMinCTAPerSM, ///< CUDA Only Hints to JIT compiler the minimum number of CTAs frin kernel's ///< grid to be mapped to SM hipJitOptionMaxThreadsPerBlock, ///< CUDA only Maximum number of threads in a thread block hipJitOptionOverrideDirectiveValues, ///< Cuda only Override Directive values hipJitOptionNumOptions, ///< Number of options hipJitOptionIRtoISAOptExt = 10000, ///< Hip Only Linker options to be passed on to compiler hipJitOptionIRtoISAOptCountExt, ///< Hip Only Count of linker options to be passed on to compiler } hipJitOption; /** * hipJitInputType */ typedef enum hipJitInputType { hipJitInputCubin = 0, ///< Cuda only Input cubin hipJitInputPtx, ///< Cuda only Input PTX hipJitInputFatBinary, ///< Cuda Only Input FAT Binary hipJitInputObject, ///< Cuda Only Host Object with embedded device code hipJitInputLibrary, ///< Cuda Only Archive of Host Objects with embedded ///< device code hipJitInputNvvm, ///< @deprecated Cuda only High Level intermediate ///< code for LTO hipJitNumLegacyInputTypes, ///< Count of Legacy Input Types hipJitInputLLVMBitcode = 100, ///< HIP Only LLVM Bitcode or IR assembly hipJitInputLLVMBundledBitcode = 101, ///< HIP Only LLVM Clang Bundled Code hipJitInputLLVMArchivesOfBundledBitcode = 102, ///< HIP Only LLVM Archive of Bundled Bitcode hipJitInputSpirv = 103, ///< HIP Only SPIRV Code Object hipJitNumInputTypes = 10 ///< Count of Input Types } hipJitInputType; /** * hipJitCacheMode */ typedef enum hipJitCacheMode { hipJitCacheOptionNone = 0, hipJitCacheOptionCG, hipJitCacheOptionCA } hipJitCacheMode; /** * hipJitFallback */ typedef enum hipJitFallback { hipJitPreferPTX = 0, hipJitPreferBinary, } hipJitFallback; // doxygen end LinkerTypes /** * @} */ #else #error("Must define exactly one of __HIP_PLATFORM_AMD__ or __HIP_PLATFORM_NVIDIA__"); #endif #endif // HIP_INCLUDE_HIP_LINKER_TYPES_Hhip-rocm-6.4.3/include/hip/math_functions.h000066400000000000000000000034271503277241100206470ustar00rootroot00000000000000/* Copyright (c) 2015 - 2023 Advanced Micro Devices, Inc. All rights reserved. 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 HIP_INCLUDE_HIP_MATH_FUNCTIONS_H #define HIP_INCLUDE_HIP_MATH_FUNCTIONS_H // Some standard header files, these are included by hc.hpp and so want to make them avail on both // paths to provide a consistent include env and avoid "missing symbol" errors that only appears // on NVCC path: #if !defined(__HIPCC_RTC__) #include #endif #if defined(__HIP_PLATFORM_AMD__) && !defined(__HIP_PLATFORM_NVIDIA__) #include #elif !defined(__HIP_PLATFORM_AMD__) && defined(__HIP_PLATFORM_NVIDIA__) //#include #else #error("Must define exactly one of __HIP_PLATFORM_AMD__ or __HIP_PLATFORM_NVIDIA__"); #endif #endif hip-rocm-6.4.3/include/hip/surface_types.h000066400000000000000000000036471503277241100205060ustar00rootroot00000000000000/* Copyright (c) 2022 - 2023 Advanced Micro Devices, Inc. All rights reserved. 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. */ /** * @file surface_types.h * @brief Defines surface types for HIP runtime. */ #ifndef HIP_INCLUDE_HIP_SURFACE_TYPES_H #define HIP_INCLUDE_HIP_SURFACE_TYPES_H #if defined(__clang__) #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wreserved-identifier" #endif #if !defined(__HIPCC_RTC__) #include #endif /** * An opaque value that represents a hip surface object */ struct __hip_surface; typedef struct __hip_surface* hipSurfaceObject_t; /** * hip surface reference */ struct surfaceReference { hipSurfaceObject_t surfaceObject; }; /** * hip surface boundary modes */ enum hipSurfaceBoundaryMode { hipBoundaryModeZero = 0, hipBoundaryModeTrap = 1, hipBoundaryModeClamp = 2 }; #if defined(__clang__) #pragma clang diagnostic pop #endif #endif /* !HIP_INCLUDE_HIP_SURFACE_TYPES_H */ hip-rocm-6.4.3/include/hip/texture_types.h000066400000000000000000000150371503277241100205520ustar00rootroot00000000000000/* Copyright (c) 2015 - 2023 Advanced Micro Devices, Inc. All rights reserved. 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 HIP_INCLUDE_HIP_TEXTURE_TYPES_H #define HIP_INCLUDE_HIP_TEXTURE_TYPES_H #if defined(__clang__) #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wreserved-identifier" #pragma clang diagnostic ignored "-Wreserved-macro-identifier" #pragma clang diagnostic ignored "-Wc++98-compat" #endif #if !defined(__HIPCC_RTC__) #include #endif #if !defined(__HIP_PLATFORM_AMD__) && defined(__HIP_PLATFORM_NVIDIA__) #include "texture_types.h" #elif defined(__HIP_PLATFORM_AMD__) && !defined(__HIP_PLATFORM_NVIDIA__) /******************************************************************************* * * * * * * *******************************************************************************/ #if !defined(__HIPCC_RTC__) #include #include #include #endif // !defined(__HIPCC_RTC__) #define hipTextureType1D 0x01 #define hipTextureType2D 0x02 #define hipTextureType3D 0x03 #define hipTextureTypeCubemap 0x0C #define hipTextureType1DLayered 0xF1 #define hipTextureType2DLayered 0xF2 #define hipTextureTypeCubemapLayered 0xFC /** * Should be same as HSA_IMAGE_OBJECT_SIZE_DWORD/HSA_SAMPLER_OBJECT_SIZE_DWORD */ #define HIP_IMAGE_OBJECT_SIZE_DWORD 12 #define HIP_SAMPLER_OBJECT_SIZE_DWORD 8 #define HIP_SAMPLER_OBJECT_OFFSET_DWORD HIP_IMAGE_OBJECT_SIZE_DWORD #define HIP_TEXTURE_OBJECT_SIZE_DWORD (HIP_IMAGE_OBJECT_SIZE_DWORD + HIP_SAMPLER_OBJECT_SIZE_DWORD) /** * An opaque value that represents a hip texture object */ struct __hip_texture; typedef struct __hip_texture* hipTextureObject_t; /** * hip texture address modes */ enum hipTextureAddressMode { hipAddressModeWrap = 0, hipAddressModeClamp = 1, hipAddressModeMirror = 2, hipAddressModeBorder = 3 }; /** * hip texture filter modes */ enum hipTextureFilterMode { hipFilterModePoint = 0, hipFilterModeLinear = 1 }; /** * hip texture read modes */ enum hipTextureReadMode { hipReadModeElementType = 0, hipReadModeNormalizedFloat = 1 }; /** * hip texture reference */ typedef struct textureReference { int normalized; enum hipTextureReadMode readMode;// used only for driver API's enum hipTextureFilterMode filterMode; enum hipTextureAddressMode addressMode[3]; // Texture address mode for up to 3 dimensions struct hipChannelFormatDesc channelDesc; int sRGB; // Perform sRGB->linear conversion during texture read unsigned int maxAnisotropy; // Limit to the anisotropy ratio enum hipTextureFilterMode mipmapFilterMode; float mipmapLevelBias; float minMipmapLevelClamp; float maxMipmapLevelClamp; hipTextureObject_t textureObject; int numChannels; enum hipArray_Format format; }textureReference; /** * hip texture descriptor */ typedef struct hipTextureDesc { enum hipTextureAddressMode addressMode[3]; // Texture address mode for up to 3 dimensions enum hipTextureFilterMode filterMode; enum hipTextureReadMode readMode; int sRGB; // Perform sRGB->linear conversion during texture read float borderColor[4]; int normalizedCoords; unsigned int maxAnisotropy; enum hipTextureFilterMode mipmapFilterMode; float mipmapLevelBias; float minMipmapLevelClamp; float maxMipmapLevelClamp; }hipTextureDesc; #if __cplusplus /******************************************************************************* * * * * * * *******************************************************************************/ #if __HIP__ #define __HIP_TEXTURE_ATTRIB __attribute__((device_builtin_texture_type)) #else #define __HIP_TEXTURE_ATTRIB #endif typedef textureReference* hipTexRef; template struct __HIP_TEXTURE_ATTRIB texture : public textureReference { texture(int norm = 0, enum hipTextureFilterMode fMode = hipFilterModePoint, enum hipTextureAddressMode aMode = hipAddressModeClamp) { normalized = norm; readMode = mode; filterMode = fMode; addressMode[0] = aMode; addressMode[1] = aMode; addressMode[2] = aMode; channelDesc = hipCreateChannelDesc(); sRGB = 0; textureObject = nullptr; maxAnisotropy = 0; mipmapLevelBias = 0; minMipmapLevelClamp = 0; maxMipmapLevelClamp = 0; } texture(int norm, enum hipTextureFilterMode fMode, enum hipTextureAddressMode aMode, struct hipChannelFormatDesc desc) { normalized = norm; readMode = mode; filterMode = fMode; addressMode[0] = aMode; addressMode[1] = aMode; addressMode[2] = aMode; channelDesc = desc; sRGB = 0; textureObject = nullptr; maxAnisotropy = 0; mipmapLevelBias = 0; minMipmapLevelClamp = 0; maxMipmapLevelClamp = 0; } }; #endif /* __cplusplus */ #else #error("Must define exactly one of __HIP_PLATFORM_AMD__ or __HIP_PLATFORM_NVIDIA__"); #endif #if defined(__clang__) #pragma clang diagnostic pop #endif #endif hip-rocm-6.4.3/install.sh000077500000000000000000000022701503277241100152520ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 2017 - 2021 Advanced Micro Devices, Inc. All Rights Reserved. # # 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. echo "install.sh has moved to HIP-AMD backend repo" exit 1 hip-rocm-6.4.3/util/000077500000000000000000000000001503277241100142215ustar00rootroot00000000000000hip-rocm-6.4.3/util/gedit/000077500000000000000000000000001503277241100153155ustar00rootroot00000000000000hip-rocm-6.4.3/util/gedit/README.md000066400000000000000000000002621503277241100165740ustar00rootroot00000000000000### How to Install? There are two ways to install the configuration file 1. Run the installer 2. Copy ```hip.lang``` file to ```/usr/share/gtksourceview-3.0/language-specs``` hip-rocm-6.4.3/util/gedit/hip.lang000066400000000000000000000276671503277241100167620ustar00rootroot00000000000000 *.cpp;*.c;*.cu // /* */