diff --git a/.circleci/config.yml b/.circleci/config.yml index 9c4980d7..85e85676 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -54,7 +54,7 @@ binary_common: &binary_common wheel_docker_image: description: "Wheel only: what docker image to use" type: string - default: "pytorch/manylinux-cuda101" + default: "pytorch/manylinux-cuda111" environment: PYTHON_VERSION: << parameters.python_version >> PYTORCH_VERSION: << parameters.pytorch_version >> @@ -62,103 +62,15 @@ binary_common: &binary_common CU_VERSION: << parameters.cu_version >> jobs: - - binary_linux_wheel: - <<: *binary_common - docker: - - image: << parameters.wheel_docker_image >> - resource_class: 2xlarge+ - steps: - - checkout_merge - - run: packaging/build_wheel.sh - - store_artifacts: - path: dist - - persist_to_workspace: - root: dist - paths: - - "*" - - binary_linux_conda: - <<: *binary_common - docker: - - image: "pytorch/conda-cuda" - resource_class: 2xlarge+ - steps: - - checkout_merge - - run: packaging/build_conda.sh - - store_artifacts: - path: /opt/conda/conda-bld/linux-64 - - persist_to_workspace: - root: /opt/conda/conda-bld/linux-64 - paths: - - "*" - - store_test_results: - path: build_results/ - - binary_macos_wheel: - <<: *binary_common - macos: - xcode: "9.4.1" - steps: - - checkout_merge - - run: - # Cannot easily deduplicate this as source'ing activate - # will set environment variables which we need to propagate - # to build_wheel.sh - command: | - curl -o conda.sh https://repo.anaconda.com/miniconda/Miniconda3-latest-MacOSX-x86_64.sh - sh conda.sh -b - source $HOME/miniconda3/bin/activate - packaging/build_wheel.sh - - store_artifacts: - path: dist - - persist_to_workspace: - root: dist - paths: - - "*" - - binary_macos_conda: - <<: *binary_common - macos: - xcode: "9.4.1" - steps: - - checkout_merge - - run: - command: | - curl -o conda.sh https://repo.anaconda.com/miniconda/Miniconda3-latest-MacOSX-x86_64.sh - sh conda.sh -b - source $HOME/miniconda3/bin/activate - conda install -yq conda-build - packaging/build_conda.sh - - store_artifacts: - path: /Users/distiller/miniconda3/conda-bld/osx-64 - - persist_to_workspace: - root: /Users/distiller/miniconda3/conda-bld/osx-64 - paths: - - "*" - - store_test_results: - path: build_results/ - - # Requires org-member context - binary_conda_upload: - docker: - - image: continuumio/miniconda - steps: - - attach_workspace: - at: ~/workspace - - designate_upload_channel - - run: - command: | - # Prevent credential from leaking - conda install -yq anaconda-client - set -x - anaconda -t "${CONDA_PYTORCHBOT_TOKEN}" upload ~/workspace/*.tar.bz2 -u "pytorch-${UPLOAD_CHANNEL}" --label main --no-progress --force # Requires org-member context binary_wheel_upload: parameters: subfolder: description: "What whl subfolder to upload to, e.g., blank or cu100/ (trailing slash is important)" type: string + python_version: + description: "Dummy param to make circleci configuration happy for matrix" + type: string docker: - image: circleci/python:3.7 steps: @@ -175,39 +87,49 @@ jobs: export AWS_ACCESS_KEY_ID="${PYTORCH_BINARY_AWS_ACCESS_KEY_ID}" export AWS_SECRET_ACCESS_KEY="${PYTORCH_BINARY_AWS_SECRET_ACCESS_KEY}" set -x + ls ~/workspace for pkg in ~/workspace/*.whl; do - aws s3 cp "$pkg" "s3://pytorch/whl/${UPLOAD_CHANNEL}/<< parameters.subfolder >>" --acl public-read + aws s3 cp "$pkg" "s3://pytorch/nestedtensor/whl/${UPLOAD_CHANNEL}/<< parameters.subfolder >>/py<< parameters.python_version >>/" --acl public-read done unittest_linux_cpu: <<: *binary_common - docker: - - image: "pytorch/manylinux-cuda102" - resource_class: 2xlarge+ + machine: + image: "ubuntu-1604:202007-01" + resource_class: xlarge steps: - checkout - - run: - name: Generate cache key - # This will refresh cache on Sundays, nightly build should generate new cache. - command: echo "$(date +"%Y-%U")" > .circleci-weekly - - restore_cache: - - keys: - - env-v2-linux-{{ arch }}-py<< parameters.python_version >>-{{ checksum ".circleci/unittest/linux/scripts/environment.yml" }}-{{ checksum ".circleci-weekly" }} - - run: name: Setup - command: .circleci/unittest/linux/scripts/setup_env.sh - - save_cache: - - key: env-v2-linux-{{ arch }}-py<< parameters.python_version >>-{{ checksum ".circleci/unittest/linux/scripts/environment.yml" }}-{{ checksum ".circleci-weekly" }} - - paths: - - conda - - env + command: | + touch ${BASH_ENV} + echo "export PARAMETERS_PYTHON_VERSION=<< parameters.python_version >>" >> ${BASH_ENV} + cat ${BASH_ENV} + # For some reason circleci isn't automatically sourcing this within the builds + source ${BASH_ENV} && .circleci/unittest/linux/scripts/setup_env.sh + - run: + # Done so that they have static versions + name: Specify nightly versions + command: | + if [[ "${CIRCLE_BRANCH}" = "nightly" ]]; then + echo "export BUILD_VERSION=0.1.1-<< parameters.cu_version >>" >> ${BASH_ENV} + echo "export PYTORCH_BUILD_VERSION=1.8.0-nestedtensor-0.1.1-<< parameters.cu_version >>" >> ${BASH_ENV} + echo "export PYTORCH_BUILD_NUMBER=1" >> ${BASH_ENV} + fi - run: name: Install nestedtensor - command: .circleci/unittest/linux/scripts/install.sh + command: | + touch ${BASH_ENV} + echo "export PARAMETERS_PYTHON_VERSION=<< parameters.python_version >>" >> ${BASH_ENV} + cat ${BASH_ENV} + # For some reason circleci isn't automatically sourcing this within the builds + source ${BASH_ENV} && .circleci/unittest/linux/scripts/install.sh + - persist_to_workspace: + root: wheels + paths: + - "*" + - store_artifacts: + path: wheels - run: name: Run tests command: .circleci/unittest/linux/scripts/run_test.sh @@ -220,1553 +142,73 @@ jobs: unittest_linux_gpu: <<: *binary_common machine: - image: ubuntu-1604-cuda-10.1:201909-23 - resource_class: gpu.small - environment: - image_name: "pytorch/manylinux-cuda101" + image: ubuntu-1604-cuda-11.1:202012-01 + resource_class: gpu.nvidia.medium steps: - checkout - - run: - name: Generate cache key - # This will refresh cache on Sundays, nightly build should generate new cache. - command: echo "$(date +"%Y-%U")" > .circleci-weekly - - restore_cache: - - keys: - - env-v2-linux-{{ arch }}-py<< parameters.python_version >>-{{ checksum ".circleci/unittest/linux/scripts/environment.yml" }}-{{ checksum ".circleci-weekly" }} - - run: name: Setup - command: docker run -t --gpus all -v $PWD:$PWD -w $PWD "${image_name}" .circleci/unittest/linux/scripts/setup_env.sh - - save_cache: - - key: env-v2-linux-{{ arch }}-py<< parameters.python_version >>-{{ checksum ".circleci/unittest/linux/scripts/environment.yml" }}-{{ checksum ".circleci-weekly" }} - - paths: - - conda - - env + command: | + touch ${BASH_ENV} + echo "export PARAMETERS_PYTHON_VERSION=<< parameters.python_version >>" >> ${BASH_ENV} + cat ${BASH_ENV} + # For some reason circleci isn't automatically sourcing this within the builds + source ${BASH_ENV} && .circleci/unittest/linux/scripts/setup_env.sh + - run: + # Done so that they have static versions + name: Specify nightly versions + command: | + if [[ "${CIRCLE_BRANCH}" = "nightly" ]]; then + echo "export BUILD_VERSION=0.1.1-<< parameters.cu_version >>" >> ${BASH_ENV} + echo "export PYTORCH_BUILD_VERSION=1.8.0-nestedtensor-0.1.1-<< parameters.cu_version >>" >> ${BASH_ENV} + echo "export PYTORCH_BUILD_NUMBER=1" >> ${BASH_ENV} + fi - run: name: Install nestedtensor - command: docker run -t --gpus all -v $PWD:$PWD -w $PWD "${image_name}" .circleci/unittest/linux/scripts/install.sh + command: | + touch ${BASH_ENV} + echo "export PARAMETERS_PYTHON_VERSION=<< parameters.python_version >>" >> ${BASH_ENV} + cat ${BASH_ENV} + # For some reason circleci isn't automatically sourcing this within the builds + source ${BASH_ENV} && .circleci/unittest/linux/scripts/install.sh + - persist_to_workspace: + root: wheels + paths: + - "*" + - store_artifacts: + path: wheels - run: name: Run tests - command: docker run -t --gpus all -v $PWD:$PWD -w $PWD "${image_name}" .circleci/unittest/linux/scripts/run_test.sh + command: .circleci/unittest/linux/scripts/run_test.sh - run: - name: Post Process - command: docker run -t --gpus all -v $PWD:$PWD -w $PWD "${image_name}" .circleci/unittest/linux/scripts/post_process.sh + name: Post process + command: .circleci/unittest/linux/scripts/post_process.sh - store_test_results: path: test-results workflows: - build: - jobs: -# - circleci_consistency - - binary_linux_wheel: - cu_version: cpu - name: binary_linux_wheel_py3.6_cpu - python_version: '3.6' - wheel_docker_image: pytorch/manylinux-cuda102 - - binary_linux_wheel: - cu_version: cu92 - name: binary_linux_wheel_py3.6_cu92 - python_version: '3.6' - wheel_docker_image: pytorch/manylinux-cuda92 - - binary_linux_wheel: - cu_version: cu101 - name: binary_linux_wheel_py3.6_cu101 - python_version: '3.6' - wheel_docker_image: pytorch/manylinux-cuda101 - - binary_linux_wheel: - cu_version: cu102 - name: binary_linux_wheel_py3.6_cu102 - python_version: '3.6' - wheel_docker_image: pytorch/manylinux-cuda102 - - binary_linux_wheel: - cu_version: cpu - name: binary_linux_wheel_py3.7_cpu - python_version: '3.7' - wheel_docker_image: pytorch/manylinux-cuda102 - - binary_linux_wheel: - cu_version: cu92 - name: binary_linux_wheel_py3.7_cu92 - python_version: '3.7' - wheel_docker_image: pytorch/manylinux-cuda92 - - binary_linux_wheel: - cu_version: cu101 - name: binary_linux_wheel_py3.7_cu101 - python_version: '3.7' - wheel_docker_image: pytorch/manylinux-cuda101 - - binary_linux_wheel: - cu_version: cu102 - name: binary_linux_wheel_py3.7_cu102 - python_version: '3.7' - wheel_docker_image: pytorch/manylinux-cuda102 - - binary_linux_wheel: - cu_version: cpu - name: binary_linux_wheel_py3.8_cpu - python_version: '3.8' - wheel_docker_image: pytorch/manylinux-cuda102 - - binary_linux_wheel: - cu_version: cu92 - name: binary_linux_wheel_py3.8_cu92 - python_version: '3.8' - wheel_docker_image: pytorch/manylinux-cuda92 - - binary_linux_wheel: - cu_version: cu101 - name: binary_linux_wheel_py3.8_cu101 - python_version: '3.8' - wheel_docker_image: pytorch/manylinux-cuda101 - - binary_linux_wheel: - cu_version: cu102 - name: binary_linux_wheel_py3.8_cu102 - python_version: '3.8' - wheel_docker_image: pytorch/manylinux-cuda102 - - binary_macos_wheel: - cu_version: cpu - name: binary_macos_wheel_py3.6_cpu - python_version: '3.6' - wheel_docker_image: pytorch/manylinux-cuda102 - - binary_macos_wheel: - cu_version: cpu - name: binary_macos_wheel_py3.7_cpu - python_version: '3.7' - wheel_docker_image: pytorch/manylinux-cuda102 - - binary_macos_wheel: - cu_version: cpu - name: binary_macos_wheel_py3.8_cpu - python_version: '3.8' - wheel_docker_image: pytorch/manylinux-cuda102 -# - binary_win_wheel: -# cu_version: cpu -# filters: -# branches: -# only: master -# tags: -# only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ -# name: binary_win_wheel_py3.6_cpu -# python_version: '3.6' -# - binary_win_wheel: -# cu_version: cu92 -# filters: -# branches: -# only: master -# tags: -# only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ -# name: binary_win_wheel_py3.6_cu92 -# python_version: '3.6' -# - binary_win_wheel: -# cu_version: cu101 -# filters: -# branches: -# only: master -# tags: -# only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ -# name: binary_win_wheel_py3.6_cu101 -# python_version: '3.6' -# - binary_win_wheel: -# cu_version: cu102 -# filters: -# branches: -# only: master -# tags: -# only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ -# name: binary_win_wheel_py3.6_cu102 -# python_version: '3.6' -# - binary_win_wheel: -# cu_version: cpu -# filters: -# branches: -# only: master -# tags: -# only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ -# name: binary_win_wheel_py3.7_cpu -# python_version: '3.7' -# - binary_win_wheel: -# cu_version: cu92 -# filters: -# branches: -# only: master -# tags: -# only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ -# name: binary_win_wheel_py3.7_cu92 -# python_version: '3.7' -# - binary_win_wheel: -# cu_version: cu101 -# filters: -# branches: -# only: master -# tags: -# only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ -# name: binary_win_wheel_py3.7_cu101 -# python_version: '3.7' -# - binary_win_wheel: -# cu_version: cu102 -# filters: -# branches: -# only: master -# tags: -# only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ -# name: binary_win_wheel_py3.7_cu102 -# python_version: '3.7' -# - binary_win_wheel: -# cu_version: cpu -# name: binary_win_wheel_py3.8_cpu -# python_version: '3.8' -# - binary_win_wheel: -# cu_version: cu92 -# filters: -# branches: -# only: master -# tags: -# only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ -# name: binary_win_wheel_py3.8_cu92 -# python_version: '3.8' -# - binary_win_wheel: -# cu_version: cu101 -# filters: -# branches: -# only: master -# tags: -# only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ -# name: binary_win_wheel_py3.8_cu101 -# python_version: '3.8' -# - binary_win_wheel: -# cu_version: cu102 -# name: binary_win_wheel_py3.8_cu102 -# python_version: '3.8' - - binary_linux_conda: - cu_version: cpu - name: binary_linux_conda_py3.6_cpu - python_version: '3.6' - wheel_docker_image: pytorch/manylinux-cuda102 - - binary_linux_conda: - cu_version: cu92 - name: binary_linux_conda_py3.6_cu92 - python_version: '3.6' - wheel_docker_image: pytorch/manylinux-cuda92 - - binary_linux_conda: - cu_version: cu101 - name: binary_linux_conda_py3.6_cu101 - python_version: '3.6' - wheel_docker_image: pytorch/manylinux-cuda101 - - binary_linux_conda: - cu_version: cu102 - name: binary_linux_conda_py3.6_cu102 - python_version: '3.6' - wheel_docker_image: pytorch/manylinux-cuda102 - - binary_linux_conda: - cu_version: cpu - name: binary_linux_conda_py3.7_cpu - python_version: '3.7' - wheel_docker_image: pytorch/manylinux-cuda102 - - binary_linux_conda: - cu_version: cu92 - name: binary_linux_conda_py3.7_cu92 - python_version: '3.7' - wheel_docker_image: pytorch/manylinux-cuda92 - - binary_linux_conda: - cu_version: cu101 - name: binary_linux_conda_py3.7_cu101 - python_version: '3.7' - wheel_docker_image: pytorch/manylinux-cuda101 - - binary_linux_conda: - cu_version: cu102 - name: binary_linux_conda_py3.7_cu102 - python_version: '3.7' - wheel_docker_image: pytorch/manylinux-cuda102 - - binary_linux_conda: - cu_version: cpu - name: binary_linux_conda_py3.8_cpu - python_version: '3.8' - wheel_docker_image: pytorch/manylinux-cuda102 - - binary_linux_conda: - cu_version: cu92 - name: binary_linux_conda_py3.8_cu92 - python_version: '3.8' - wheel_docker_image: pytorch/manylinux-cuda92 - - binary_linux_conda: - cu_version: cu101 - name: binary_linux_conda_py3.8_cu101 - python_version: '3.8' - wheel_docker_image: pytorch/manylinux-cuda101 - - binary_linux_conda: - cu_version: cu102 - name: binary_linux_conda_py3.8_cu102 - python_version: '3.8' - wheel_docker_image: pytorch/manylinux-cuda102 - - binary_macos_conda: - cu_version: cpu - name: binary_macos_conda_py3.6_cpu - python_version: '3.6' - wheel_docker_image: pytorch/manylinux-cuda102 - - binary_macos_conda: - cu_version: cpu - name: binary_macos_conda_py3.7_cpu - python_version: '3.7' - wheel_docker_image: pytorch/manylinux-cuda102 - - binary_macos_conda: - cu_version: cpu - name: binary_macos_conda_py3.8_cpu - python_version: '3.8' - wheel_docker_image: pytorch/manylinux-cuda102 -# - binary_win_conda: -# cu_version: cpu -# filters: -# branches: -# only: master -# tags: -# only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ -# name: binary_win_conda_py3.6_cpu -# python_version: '3.6' -# - binary_win_conda: -# cu_version: cu92 -# filters: -# branches: -# only: master -# tags: -# only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ -# name: binary_win_conda_py3.6_cu92 -# python_version: '3.6' -# - binary_win_conda: -# cu_version: cu101 -# filters: -# branches: -# only: master -# tags: -# only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ -# name: binary_win_conda_py3.6_cu101 -# python_version: '3.6' -# - binary_win_conda: -# cu_version: cu102 -# filters: -# branches: -# only: master -# tags: -# only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ -# name: binary_win_conda_py3.6_cu102 -# python_version: '3.6' -# - binary_win_conda: -# cu_version: cpu -# filters: -# branches: -# only: master -# tags: -# only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ -# name: binary_win_conda_py3.7_cpu -# python_version: '3.7' -# - binary_win_conda: -# cu_version: cu92 -# filters: -# branches: -# only: master -# tags: -# only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ -# name: binary_win_conda_py3.7_cu92 -# python_version: '3.7' -# - binary_win_conda: -# cu_version: cu101 -# filters: -# branches: -# only: master -# tags: -# only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ -# name: binary_win_conda_py3.7_cu101 -# python_version: '3.7' -# - binary_win_conda: -# cu_version: cu102 -# filters: -# branches: -# only: master -# tags: -# only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ -# name: binary_win_conda_py3.7_cu102 -# python_version: '3.7' -# - binary_win_conda: -# cu_version: cpu -# name: binary_win_conda_py3.8_cpu -# python_version: '3.8' -# - binary_win_conda: -# cu_version: cu92 -# filters: -# branches: -# only: master -# tags: -# only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ -# name: binary_win_conda_py3.8_cu92 -# python_version: '3.8' -# - binary_win_conda: -# cu_version: cu101 -# filters: -# branches: -# only: master -# tags: -# only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ -# name: binary_win_conda_py3.8_cu101 -# python_version: '3.8' -# - binary_win_conda: -# cu_version: cu102 -# name: binary_win_conda_py3.8_cu102 -# python_version: '3.8' -# - python_lint -# - python_type_check -# - clang_format - unittest: jobs: -# - unittest_linux_cpu: -# cu_version: cpu -# name: unittest_linux_cpu_py3.6 -# python_version: '3.6' -# - unittest_linux_cpu: -# cu_version: cpu -# name: unittest_linux_cpu_py3.7 -# python_version: '3.7' -# - unittest_linux_cpu: -# cu_version: cpu -# name: unittest_linux_cpu_py3.8 -# python_version: '3.8' + - unittest_linux_cpu: + name: unittest_linux_<< matrix.cu_version >>_py<< matrix.python_version >> + matrix: + parameters: + python_version: ["3.7", "3.8"] + cu_version: ["cpu"] - unittest_linux_gpu: - cu_version: cu101 - filters: - branches: - only: - - master - - nightly - name: unittest_linux_gpu_py3.6 - python_version: '3.6' - - unittest_linux_gpu: - cu_version: cu101 - filters: - branches: - only: - - master - - nightly - name: unittest_linux_gpu_py3.7 - python_version: '3.7' -# - unittest_linux_gpu: -# cu_version: cu101 -# name: unittest_linux_gpu_py3.8 -# python_version: '3.8' -# - unittest_windows_cpu: -# cu_version: cpu -# name: unittest_windows_cpu_py3.6 -# python_version: '3.6' -# - unittest_windows_cpu: -# cu_version: cpu -# name: unittest_windows_cpu_py3.7 -# python_version: '3.7' -# - unittest_windows_cpu: -# cu_version: cpu -# name: unittest_windows_cpu_py3.8 -# python_version: '3.8' -# - unittest_windows_gpu: -# cu_version: cu101 -# filters: -# branches: -# only: -# - master -# - nightly -# name: unittest_windows_gpu_py3.6 -# python_version: '3.6' -# - unittest_windows_gpu: -# cu_version: cu101 -# filters: -# branches: -# only: -# - master -# - nightly -# name: unittest_windows_gpu_py3.7 -# python_version: '3.7' -# - unittest_windows_gpu: -# cu_version: cu101 -# name: unittest_windows_gpu_py3.8 -# python_version: '3.8' - nightly: - jobs: -# - circleci_consistency -# - python_lint -# - python_type_check -# - clang_format - - binary_linux_wheel: - cu_version: cpu - filters: - branches: - only: nightly - tags: - only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ - name: nightly_binary_linux_wheel_py3.6_cpu - python_version: '3.6' - wheel_docker_image: pytorch/manylinux-cuda102 - - binary_wheel_upload: - context: org-member - filters: - branches: - only: nightly - tags: - only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ - name: nightly_binary_linux_wheel_py3.6_cpu_upload - requires: - - nightly_binary_linux_wheel_py3.6_cpu - subfolder: cpu/ - - binary_linux_wheel: - cu_version: cu92 - filters: - branches: - only: nightly - tags: - only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ - name: nightly_binary_linux_wheel_py3.6_cu92 - python_version: '3.6' - wheel_docker_image: pytorch/manylinux-cuda92 - - binary_wheel_upload: - context: org-member - filters: - branches: - only: nightly - tags: - only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ - name: nightly_binary_linux_wheel_py3.6_cu92_upload - requires: - - nightly_binary_linux_wheel_py3.6_cu92 - subfolder: cu92/ - - binary_linux_wheel: - cu_version: cu101 - filters: - branches: - only: nightly - tags: - only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ - name: nightly_binary_linux_wheel_py3.6_cu101 - python_version: '3.6' - wheel_docker_image: pytorch/manylinux-cuda101 - - binary_wheel_upload: - context: org-member - filters: - branches: - only: nightly - tags: - only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ - name: nightly_binary_linux_wheel_py3.6_cu101_upload - requires: - - nightly_binary_linux_wheel_py3.6_cu101 - subfolder: cu101/ - - binary_linux_wheel: - cu_version: cu102 - filters: - branches: - only: nightly - tags: - only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ - name: nightly_binary_linux_wheel_py3.6_cu102 - python_version: '3.6' - wheel_docker_image: pytorch/manylinux-cuda102 - - binary_wheel_upload: - context: org-member - filters: - branches: - only: nightly - tags: - only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ - name: nightly_binary_linux_wheel_py3.6_cu102_upload - requires: - - nightly_binary_linux_wheel_py3.6_cu102 - subfolder: cu102/ - - binary_linux_wheel: - cu_version: cpu - filters: - branches: - only: nightly - tags: - only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ - name: nightly_binary_linux_wheel_py3.7_cpu - python_version: '3.7' - wheel_docker_image: pytorch/manylinux-cuda102 - - binary_wheel_upload: - context: org-member - filters: - branches: - only: nightly - tags: - only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ - name: nightly_binary_linux_wheel_py3.7_cpu_upload - requires: - - nightly_binary_linux_wheel_py3.7_cpu - subfolder: cpu/ - - binary_linux_wheel: - cu_version: cu92 - filters: - branches: - only: nightly - tags: - only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ - name: nightly_binary_linux_wheel_py3.7_cu92 - python_version: '3.7' - wheel_docker_image: pytorch/manylinux-cuda92 - - binary_wheel_upload: - context: org-member - filters: - branches: - only: nightly - tags: - only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ - name: nightly_binary_linux_wheel_py3.7_cu92_upload - requires: - - nightly_binary_linux_wheel_py3.7_cu92 - subfolder: cu92/ - - binary_linux_wheel: - cu_version: cu101 - filters: - branches: - only: nightly - tags: - only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ - name: nightly_binary_linux_wheel_py3.7_cu101 - python_version: '3.7' - wheel_docker_image: pytorch/manylinux-cuda101 - - binary_wheel_upload: - context: org-member - filters: - branches: - only: nightly - tags: - only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ - name: nightly_binary_linux_wheel_py3.7_cu101_upload - requires: - - nightly_binary_linux_wheel_py3.7_cu101 - subfolder: cu101/ - - binary_linux_wheel: - cu_version: cu102 - filters: - branches: - only: nightly - tags: - only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ - name: nightly_binary_linux_wheel_py3.7_cu102 - python_version: '3.7' - wheel_docker_image: pytorch/manylinux-cuda102 - - binary_wheel_upload: - context: org-member - filters: - branches: - only: nightly - tags: - only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ - name: nightly_binary_linux_wheel_py3.7_cu102_upload - requires: - - nightly_binary_linux_wheel_py3.7_cu102 - subfolder: cu102/ - - binary_linux_wheel: - cu_version: cpu - filters: - branches: - only: nightly - tags: - only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ - name: nightly_binary_linux_wheel_py3.8_cpu - python_version: '3.8' - wheel_docker_image: pytorch/manylinux-cuda102 - - binary_wheel_upload: - context: org-member - filters: - branches: - only: nightly - tags: - only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ - name: nightly_binary_linux_wheel_py3.8_cpu_upload - requires: - - nightly_binary_linux_wheel_py3.8_cpu - subfolder: cpu/ - - binary_linux_wheel: - cu_version: cu92 - filters: - branches: - only: nightly - tags: - only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ - name: nightly_binary_linux_wheel_py3.8_cu92 - python_version: '3.8' - wheel_docker_image: pytorch/manylinux-cuda92 - - binary_wheel_upload: - context: org-member - filters: - branches: - only: nightly - tags: - only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ - name: nightly_binary_linux_wheel_py3.8_cu92_upload - requires: - - nightly_binary_linux_wheel_py3.8_cu92 - subfolder: cu92/ - - binary_linux_wheel: - cu_version: cu101 - filters: - branches: - only: nightly - tags: - only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ - name: nightly_binary_linux_wheel_py3.8_cu101 - python_version: '3.8' - wheel_docker_image: pytorch/manylinux-cuda101 + name: unittest_linux_<< matrix.cu_version >>_py<< matrix.python_version >> + matrix: + parameters: + python_version: ["3.7", "3.8"] + cu_version: ["cu111"] - binary_wheel_upload: context: org-member + matrix: + parameters: + python_version: ["3.7", "3.8"] + subfolder: ["cpu", "cu111"] filters: branches: only: nightly - tags: - only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ - name: nightly_binary_linux_wheel_py3.8_cu101_upload - requires: - - nightly_binary_linux_wheel_py3.8_cu101 - subfolder: cu101/ - - binary_linux_wheel: - cu_version: cu102 - filters: - branches: - only: nightly - tags: - only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ - name: nightly_binary_linux_wheel_py3.8_cu102 - python_version: '3.8' - wheel_docker_image: pytorch/manylinux-cuda102 - - binary_wheel_upload: - context: org-member - filters: - branches: - only: nightly - tags: - only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ - name: nightly_binary_linux_wheel_py3.8_cu102_upload - requires: - - nightly_binary_linux_wheel_py3.8_cu102 - subfolder: cu102/ - - binary_macos_wheel: - cu_version: cpu - filters: - branches: - only: nightly - tags: - only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ - name: nightly_binary_macos_wheel_py3.6_cpu - python_version: '3.6' - wheel_docker_image: pytorch/manylinux-cuda102 - - binary_wheel_upload: - context: org-member - filters: - branches: - only: nightly - tags: - only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ - name: nightly_binary_macos_wheel_py3.6_cpu_upload - requires: - - nightly_binary_macos_wheel_py3.6_cpu - subfolder: '' - - binary_macos_wheel: - cu_version: cpu - filters: - branches: - only: nightly - tags: - only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ - name: nightly_binary_macos_wheel_py3.7_cpu - python_version: '3.7' - wheel_docker_image: pytorch/manylinux-cuda102 - - binary_wheel_upload: - context: org-member - filters: - branches: - only: nightly - tags: - only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ - name: nightly_binary_macos_wheel_py3.7_cpu_upload - requires: - - nightly_binary_macos_wheel_py3.7_cpu - subfolder: '' - - binary_macos_wheel: - cu_version: cpu - filters: - branches: - only: nightly - tags: - only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ - name: nightly_binary_macos_wheel_py3.8_cpu - python_version: '3.8' - wheel_docker_image: pytorch/manylinux-cuda102 - - binary_wheel_upload: - context: org-member - filters: - branches: - only: nightly - tags: - only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ - name: nightly_binary_macos_wheel_py3.8_cpu_upload - requires: - - nightly_binary_macos_wheel_py3.8_cpu - subfolder: '' -# - binary_win_wheel: -# cu_version: cpu -# filters: -# branches: -# only: nightly -# tags: -# only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ -# name: nightly_binary_win_wheel_py3.6_cpu -# python_version: '3.6' -# - binary_wheel_upload: -# context: org-member -# filters: -# branches: -# only: nightly -# tags: -# only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ -# name: nightly_binary_win_wheel_py3.6_cpu_upload -# requires: -# - nightly_binary_win_wheel_py3.6_cpu -# subfolder: cpu/ -# - binary_win_wheel: -# cu_version: cu92 -# filters: -# branches: -# only: nightly -# tags: -# only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ -# name: nightly_binary_win_wheel_py3.6_cu92 -# python_version: '3.6' -# - binary_wheel_upload: -# context: org-member -# filters: -# branches: -# only: nightly -# tags: -# only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ -# name: nightly_binary_win_wheel_py3.6_cu92_upload -# requires: -# - nightly_binary_win_wheel_py3.6_cu92 -# subfolder: cu92/ -# - binary_win_wheel: -# cu_version: cu101 -# filters: -# branches: -# only: nightly -# tags: -# only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ -# name: nightly_binary_win_wheel_py3.6_cu101 -# python_version: '3.6' -# - binary_wheel_upload: -# context: org-member -# filters: -# branches: -# only: nightly -# tags: -# only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ -# name: nightly_binary_win_wheel_py3.6_cu101_upload -# requires: -# - nightly_binary_win_wheel_py3.6_cu101 -# subfolder: cu101/ -# - binary_win_wheel: -# cu_version: cu102 -# filters: -# branches: -# only: nightly -# tags: -# only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ -# name: nightly_binary_win_wheel_py3.6_cu102 -# python_version: '3.6' -# - binary_wheel_upload: -# context: org-member -# filters: -# branches: -# only: nightly -# tags: -# only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ -# name: nightly_binary_win_wheel_py3.6_cu102_upload -# requires: -# - nightly_binary_win_wheel_py3.6_cu102 -# subfolder: cu102/ -# - binary_win_wheel: -# cu_version: cpu -# filters: -# branches: -# only: nightly -# tags: -# only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ -# name: nightly_binary_win_wheel_py3.7_cpu -# python_version: '3.7' -# - binary_wheel_upload: -# context: org-member -# filters: -# branches: -# only: nightly -# tags: -# only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ -# name: nightly_binary_win_wheel_py3.7_cpu_upload -# requires: -# - nightly_binary_win_wheel_py3.7_cpu -# subfolder: cpu/ -# - binary_win_wheel: -# cu_version: cu92 -# filters: -# branches: -# only: nightly -# tags: -# only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ -# name: nightly_binary_win_wheel_py3.7_cu92 -# python_version: '3.7' -# - binary_wheel_upload: -# context: org-member -# filters: -# branches: -# only: nightly -# tags: -# only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ -# name: nightly_binary_win_wheel_py3.7_cu92_upload -# requires: -# - nightly_binary_win_wheel_py3.7_cu92 -# subfolder: cu92/ -# - binary_win_wheel: -# cu_version: cu101 -# filters: -# branches: -# only: nightly -# tags: -# only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ -# name: nightly_binary_win_wheel_py3.7_cu101 -# python_version: '3.7' -# - binary_wheel_upload: -# context: org-member -# filters: -# branches: -# only: nightly -# tags: -# only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ -# name: nightly_binary_win_wheel_py3.7_cu101_upload -# requires: -# - nightly_binary_win_wheel_py3.7_cu101 -# subfolder: cu101/ -# - binary_win_wheel: -# cu_version: cu102 -# filters: -# branches: -# only: nightly -# tags: -# only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ -# name: nightly_binary_win_wheel_py3.7_cu102 -# python_version: '3.7' -# - binary_wheel_upload: -# context: org-member -# filters: -# branches: -# only: nightly -# tags: -# only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ -# name: nightly_binary_win_wheel_py3.7_cu102_upload -# requires: -# - nightly_binary_win_wheel_py3.7_cu102 -# subfolder: cu102/ -# - binary_win_wheel: -# cu_version: cpu -# filters: -# branches: -# only: nightly -# tags: -# only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ -# name: nightly_binary_win_wheel_py3.8_cpu -# python_version: '3.8' -# - binary_wheel_upload: -# context: org-member -# filters: -# branches: -# only: nightly -# tags: -# only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ -# name: nightly_binary_win_wheel_py3.8_cpu_upload -# requires: -# - nightly_binary_win_wheel_py3.8_cpu -# subfolder: cpu/ -# - binary_win_wheel: -# cu_version: cu92 -# filters: -# branches: -# only: nightly -# tags: -# only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ -# name: nightly_binary_win_wheel_py3.8_cu92 -# python_version: '3.8' -# - binary_wheel_upload: -# context: org-member -# filters: -# branches: -# only: nightly -# tags: -# only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ -# name: nightly_binary_win_wheel_py3.8_cu92_upload -# requires: -# - nightly_binary_win_wheel_py3.8_cu92 -# subfolder: cu92/ -# - binary_win_wheel: -# cu_version: cu101 -# filters: -# branches: -# only: nightly -# tags: -# only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ -# name: nightly_binary_win_wheel_py3.8_cu101 -# python_version: '3.8' -# - binary_wheel_upload: -# context: org-member -# filters: -# branches: -# only: nightly -# tags: -# only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ -# name: nightly_binary_win_wheel_py3.8_cu101_upload -# requires: -# - nightly_binary_win_wheel_py3.8_cu101 -# subfolder: cu101/ -# - binary_win_wheel: -# cu_version: cu102 -# filters: -# branches: -# only: nightly -# tags: -# only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ -# name: nightly_binary_win_wheel_py3.8_cu102 -# python_version: '3.8' -# - binary_wheel_upload: -# context: org-member -# filters: -# branches: -# only: nightly -# tags: -# only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ -# name: nightly_binary_win_wheel_py3.8_cu102_upload -# requires: -# - nightly_binary_win_wheel_py3.8_cu102 -# subfolder: cu102/ - - binary_linux_conda: - cu_version: cpu - filters: - branches: - only: nightly - tags: - only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ - name: nightly_binary_linux_conda_py3.6_cpu - python_version: '3.6' - wheel_docker_image: pytorch/manylinux-cuda102 - - binary_conda_upload: - context: org-member - filters: - branches: - only: nightly - tags: - only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ - name: nightly_binary_linux_conda_py3.6_cpu_upload - requires: - - nightly_binary_linux_conda_py3.6_cpu - - binary_linux_conda: - cu_version: cu92 - filters: - branches: - only: nightly - tags: - only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ - name: nightly_binary_linux_conda_py3.6_cu92 - python_version: '3.6' - wheel_docker_image: pytorch/manylinux-cuda92 - - binary_conda_upload: - context: org-member - filters: - branches: - only: nightly - tags: - only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ - name: nightly_binary_linux_conda_py3.6_cu92_upload - requires: - - nightly_binary_linux_conda_py3.6_cu92 - - binary_linux_conda: - cu_version: cu101 - filters: - branches: - only: nightly - tags: - only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ - name: nightly_binary_linux_conda_py3.6_cu101 - python_version: '3.6' - wheel_docker_image: pytorch/manylinux-cuda101 - - binary_conda_upload: - context: org-member - filters: - branches: - only: nightly - tags: - only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ - name: nightly_binary_linux_conda_py3.6_cu101_upload - requires: - - nightly_binary_linux_conda_py3.6_cu101 - - binary_linux_conda: - cu_version: cu102 - filters: - branches: - only: nightly - tags: - only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ - name: nightly_binary_linux_conda_py3.6_cu102 - python_version: '3.6' - wheel_docker_image: pytorch/manylinux-cuda102 - - binary_conda_upload: - context: org-member - filters: - branches: - only: nightly - tags: - only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ - name: nightly_binary_linux_conda_py3.6_cu102_upload - requires: - - nightly_binary_linux_conda_py3.6_cu102 - - binary_linux_conda: - cu_version: cpu - filters: - branches: - only: nightly - tags: - only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ - name: nightly_binary_linux_conda_py3.7_cpu - python_version: '3.7' - wheel_docker_image: pytorch/manylinux-cuda102 - - binary_conda_upload: - context: org-member - filters: - branches: - only: nightly - tags: - only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ - name: nightly_binary_linux_conda_py3.7_cpu_upload - requires: - - nightly_binary_linux_conda_py3.7_cpu - - binary_linux_conda: - cu_version: cu92 - filters: - branches: - only: nightly - tags: - only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ - name: nightly_binary_linux_conda_py3.7_cu92 - python_version: '3.7' - wheel_docker_image: pytorch/manylinux-cuda92 - - binary_conda_upload: - context: org-member - filters: - branches: - only: nightly - tags: - only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ - name: nightly_binary_linux_conda_py3.7_cu92_upload - requires: - - nightly_binary_linux_conda_py3.7_cu92 - - binary_linux_conda: - cu_version: cu101 - filters: - branches: - only: nightly - tags: - only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ - name: nightly_binary_linux_conda_py3.7_cu101 - python_version: '3.7' - wheel_docker_image: pytorch/manylinux-cuda101 - - binary_conda_upload: - context: org-member - filters: - branches: - only: nightly - tags: - only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ - name: nightly_binary_linux_conda_py3.7_cu101_upload - requires: - - nightly_binary_linux_conda_py3.7_cu101 - - binary_linux_conda: - cu_version: cu102 - filters: - branches: - only: nightly - tags: - only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ - name: nightly_binary_linux_conda_py3.7_cu102 - python_version: '3.7' - wheel_docker_image: pytorch/manylinux-cuda102 - - binary_conda_upload: - context: org-member - filters: - branches: - only: nightly - tags: - only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ - name: nightly_binary_linux_conda_py3.7_cu102_upload - requires: - - nightly_binary_linux_conda_py3.7_cu102 - - binary_linux_conda: - cu_version: cpu - filters: - branches: - only: nightly - tags: - only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ - name: nightly_binary_linux_conda_py3.8_cpu - python_version: '3.8' - wheel_docker_image: pytorch/manylinux-cuda102 - - binary_conda_upload: - context: org-member - filters: - branches: - only: nightly - tags: - only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ - name: nightly_binary_linux_conda_py3.8_cpu_upload - requires: - - nightly_binary_linux_conda_py3.8_cpu - - binary_linux_conda: - cu_version: cu92 - filters: - branches: - only: nightly - tags: - only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ - name: nightly_binary_linux_conda_py3.8_cu92 - python_version: '3.8' - wheel_docker_image: pytorch/manylinux-cuda92 - - binary_conda_upload: - context: org-member - filters: - branches: - only: nightly - tags: - only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ - name: nightly_binary_linux_conda_py3.8_cu92_upload - requires: - - nightly_binary_linux_conda_py3.8_cu92 - - binary_linux_conda: - cu_version: cu101 - filters: - branches: - only: nightly - tags: - only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ - name: nightly_binary_linux_conda_py3.8_cu101 - python_version: '3.8' - wheel_docker_image: pytorch/manylinux-cuda101 - - binary_conda_upload: - context: org-member - filters: - branches: - only: nightly - tags: - only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ - name: nightly_binary_linux_conda_py3.8_cu101_upload - requires: - - nightly_binary_linux_conda_py3.8_cu101 - - binary_linux_conda: - cu_version: cu102 - filters: - branches: - only: nightly - tags: - only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ - name: nightly_binary_linux_conda_py3.8_cu102 - python_version: '3.8' - wheel_docker_image: pytorch/manylinux-cuda102 - - binary_conda_upload: - context: org-member - filters: - branches: - only: nightly - tags: - only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ - name: nightly_binary_linux_conda_py3.8_cu102_upload - requires: - - nightly_binary_linux_conda_py3.8_cu102 - - binary_macos_conda: - cu_version: cpu - filters: - branches: - only: nightly - tags: - only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ - name: nightly_binary_macos_conda_py3.6_cpu - python_version: '3.6' - wheel_docker_image: pytorch/manylinux-cuda102 - - binary_conda_upload: - context: org-member - filters: - branches: - only: nightly - tags: - only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ - name: nightly_binary_macos_conda_py3.6_cpu_upload - requires: - - nightly_binary_macos_conda_py3.6_cpu - - binary_macos_conda: - cu_version: cpu - filters: - branches: - only: nightly - tags: - only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ - name: nightly_binary_macos_conda_py3.7_cpu - python_version: '3.7' - wheel_docker_image: pytorch/manylinux-cuda102 - - binary_conda_upload: - context: org-member - filters: - branches: - only: nightly - tags: - only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ - name: nightly_binary_macos_conda_py3.7_cpu_upload - requires: - - nightly_binary_macos_conda_py3.7_cpu - - binary_macos_conda: - cu_version: cpu - filters: - branches: - only: nightly - tags: - only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ - name: nightly_binary_macos_conda_py3.8_cpu - python_version: '3.8' - wheel_docker_image: pytorch/manylinux-cuda102 - - binary_conda_upload: - context: org-member - filters: - branches: - only: nightly - tags: - only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ - name: nightly_binary_macos_conda_py3.8_cpu_upload requires: - - nightly_binary_macos_conda_py3.8_cpu -# - binary_win_conda: -# cu_version: cpu -# filters: -# branches: -# only: nightly -# tags: -# only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ -# name: nightly_binary_win_conda_py3.6_cpu -# python_version: '3.6' -# - binary_conda_upload: -# context: org-member -# filters: -# branches: -# only: nightly -# tags: -# only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ -# name: nightly_binary_win_conda_py3.6_cpu_upload -# requires: -# - nightly_binary_win_conda_py3.6_cpu -# - binary_win_conda: -# cu_version: cu92 -# filters: -# branches: -# only: nightly -# tags: -# only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ -# name: nightly_binary_win_conda_py3.6_cu92 -# python_version: '3.6' -# - binary_conda_upload: -# context: org-member -# filters: -# branches: -# only: nightly -# tags: -# only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ -# name: nightly_binary_win_conda_py3.6_cu92_upload -# requires: -# - nightly_binary_win_conda_py3.6_cu92 -# - binary_win_conda: -# cu_version: cu101 -# filters: -# branches: -# only: nightly -# tags: -# only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ -# name: nightly_binary_win_conda_py3.6_cu101 -# python_version: '3.6' -# - binary_conda_upload: -# context: org-member -# filters: -# branches: -# only: nightly -# tags: -# only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ -# name: nightly_binary_win_conda_py3.6_cu101_upload -# requires: -# - nightly_binary_win_conda_py3.6_cu101 -# - binary_win_conda: -# cu_version: cu102 -# filters: -# branches: -# only: nightly -# tags: -# only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ -# name: nightly_binary_win_conda_py3.6_cu102 -# python_version: '3.6' -# - binary_conda_upload: -# context: org-member -# filters: -# branches: -# only: nightly -# tags: -# only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ -# name: nightly_binary_win_conda_py3.6_cu102_upload -# requires: -# - nightly_binary_win_conda_py3.6_cu102 -# - binary_win_conda: -# cu_version: cpu -# filters: -# branches: -# only: nightly -# tags: -# only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ -# name: nightly_binary_win_conda_py3.7_cpu -# python_version: '3.7' -# - binary_conda_upload: -# context: org-member -# filters: -# branches: -# only: nightly -# tags: -# only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ -# name: nightly_binary_win_conda_py3.7_cpu_upload -# requires: -# - nightly_binary_win_conda_py3.7_cpu -# - binary_win_conda: -# cu_version: cu92 -# filters: -# branches: -# only: nightly -# tags: -# only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ -# name: nightly_binary_win_conda_py3.7_cu92 -# python_version: '3.7' -# - binary_conda_upload: -# context: org-member -# filters: -# branches: -# only: nightly -# tags: -# only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ -# name: nightly_binary_win_conda_py3.7_cu92_upload -# requires: -# - nightly_binary_win_conda_py3.7_cu92 -# - binary_win_conda: -# cu_version: cu101 -# filters: -# branches: -# only: nightly -# tags: -# only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ -# name: nightly_binary_win_conda_py3.7_cu101 -# python_version: '3.7' -# - binary_conda_upload: -# context: org-member -# filters: -# branches: -# only: nightly -# tags: -# only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ -# name: nightly_binary_win_conda_py3.7_cu101_upload -# requires: -# - nightly_binary_win_conda_py3.7_cu101 -# - binary_win_conda: -# cu_version: cu102 -# filters: -# branches: -# only: nightly -# tags: -# only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ -# name: nightly_binary_win_conda_py3.7_cu102 -# python_version: '3.7' -# - binary_conda_upload: -# context: org-member -# filters: -# branches: -# only: nightly -# tags: -# only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ -# name: nightly_binary_win_conda_py3.7_cu102_upload -# requires: -# - nightly_binary_win_conda_py3.7_cu102 -# - binary_win_conda: -# cu_version: cpu -# filters: -# branches: -# only: nightly -# tags: -# only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ -# name: nightly_binary_win_conda_py3.8_cpu -# python_version: '3.8' -# - binary_conda_upload: -# context: org-member -# filters: -# branches: -# only: nightly -# tags: -# only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ -# name: nightly_binary_win_conda_py3.8_cpu_upload -# requires: -# - nightly_binary_win_conda_py3.8_cpu -# - binary_win_conda: -# cu_version: cu92 -# filters: -# branches: -# only: nightly -# tags: -# only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ -# name: nightly_binary_win_conda_py3.8_cu92 -# python_version: '3.8' -# - binary_conda_upload: -# context: org-member -# filters: -# branches: -# only: nightly -# tags: -# only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ -# name: nightly_binary_win_conda_py3.8_cu92_upload -# requires: -# - nightly_binary_win_conda_py3.8_cu92 -# - binary_win_conda: -# cu_version: cu101 -# filters: -# branches: -# only: nightly -# tags: -# only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ -# name: nightly_binary_win_conda_py3.8_cu101 -# python_version: '3.8' -# - binary_conda_upload: -# context: org-member -# filters: -# branches: -# only: nightly -# tags: -# only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ -# name: nightly_binary_win_conda_py3.8_cu101_upload -# requires: -# - nightly_binary_win_conda_py3.8_cu101 -# - binary_win_conda: -# cu_version: cu102 -# filters: -# branches: -# only: nightly -# tags: -# only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ -# name: nightly_binary_win_conda_py3.8_cu102 -# python_version: '3.8' -# - binary_conda_upload: -# context: org-member -# filters: -# branches: -# only: nightly -# tags: -# only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ -# name: nightly_binary_win_conda_py3.8_cu102_upload -# requires: -# - nightly_binary_win_conda_py3.8_cu102 + - unittest_linux_<< matrix.subfolder >>_py<< matrix.python_version >> diff --git a/.circleci/unittest/linux/scripts/environment.yml b/.circleci/unittest/linux/scripts/environment.yml index 7310ae61..5b85d711 100644 --- a/.circleci/unittest/linux/scripts/environment.yml +++ b/.circleci/unittest/linux/scripts/environment.yml @@ -3,8 +3,6 @@ channels: dependencies: - numpy - pytest - - pytest-cov - - codecov - pip - ca-certificates - pip: diff --git a/.circleci/unittest/linux/scripts/install.sh b/.circleci/unittest/linux/scripts/install.sh index 5b90dd03..5f40403c 100755 --- a/.circleci/unittest/linux/scripts/install.sh +++ b/.circleci/unittest/linux/scripts/install.sh @@ -1,4 +1,6 @@ #!/usr/bin/env bash +set -x +set -e unset PYTORCH_VERSION # For unittest, nightly PyTorch is used as the following section, @@ -10,20 +12,48 @@ set -e eval "$(./conda/bin/conda shell.bash hook)" conda activate ./env +# if [ "${CU_VERSION:-}" == cpu ] ; then +# cudatoolkit="cpuonly" +# else +# if [[ ${#CU_VERSION} -eq 4 ]]; then +# CUDA_VERSION="${CU_VERSION:2:1}.${CU_VERSION:3:1}" +# elif [[ ${#CU_VERSION} -eq 5 ]]; then +# CUDA_VERSION="${CU_VERSION:2:2}.${CU_VERSION:4:1}" +# fi +# echo "Using CUDA $CUDA_VERSION as determined by CU_VERSION" +# version="$(python -c "print('.'.join(\"${CUDA_VERSION}\".split('.')[:2]))")" +# cudatoolkit="cudatoolkit=${version}" +# fi + +WHEELS_FOLDER=${HOME}/project/wheels +mkdir -p $WHEELS_FOLDER + +PYVSHORT=${PARAMETERS_PYTHON_VERSION:0:1}${PARAMETERS_PYTHON_VERSION:2:1} + +if [[ "$PYVSHORT" == "38" ]] ; then + PYVSHORT=cp${PYVSHORT}-cp${PYVSHORT} +elif [[ "$PYVSHORT" == "39" ]] ; then + PYVSHORT=cp${PYVSHORT}-cp${PYVSHORT} +else + PYVSHORT=cp${PYVSHORT}-cp${PYVSHORT}m +fi + +NIGHTLY_DATE=20220202 + if [ "${CU_VERSION:-}" == cpu ] ; then - cudatoolkit="cpuonly" + pip3 install -q --pre torch==1.11.0dev${NIGHTLY_DATE} torchvision==0.12.0dev${NIGHTLY_DATE}+cpu -f https://download.pytorch.org/whl/nightly/cpu/torch_nightly.html + conda install -y ninja + PYTORCH_VERSION="$(python -c "import torch; print(torch.__version__)")" USE_NINJA=1 python setup.py develop bdist_wheel -d $WHEELS_FOLDER else - if [[ ${#CU_VERSION} -eq 4 ]]; then - CUDA_VERSION="${CU_VERSION:2:1}.${CU_VERSION:3:1}" - elif [[ ${#CU_VERSION} -eq 5 ]]; then - CUDA_VERSION="${CU_VERSION:2:2}.${CU_VERSION:4:1}" - fi - echo "Using CUDA $CUDA_VERSION as determined by CU_VERSION" - version="$(python -c "print('.'.join(\"${CUDA_VERSION}\".split('.')[:2]))")" - cudatoolkit="cudatoolkit=${version}" + pip3 install -q --pre torch==1.11.0dev${NIGHTLY_DATE}+cu111 torchvision==0.12.0dev${NIGHTLY_DATE} -f https://download.pytorch.org/whl/nightly/cu111/torch_nightly.html + conda install -y ninja + PYTORCH_VERSION="$(python -c "import torch; print(torch.__version__)")" FORCE_CUDA=1 USE_NINJA=1 python setup.py develop bdist_wheel -d $WHEELS_FOLDER fi -printf "Installing PyTorch with %s\n" "${cudatoolkit}" -conda install -y -c pytorch-nightly pytorch "${cudatoolkit}" -printf "* Installing nestedtensor\n" -python setup.py develop \ No newline at end of file +# if [ "${CU_VERSION:-}" == cpu ] ; then +# conda install -y pytorch torchvision cpuonly -c pytorch-nightly +# PYTORCH_VERSION="$(python -c "import torch; print(torch.__version__)")" USE_NINJA=1 python setup.py develop bdist_wheel -d $WHEELS_FOLDER +# else +# conda install -y pytorch torchvision cudatoolkit=10.2 -c pytorch-nightly +# PYTORCH_VERSION="$(python -c "import torch; print(torch.__version__)")" FORCE_CUDA=1 USE_NINJA=1 python setup.py develop bdist_wheel -d $WHEELS_FOLDER +# fi diff --git a/.circleci/unittest/linux/scripts/post_process.sh b/.circleci/unittest/linux/scripts/post_process.sh index b05be6da..e97bf2a7 100755 --- a/.circleci/unittest/linux/scripts/post_process.sh +++ b/.circleci/unittest/linux/scripts/post_process.sh @@ -4,5 +4,3 @@ set -e eval "$(./conda/bin/conda shell.bash hook)" conda activate ./env - -codecov \ No newline at end of file diff --git a/.circleci/unittest/linux/scripts/run_local.sh b/.circleci/unittest/linux/scripts/run_local.sh new file mode 100755 index 00000000..85da2d15 --- /dev/null +++ b/.circleci/unittest/linux/scripts/run_local.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash +set -x +set -e + +cd /mnt/mydata/scripts +apt update +apt-get -y install git wget +export PARAMETERS_PYTHON_VERSION="3.8" +.circleci/unittest/linux/scripts/setup_env.sh +.circleci/unittest/linux/scripts/install.sh +.circleci/unittest/linux/scripts/run_test.sh diff --git a/.circleci/unittest/linux/scripts/run_test.sh b/.circleci/unittest/linux/scripts/run_test.sh index 4d0acda2..9b67411d 100755 --- a/.circleci/unittest/linux/scripts/run_test.sh +++ b/.circleci/unittest/linux/scripts/run_test.sh @@ -6,4 +6,4 @@ eval "$(./conda/bin/conda shell.bash hook)" conda activate ./env python -m torch.utils.collect_env -pytest --cov=nestedtensor --junitxml=test-results/junit.xml -v --durations 20 test \ No newline at end of file +find test -name test\*.py | xargs -I {} -n 1 bash -c "python {} --verbose -f || exit 255" diff --git a/.circleci/unittest/linux/scripts/setup_env.sh b/.circleci/unittest/linux/scripts/setup_env.sh index 89efc370..13aac9ea 100755 --- a/.circleci/unittest/linux/scripts/setup_env.sh +++ b/.circleci/unittest/linux/scripts/setup_env.sh @@ -1,4 +1,6 @@ #!/usr/bin/env bash +set -x +set -e # This script is for setting up environment in which unit test is ran. # To speed up the CI time, the resulting environment is cached. @@ -25,7 +27,7 @@ eval "$(${conda_dir}/bin/conda shell.bash hook)" # 2. Create test environment at ./env if [ ! -d "${env_dir}" ]; then printf "* Creating a test environment\n" - conda create --prefix "${env_dir}" -y python="$PYTHON_VERSION" + conda create --prefix "${env_dir}" -y python="$PARAMETERS_PYTHON_VERSION" fi conda activate "${env_dir}" diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 00000000..791fd848 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,52 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: '' +assignees: '' + +--- + +## 🐛 Bug + + + +## To Reproduce + +Steps to reproduce the behavior: + +1. +1. +1. + + + +## Expected behavior + + + +## Environment + +Please copy and paste the output from our +[environment collection script](https://raw.githubusercontent.com/pytorch/pytorch/master/torch/utils/collect_env.py) +(or fill out the checklist below manually). + +You can get the script and run it with: +``` +wget https://raw.githubusercontent.com/pytorch/pytorch/master/torch/utils/collect_env.py +# For security purposes, please check the contents of collect_env.py before running it. +python collect_env.py +``` + + - PyTorch Version (e.g., 1.0): + - OS (e.g., Linux): + - How you installed PyTorch (`conda`, `pip`, source): + - Build command you used (if compiling from source): + - Python version: + - CUDA/cuDNN version: + - GPU models and configuration: + - Any other relevant information: + +## Additional context + + diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 00000000..f488bd95 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,27 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: '' +assignees: '' + +--- + +## 🚀 Feature + + +## Motivation + + + +## Pitch + + + +## Alternatives + + + +## Additional context + + diff --git a/.github/ISSUE_TEMPLATE/prototype-feedback.md b/.github/ISSUE_TEMPLATE/prototype-feedback.md new file mode 100644 index 00000000..650cb56b --- /dev/null +++ b/.github/ISSUE_TEMPLATE/prototype-feedback.md @@ -0,0 +1,16 @@ +--- +name: Prototype Feedback +about: Give feedback on the API and usefulness of this project +title: '' +labels: '' +assignees: '' + +--- + +### The main reason I want to use nestedtensor and what value I want it to add + +### The features I wish nestedtensor had + +### The things about nestedtensor that frustrate me + +### [Optional] Example code or project I want to integrate with nestedtensor diff --git a/.gitignore b/.gitignore index a1771d56..c2e9ab92 100644 --- a/.gitignore +++ b/.gitignore @@ -240,3 +240,5 @@ TAGS # Files generated when a patch is rejected *.orig *.rej + +!build_with_submodule.sh diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..65ed9e8b --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "third_party/pytorch"] + path = third_party/pytorch + url = https://github.com/pytorch/pytorch.git diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..780c4b38 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,32 @@ +# Contributing to nestedtensor +We want to make contributing to this project as easy and transparent as +possible. + +## Pull Requests +We actively welcome your pull requests. + +1. Fork the repo and create your branch from `master`. +2. If you've added code that should be tested, add tests. +3. If you've changed APIs, update the documentation. +4. Ensure the test suite passes. +5. Make sure your code lints. +6. If you haven't already, complete the Contributor License Agreement ("CLA"). + +## Contributor License Agreement ("CLA") +In order to accept your pull request, we need you to submit a CLA. You only need +to do this once to work on any of Facebook's open source projects. + +Complete your CLA here: + +## Issues +We use GitHub issues to track public bugs. Please ensure your description is +clear and has sufficient instructions to be able to reproduce the issue. + +Facebook has a [bounty program](https://www.facebook.com/whitehat/) for the safe +disclosure of security bugs. In those cases, please go through the process +outlined on that page and do not file a public issue. + +## License +By contributing to nestedtensor, you agree that your contributions will be licensed +under the LICENSE file in the root directory of this source tree. + diff --git a/README.md b/README.md index d0b64a85..16d08288 100644 --- a/README.md +++ b/README.md @@ -1,170 +1,109 @@ -# The nestedtensor package +# BIG UPDATE: NestedTensor [in core](https://pytorch.org/docs/master/nested.html)! -NOTE: nestedtensor is under active development and various aspects may change. +## March 15 2022 +As of recently we landed a minimal version of NestedTensor [in core PyTorch](https://pytorch.org/docs/master/nested.html)! +Operator coverage and migration of features is possible, but must be backed by issues (feature requests). If you have demand for specific NestedTensor operators, please open a feature request on [pytorch/pytorch](https://github.com/pytorch/pytorch/issues/new?assignees=&labels=&template=feature-request.yml). For a more impactful submission please include your motivation, use case and list of operators. +
+
+
+
+
+
-NOTE: We test and develop against nightlies! Please use the most recent version of PyTorch if you plan to use this code. +# The nestedtensor package [prototype](https://pytorch.org/blog/pytorch-feature-classification-changes/#prototype) -## Motivation +If you are here because you ran into a runtime error due to a missing feature or some kind of bug, please [open an issue and fill in the appropiate template](https://github.com/pytorch/nestedtensor/issues/new/choose). If you have general feedback about this prototype [you can use our suggested template](https://github.com/pytorch/nestedtensor/issues/new?assignees=&labels=&template=prototype-feedback.md&title=) or just open a free-form issue if you like. Thank you for contributing to this project! -We often want to manipulate collections of Tensors of different shapes. For example, paragraphs of text, images of different sizes or audio files of different lengths. We don't have a first class generalization that eases the concurrent manipulation of collections of this type of data. We further often want to batch arbitrary data and operations for efficiency, which then leads us to write awkward workarounds such as padding. +## Tutorials -## Description +If you are new to this project, we recommend you take a look at our [whirlwind introduction](https://colab.research.google.com/github/pytorch/nestedtensor/blob/master/tutorials/notebooks/basic.ipynb) to get started. -NestedTensors are a generalization of torch Tensor which eases working with data of different sizes and length. -In general, there are two cases for which NestedTensors provide computational representations: list of tensors and lists of NestedTensors. +## Autograd support -## Constraints - - Each Tensor constituent of the list it represents, if any, must be of its dtype, layout and device. - - The dimension of a constituent Tensor must be one less than the dimension of the NestedTensor. - - An empty list of Tensors yields a NestedTensor of dimension zero. - - Each constituent NestedTensor must be of its dtype, layout and device. - - The dimension of a constituent NestedTensor must be one less than the dimension of the NestedTensor. +Due to missing extensibility features of PyTorch nestedtensor currently lacks autograd support. We're actively working on this and recognize that it severely limits the applicability of the project. Please run nestedtensor operations within the [inference mode](https://github.com/ailzhang/rfcs/blob/rfc0011/RFC-0011-InferenceMode.md) context to prevent any adverse interactions with the autograd system. -## Prerequisites - -- pytorch -- torchvision (needed for examples) -- ipython (needed for examples) -- notebook (needed for examples) - -If you have conda installed on your machine, you can install these via +For example ``` -conda install ipython pytorch notebook torchvision -c pytorch-nightly +sentences = [torch.randn(10, 5), torch.randn(5, 5), torch.randn(9, 5)] +with torch.inference_mode(): + nt = nestedtensor.nested_tensor(sentences) + nt.sum(1) ``` -## Build -Run -``` -python setup.py develop -``` +## Binaries -NOTE: This repository uses a C++ extension. Please file an issue if you want into compilation errors. +Due to the development velocity of PyTorch the nestedtensor project is built on top of and dependent on a fixed, recent PyTorch nightly. -## Usage -Import nested tensors and torch via ```from nestedtensor import torch``` +| Version | Python | CUDA | Wheels | +| --- | ---- | ------ | ---- | +| 0.1.1 | 3.6 | CPU-only | [nestedtensor](https://download.pytorch.org/nestedtensor/whl/nightly/cpu/py3.6/nestedtensor-0.1.1_cpu-cp36-cp36m-linux_x86_64.whl) | +| 0.1.1 | 3.7 | CPU-only | [nestedtensor](https://download.pytorch.org/nestedtensor/whl/nightly/cpu/py3.7/nestedtensor-0.1.1_cpu-cp37-cp37m-linux_x86_64.whl) | +| 0.1.1 | 3.8 | CPU-only | [nestedtensor](https://download.pytorch.org/nestedtensor/whl/nightly/cpu/py3.8/nestedtensor-0.1.1_cpu-cp38-cp38m-linux_x86_64.whl) | +| 0.1.1 | 3.6 | CUDA 10.2 | [nestedtensor](https://download.pytorch.org/nestedtensor/whl/nightly/cpu/py3.6/nestedtensor-0.1.1_cu102-cp36-cp36m-linux_x86_64.whl) | +| 0.1.1 | 3.7 | CUDA 10.2 | [nestedtensor](https://download.pytorch.org/nestedtensor/whl/nightly/cpu/py3.7/nestedtensor-0.1.1_cu102-cp37-cp37m-linux_x86_64.whl) | +| 0.1.1 | 3.8 | CUDA 10.2 | [nestedtensor](https://download.pytorch.org/nestedtensor/whl/nightly/cpu/py3.8/nestedtensor-0.1.1_cu102-cp38-cp38m-linux_x86_64.whl) | -### Creation +When installing a binary please specify the corresponding torch nightly link archive to automatically pull in the correct PyTorch nightly. +CPU ``` -nt = nestedtensor.nested_tensor( - [ - [ - torch.rand(2, 3), - torch.rand(4, 5) - ], - [ - torch.rand(1, 2) - ] - ]) +pip install https://download.pytorch.org/nestedtensor/whl/nightly/cpu/py3.7/nestedtensor-0.1.1_cpu-cp37-cp37m-linux_x86_64.whl -f https://download.pytorch.org/whl/nightly/cpu/torch_nightly.html ``` +CUDA 10.2 ``` -a = torch.tensor([1]) -b = torch.tensor([[2, 2], - [3, 3], - [4, 4], - [5, 5]]) -nt2 = nestedtensor.nested_tensor([[a],[b]]) +pip install https://download.pytorch.org/nestedtensor/whl/nightly/cu102/py3.7/nestedtensor-0.1.1_cu102-cp37-cp37m-linux_x86_64.whl -f https://download.pytorch.org/whl/nightly/cu102/torch_nightly.html ``` -The level of nesting is inferred from the input. The constructor always copies. Whatever you pass into the constructor will share no data with what the constructor returns. This matches torch.tensor's behavior. +## Why consider using this? / Dealing with dynamic shapes -If given a NestedTensor or Tensor it will return a detached copy, which is consistent with the behavior of torch.tensor. Remember that you cannot mix Tensors and NestedTensors within a given list. +In general we batch data for efficiency, but usually batched kernels need, or greatly benefit from, regular, statically-shaped data. -A side-note on naming: nestedtensor is a python packed and as such [shouldn't have underscores and is lower case](https://www.python.org/dev/peps/pep-0008/#package-and-module-names), but nested_tensor is a python function and as [such should use underscores](https://www.python.org/dev/peps/pep-0008/#function-and-variable-names) in contrast to the [CapWorded NestedTensor class](https://www.python.org/dev/peps/pep-0008/#class-names). +One way of dealing with dynamic shapes then, is via padding and masking. +[Various](https://github.com/pytorch/fairseq/blob/54b934417d95baa1b0076089c61bde32728e34cf/fairseq/data/audio/raw_audio_dataset.py#L92) +[projects](https://github.com/facebookresearch/ParlAI/blob/8200396cdd08cfd26b01fe52b4a3bd0654081182/parlai/agents/drqa/utils.py#L143) +[construct](https://github.com/facebookresearch/detr/blob/4e1a9281bc5621dcd65f3438631de25e255c4269/util/misc.py#L306) +[masks](https://github.com/pytorch/vision/blob/24f16a338391d6f45aa6291c48eb6d5513771631/references/detection/utils.py#L102) +[that](https://github.com/pytorch/audio/blob/3250d3df168c956389bd16956aa458ce111570d0/examples/pipeline_wav2letter/datasets.py#L90), together with a data Tensor, are used as a representation for lists of dynamically shaped Tensors. -### Conversion/unbind() -A user can retrieve the constituent Tensors via unbind. Unbind is currently used by torch to turn Tensors into tuples of Tensors. Unbind always returns a tuple of views. +Obviously this is inefficient from a memory and compute perspective if the Tensors within this list are sufficiently diverse. -``` ->>> from nestedtensor import torch ->>> ->>> a = [ -... [torch.rand(1, 2), torch.rand(2, 1)], -... [torch.rand(3, 2)] -... ] ->>> ->>> b = nestedtensor.nested_tensor(a) ->>> print(b) -nested_tensor([ - [ - tensor([[0.5356, 0.5609]]), - tensor([[0.1567], - [0.8880]]) - ], - [ - tensor([[0.4060, 0.4359], - [0.4069, 0.3802], - [0.0040, 0.3759]]) - ] -]) ->>> b1 = b.unbind() # Tuple of 2 NestedTensors ->>> print(b1) -(nested_tensor([ - tensor([[0.5356, 0.5609]]), - tensor([[0.1567], - [0.8880]]) -]), nested_tensor([ - tensor([[0.4060, 0.4359], - [0.4069, 0.3802], - [0.0040, 0.3759]]) -])) ->>> b2 = b1[0].unbind() # Tuple of 2 Tensors ->>> print(b2) -(tensor([[0.5356, 0.5609]]), - tensor([[0.1567], - [0.8880]])) -``` +You can also trace through the codebase where these masks are used and observe the kind of code this approach often leads to. See for example [universal_sentence_embedding](https://github.com/facebookresearch/ParlAI/blob/8200396cdd08cfd26b01fe52b4a3bd0654081182/parlai/agents/drqa/utils.py#L143). -### Other Ops -We currently lack detailed documentation for all supported ops. Please see the examples and stay tuned for updates on this front. +Otherwise we also have +[one-off](https://pytorch.org/docs/master/generated/torch.nn.utils.rnn.pack_padded_sequence.html?highlight=pack_padded_sequence) +[operator](https://pytorch.org/docs/master/generated/torch.nn.CrossEntropyLoss.html#torch.nn.CrossEntropyLoss) +[support](https://pytorch.org/docs/master/generated/torch.nn.MultiheadAttention.html#torch.nn.MultiheadAttention) +[in](https://pytorch.org/docs/master/generated/torch.nn.EmbeddingBag.html#torch.nn.EmbeddingBag) +PyTorch that aims to support dynamic shapes via extra arguments such as a +[padding index](https://pytorch.org/docs/master/generated/torch.nn.CrossEntropyLoss.html#torch.nn.CrossEntropyLoss). +Of course, while these functions are fast and sometimes memory efficient, they don't provide a consistent interface. +Other users simply gave up and started writing [for-loops](https://github.com/pytorch/vision/blob/1aef87d01eec2c0989458387fa04baebcc86ea7b/torchvision/models/detection/transform.py#L97), or discovered that batching didn't help. -## The tensorwise decorator -The nestedtensor package allows the user to decorate existing functions with a tensorwise decorator. This decorator lifts the given function to check for NestedTensor arguments and recursively apply it to their constituents. +We want to have a single abstraction that is consistent, fast, memory efficient and readable and the nestedtensor project aims to provide that. -``` ->>> from nestedtensor import torch ->>> ->>> @torch.tensorwise() -... def simple_fn(t1, t2): -... return t1 + 1 + t2 -... ->>> ->>> a = torch.tensor([1, 2]) ->>> b = torch.tensor([7, 8]) ->>> print(simple_fn(a, b)) -tensor([ 9, 11]) ->>> c = torch.tensor([4, 3]) ->>> d = torch.tensor([5, 6]) ->>> print(simple_fn(c, d)) -tensor([10, 10]) ->>> ->>> n = nestedtensor.nested_tensor([a, c]) ->>> m = nestedtensor.nested_tensor([b, d]) ->>> print(simple_fn(n, m)) -nested_tensor([ - tensor([ 9, 11]), - tensor([10, 10]) -]) ->>> print(simple_fn(a, m)) # Broadcasting -nested_tensor([ - tensor([ 9, 11]), - tensor([7, 9]) -]) ->>> print(a) -tensor([1, 2]) ->>> print(m) -nested_tensor([ - tensor([7, 8]), - tensor([5, 6]) -]) ->>> print(simple_fn(a, m)) # Broadcasting -nested_tensor([ - tensor([ 9, 11]), - tensor([7, 9]) -]) -``` +## How does nestedtensor help here? + +NestedTensors are a generalization of torch Tensors which eases working with data of different shapes and lengths. +In a nutshell, Tensors have scalar entries (e.g. floats) and NestedTensors have Tensor entries. However, note that +a NestedTensor is still a Tensor. That means it needs to have a single dimension, single dtype, single device and single layout. + + Tensor entry constraints: + - Each Tensor constituent is of the dtype, layout and device of the containing NestedTensor. + - The dimension of a constituent Tensor must be less than the dimension of the NestedTensor. + - An empty NestedTensor is of dimension zero. + +## Prototype classification + +The nestedtensor package is a prototype intended for early stage feedback and testing. It is on the road to a beta classification, but there is no definitive timeline yet. See [PyTorch feature classification](https://pytorch.org/docs/stable/index.html) for what prototype, beta and stale means. + +## Dependencies + +- pytorch (installed from nestedtensor/third_party/pytorch submodule) +- torchvision (needed for examples and tests) +- ipython (needed for examples) +- notebook (needed for examples) ## Contribution -The project is under active development. If you have a suggestions or found an bug, please file an issue! +The project is under active development. If you have a suggestions or found a bug, please file an issue! diff --git a/assets/NestedTensor_as_unifying_datastructure_for_non_uniform_Tensor_input.ipynb b/assets/NestedTensor_as_unifying_datastructure_for_non_uniform_Tensor_input.ipynb new file mode 100644 index 00000000..f0ddd41a --- /dev/null +++ b/assets/NestedTensor_as_unifying_datastructure_for_non_uniform_Tensor_input.ipynb @@ -0,0 +1,582 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "name": "NestedTensor as unifying datastructure for non-uniform Tensor input", + "provenance": [], + "collapsed_sections": [] + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + } + }, + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "WhQTZmQY6g4c" + }, + "source": [ + "## NestedTensor as unifying datastructure for non-uniform Tensor input\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Z6sn7kkU6jV1" + }, + "source": [ + "See [the corresponding RFC for more background on motivation](https://docs.google.com/document/d/1VdKG5JA0U8iiwd6eYpUlCItm3zNJns8_ooJvaH_JWV8/edit#).\n", + "\n", + "In general this construct is meant as a container with the following layouts as inspired by the cited operators." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "GB8aHyCn1xHc" + }, + "source": [ + "from enum import Enum\n", + "class Layout(Enum):\n", + " Masked = 0 # Example: TransformerEncoderLayer or CrossEntropyLoss by using the mask to fill with padding_idx\n", + " Packed = 1 # Example: EmbeddingBag\n", + " PackedSequence = 2 # Restricted to RNN\n", + " List = 3 # Fallback and default for quick creation" + ], + "execution_count": 1, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "oYT9BMcr1_Ag" + }, + "source": [ + "The following hidden cell is an incomplete implementation of this using torch_function. This structure does layout conversions via a ```to``` method and provides a unified constructor, which accepts a list of Tensors and that allows the specification of a layout." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "eK-_QTN36iIF", + "cellView": "form" + }, + "source": [ + "#@title\n", + "import torch\n", + "from enum import Enum\n", + "\n", + "def _nn_functional_embedding_bag(input, weight, offsets=None, max_norm=None, norm_type=2,\n", + " scale_grad_by_freq=False, mode='mean', sparse=False,\n", + " per_sample_weights=None, include_last_offset=False):\n", + " # [...] Omitted input sanitization\n", + " # [...] Verify that nested_size is shape compliant, i.e. all 1d Tensors (sequences)\n", + " # Design decision: conversion happens automatically. This is similar to how we automatically\n", + " # make Tensor contiguous or convert from fp16 to fp32 or sparse to dense if needed.\n", + " # We could decide to throw a warning here.\n", + " input = input.to(Layout.Packed)\n", + " offsets = torch.tensor([0] + [x[0] for x in input.nested_size()[:-1]]).cumsum(0)\n", + " # We could consider caching this metadata in NestedTensor\n", + " offsets = offsets.to(data.device)\n", + " assert input.layout is Layout.Packed\n", + " return torch.nn.functional.embedding_bag(\n", + " input.data,\n", + " weight,\n", + " offsets,\n", + " max_norm,\n", + " norm_type,\n", + " scale_grad_by_freq,\n", + " mode,\n", + " sparse,\n", + " per_sample_weights,\n", + " include_last_offset)\n", + "\n", + "def nested_tensor(tensors, layout=Layout.List, dtype=None, device=None, requires_grad=False): # pin_memory could be added as a layout\n", + " \"\"\"\n", + " Given a list of Tensors, each of the same dimension but variable shape, construct a NestedTensor that represents\n", + " this list of Tensors.\n", + "\n", + " If a given entry of tensors does not match the dtype or device of the others, the result dtype or device needs to\n", + " be specified explicitly\n", + " \"\"\"\n", + " assert layout is Layout.List # No other layout support for now\n", + " assert isinstance(tensors, list)\n", + " assert len(tensors) > 0\n", + " dtype = tensors[0].dtype if dtype is None else dtype\n", + " device = tensors[0].device if device is None else device\n", + " # Change dtype and device if necessary\n", + " tensors = [t.to(device, dtype) for t in tensors]\n", + " nested_size = tuple(x.size() for x in tensors)\n", + " return NestedTensor(tensors, nested_size, Layout.List, dtype, device, requires_grad).to(layout)\n", + "\n", + "def _from_packed_sequence_to_list(packed_sequence):\n", + " padded, lengths = torch.nn.utils.rnn.pad_packed_sequence(packed_sequence, batch_first=True)\n", + " tensors = []\n", + " for i, length in enumerate(lengths):\n", + " tensors.append(padded[i, :length])\n", + " return tensors\n", + "\n", + "def as_nested_tensor(data, layout=Layout.List, dtype=None, device=None, requires_grad=False): # pin_memory could be added as a layout\n", + " \"\"\"\n", + " Similar to torch.as_tensor, this converts the given data into a NestedTensor.\n", + " \"\"\"\n", + " if isinstance(data, torch.nn.utils.rnn.PackedSequence):\n", + " return nested_tensor(_from_packed_sequence_to_list(data))\n", + " raise NotImplementedError(\"as_nested_tensor cannot convert data of type {} into a NestedTensor.\".format(type(data)))\n", + "\n", + "\n", + "def _from_list_to_layout(list_nt, target_layout):\n", + " assert list_nt.layout is Layout.List\n", + " if target_layout is Layout.List:\n", + " return list_nt\n", + " if target_layout is Layout.Masked:\n", + " max_size = [len(list_nt.data)]\n", + " for d in range(list_nt.data[0].dim()):\n", + " max_size.append(max(x.size(d) for x in list_nt.data))\n", + " # This approach doesn't support autograd and can also be used during construction or without autograd\n", + " # An approach that does work with autograd uses pad and cat, but is a bit more involved\n", + " # See https://github.com/pytorch/nestedtensor/blob/master/nestedtensor/nested/masking.py#L142 for a complete implementation\n", + " data = torch.zeros(*max_size, dtype=list_nt.dtype, device=list_nt.device)\n", + " mask = torch.zeros(*max_size, dtype=torch.bool, device=list_nt.device)\n", + " for d_t, d_m, t in zip(data, mask, list_nt.data):\n", + " for d in range(t.dim()):\n", + " d_t = d_t.narrow(d, 0, t.size(d))\n", + " d_m = d_m.narrow(d, 0, t.size(d))\n", + " d_t.copy_(t.detach())\n", + " d_m.fill_(1)\n", + " return NestedTensor(data, list_nt.nested_size(), Layout.Masked, list_nt.dtype, list_nt.device, list_nt.requires_grad, metadata=mask)\n", + " if target_layout is Layout.Packed:\n", + " offsets_ = list_nt.nested_size()\n", + " data = torch.cat([x.reshape(-1) for x in list_nt.data]) # shape information is stored in nested_size\n", + " return NestedTensor(data, list_nt.nested_size(), Layout.Packed, list_nt.dtype, list_nt.device, list_nt.requires_grad)\n", + " if target_layout is Layout.PackedSequence:\n", + " return NestedTensor(torch.nn.utils.rnn.pack_sequence(list_nt.data, enforce_sorted=False), # enforce_sorted set to False doesn't support ONNX for now,\n", + " list_nt.nested_size(),\n", + " Layout.PackedSequence,\n", + " list_nt.dtype,\n", + " list_nt.device,\n", + " list_nt.requires_grad)\n", + " raise NotImplemented(\"Converstion from list to target layout {} not supported.\".format(target_layout.name))\n", + " \n", + "class NestedTensor(object):\n", + " def __init__(self, data, nested_size, layout, dtype, device, requires_grad, metadata=None):\n", + " # Can be list of tensors, single packed or masked Tensor or PackedSequence\n", + " self.data = data\n", + " # Metadata is overloaded with type and meaning\n", + " # Masked: Stores bool mask where True means included, False means excluded\n", + " # Packed: Stores 1d Tensor of offsets. offsets are the length of each entry in the flat data. Packed currently only supports 2d NestedTensors\n", + " # PackedSequence: Stores the lengths of the PackedSequence\n", + " self.metadata = metadata\n", + " self._nested_size = nested_size\n", + " self._layout = layout\n", + " self._dtype = dtype\n", + " self._device = device\n", + " # Gradient is supported by differentiable layout conversion functions a tracked by data field\n", + " self._requires_grad = requires_grad \n", + "\n", + " def __torch_function__(self, func, types, args=(), kwargs=None):\n", + " if func is torch.nn.functional.embedding_bag:\n", + " # Design decision pending: We could make conversion to Layout.Padding automatic\n", + " return _nn_functional_embedding_bag(*args, **kwargs)\n", + " raise NotImplementedError(\"Given func {} does not support NestedTensor.\".format(func))\n", + "\n", + " def nested_size(self):\n", + " return self._nested_size\n", + "\n", + " @property\n", + " def dtype(self):\n", + " return self._dtype\n", + "\n", + " @property\n", + " def layout(self):\n", + " return self._layout\n", + "\n", + " @property\n", + " def device(self):\n", + " return self._device\n", + "\n", + " @property\n", + " def requires_grad(self):\n", + " return self._requires_grad\n", + "\n", + " # There are 5 layouts, therefore there are 20 possible\n", + " # conversions excluding identities\n", + " def to(self, target_layout):\n", + " assert isinstance(target_layout, Layout)\n", + " if self.layout is target_layout:\n", + " return self\n", + " if self.layout is Layout.List:\n", + " return _from_list_to_layout(self, target_layout)\n", + " raise NotImplementedError(\n", + " \"Cannot convert {} to desired layout {}\".format(\n", + " self.layout.name, target_layout.name))\n", + "\n", + " \n", + " def to_tensor_list(self):\n", + " # Returns a list of Tensors\n", + " return self.to(Layout.List).data\n", + "\n", + " def to_padded(self, padding_value=-1):\n", + " # Returns a Tensor padded with padding_value\n", + " converted = self.to(Layout.Masked)\n", + " return converted.data.masked_fill_(~converted.metadata, padding_value)\n", + "\n", + " def to_masked(self):\n", + " # Returns a Tensor plus a Bool mask of same shape\n", + " converted = self.to(Layout.Masked)\n", + " return converted.data, converted.mask\n", + "\n", + " def to_packed_sequence(self):\n", + " return self.to(Layout.PackedSequence).data\n", + " " + ], + "execution_count": 2, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "PtvOXIbaCgn0" + }, + "source": [ + "Let's step through an intended usecase and compare it a current application.\n", + "\n", + "The following EmbeddingBag represents a lookupt table of 10 vectors, each of dimension 3." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "MaXisU5zAOsI" + }, + "source": [ + "import torch\n", + "from torch import nn\n", + "embedding_bag = nn.EmbeddingBag(10, 3)" + ], + "execution_count": 3, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Z8rk3SfMC1Xu" + }, + "source": [ + "Let's construct a list of tensors filled with a varying degree of word ids and feed it into EmbeddingBag as we were to right now." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "YXl9dk-lDoQS" + }, + "source": [ + "sentences = [torch.tensor([0, 3, 1]), torch.tensor([5, 1, 2, 4]), torch.tensor([3, 2])]" + ], + "execution_count": 4, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Cf6bagzvCyu8", + "outputId": "b5656700-8af6-463c-e286-b5500d3f6626" + }, + "source": [ + "data = torch.cat(sentences)\n", + "offsets = torch.tensor([0] + [len(x) for x in sentences[:-1]]).cumsum(0)\n", + "print(offsets)\n", + "print(embedding_bag(data, offsets))" + ], + "execution_count": 5, + "outputs": [ + { + "output_type": "stream", + "text": [ + "tensor([0, 3, 7])\n", + "tensor([[-0.0482, 0.0242, -0.6505],\n", + " [-0.6074, 0.6866, -0.4335],\n", + " [ 0.5125, -0.1862, -0.8296]], grad_fn=)\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "cefuO5twDi3a" + }, + "source": [ + "And this is what it'll look like with NestedTensor" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Oznb-50zDXSY", + "outputId": "22581039-15b6-4296-ca30-4c7a465b287c" + }, + "source": [ + "nt = nested_tensor(sentences)\n", + "print(nt.nested_size())\n", + "embedding_bag(nt)" + ], + "execution_count": 6, + "outputs": [ + { + "output_type": "stream", + "text": [ + "(torch.Size([3]), torch.Size([4]), torch.Size([2]))\n" + ], + "name": "stdout" + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "tensor([[-0.0482, 0.0242, -0.6505],\n", + " [-0.6074, 0.6866, -0.4335],\n", + " [ 0.5125, -0.1862, -0.8296]], grad_fn=)" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 6 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "lTg0ePVkcI_L" + }, + "source": [ + "Is it going to be less efficient to first construct a NestedTensor and then convert into an operator specific data structure? If we do this automatically we have the chance of optimizing a conversion, but we also run the risk of converting prematurely or in an inefficient way. This is the usual lazy vs. eager tradeoff and the current PyTorch convention seem to lean towards automatic conversion (e.g. when given non-contiguous inputs, sparse inputs (usually) or inputs of other dtype)." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "0VHEwOBAgpQX", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "1d1021f1-52c7-4de0-f578-739886aec073" + }, + "source": [ + "print(nt.to_padded())" + ], + "execution_count": 7, + "outputs": [ + { + "output_type": "stream", + "text": [ + "tensor([[ 0, 3, 1, -1],\n", + " [ 5, 1, 2, 4],\n", + " [ 3, 2, -1, -1]])\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "Uv6gfUAriXd_", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "69454e61-91e2-4716-f01a-8a46fbe9255b" + }, + "source": [ + "print(nt.to_tensor_list())" + ], + "execution_count": 8, + "outputs": [ + { + "output_type": "stream", + "text": [ + "[tensor([0, 3, 1]), tensor([5, 1, 2, 4]), tensor([3, 2])]\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "2faLBjWOxGbl", + "outputId": "804f3be9-94af-4c9a-bf5f-baabc3cb072c" + }, + "source": [ + "rnn = nn.RNN(5, #embedding dimension\n", + " 3, 2)\n", + "h0 = torch.randn(2, 3, 3)\n", + "embeddings = [s.unsqueeze(1).repeat(1, 5) #emulating embedding\n", + " for s in sentences]\n", + "nt = nested_tensor(embeddings, dtype=torch.float)\n", + "\n", + "try:\n", + " rnn(nt) # \n", + "except AttributeError as e:\n", + " print(e)" + ], + "execution_count": 9, + "outputs": [ + { + "output_type": "stream", + "text": [ + "'NestedTensor' object has no attribute 'size'\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "17hEaYfqFEil" + }, + "source": [ + "RNN doesn't have good torch_function support, but luckily we can just convert manually into the desired format." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "3ud7ra0qE9L1", + "outputId": "2d90c9fc-b741-4891-eae6-c83358ec0aa3" + }, + "source": [ + "ps = nt.to_packed_sequence()\n", + "output, hn = rnn(ps, h0)\n", + "print(output)\n" + ], + "execution_count": 10, + "outputs": [ + { + "output_type": "stream", + "text": [ + "PackedSequence(data=tensor([[ 0.1349, -0.1506, 0.8108],\n", + " [ 0.6356, 0.2794, 0.7581],\n", + " [-0.1012, 0.3027, 0.9623],\n", + " [ 0.3990, -0.0811, 0.6990],\n", + " [ 0.0292, -0.2913, 0.7972],\n", + " [ 0.3070, -0.4692, 0.7617],\n", + " [ 0.2164, -0.0570, 0.7273],\n", + " [ 0.4771, 0.0845, 0.6256],\n", + " [-0.0036, -0.2968, 0.7427]], grad_fn=), batch_sizes=tensor([3, 3, 2, 1]), sorted_indices=tensor([1, 0, 2]), unsorted_indices=tensor([1, 0, 2]))\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "mZhjO8n9b9HS" + }, + "source": [ + "And now we use the as_nested_tensor function (similar to torch.as_tensor) to interpret the resulting value (which is also a PackedSequence) as a NestedTensor again. This is useful in particular when you're about to feed this output into a linear layer as your final projection before the loss, because you can retrieve the padded version of your output." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Hzq_EIkvb986", + "outputId": "ed1715cf-bd78-4752-b4a8-9dad0410ee79" + }, + "source": [ + "output_nt = as_nested_tensor(output)\n", + "padded_output = output_nt.to_padded(0)\n", + "print(padded_output.size())\n", + "print(padded_output)" + ], + "execution_count": 11, + "outputs": [ + { + "output_type": "stream", + "text": [ + "torch.Size([3, 4, 3])\n", + "tensor([[[ 0.6356, 0.2794, 0.7581],\n", + " [ 0.0292, -0.2913, 0.7972],\n", + " [ 0.4771, 0.0845, 0.6256],\n", + " [ 0.0000, 0.0000, 0.0000]],\n", + "\n", + " [[ 0.1349, -0.1506, 0.8108],\n", + " [ 0.3990, -0.0811, 0.6990],\n", + " [ 0.2164, -0.0570, 0.7273],\n", + " [-0.0036, -0.2968, 0.7427]],\n", + "\n", + " [[-0.1012, 0.3027, 0.9623],\n", + " [ 0.3070, -0.4692, 0.7617],\n", + " [ 0.0000, 0.0000, 0.0000],\n", + " [ 0.0000, 0.0000, 0.0000]]])\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "04IG1a8QdFy4" + }, + "source": [ + "loss = nn.NLLLoss()" + ], + "execution_count": 12, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "w6if_rHweF1b", + "outputId": "54a91253-6c99-45cf-9f6e-431eac595591" + }, + "source": [ + "targets = torch.tensor([1, 2, 1, -100, 2, 1, 1, 2, 1, 1, -100, -100])\n", + "loss(padded_output.reshape(-1, 3), targets)" + ], + "execution_count": 13, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "tensor(-0.2678)" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 13 + } + ] + } + ] +} \ No newline at end of file diff --git a/benchmarks/classy.py b/benchmarks/classy.py new file mode 100644 index 00000000..7f6cb557 --- /dev/null +++ b/benchmarks/classy.py @@ -0,0 +1,85 @@ +import torch +import numpy as np +import time +import random +import nestedtensor +from classy_vision.models import build_model + + +@torch.inference_mode() +def benchmark_torch_function(iters, f, *args, **kwargs): + f(*args, **kwargs) + if torch.cuda.is_available(): + torch.cuda.synchronize() + start_event = torch.cuda.Event(enable_timing=True) + end_event = torch.cuda.Event(enable_timing=True) + start_event.record() + else: + t0 = time.time() + for _ in range(iters): + f(*args, **kwargs) + if torch.cuda.is_available(): + end_event.record() + torch.cuda.synchronize() + return start_event.elapsed_time(end_event) + else: + return (time.time() - t0) + + +@torch.inference_mode() +def run_benchmark(iters, shapes, model, model_name, bsz): + ts = [] + for s in shapes: + inp = torch.randn(*s, dtype=torch.half).cuda() + ts.append(inp) + ts_nt = nestedtensor.nested_tensor([t.squeeze(0) for t in ts], device=torch.device('cuda'), dtype=torch.half) + ts_padded = ts_nt.to_padded_tensor() + ts_nt = nestedtensor.nested_tensor([t.squeeze(0) for t in ts], device=torch.device('cuda'), dtype=torch.half, channels_last=True) + + def _loop(): + model_outputs = [] + for inp in ts: + model_outputs.append(model(inp)) + return model_outputs + + def _padded(): + return model(ts_padded) + + # Test + outputs_nt = model(ts_nt) + # import time; time.sleep(1) + # outputs_nt = model(ts_nt) + # import sys; sys.exit(1) + model_outputs = _loop() + for mo, ntmo in zip(model_outputs, outputs_nt.unbind()): + # Using float16 tolerances from torch/testing/_core.yp + assert torch.allclose(mo.squeeze(0), ntmo, rtol=1e-3, atol=1e-3) + + loop_time = benchmark_torch_function(iters, _loop) + padded_time = benchmark_torch_function(iters, _padded) + nt_time = benchmark_torch_function(iters, lambda: model(ts_nt)) + + shapes_2_array = np.array([s[2] for s in shapes]) + shapes_3_array = np.array([s[3] for s in shapes]) + print(f"model_name: {model_name.rjust(18)},", end='') + print(f" bsz: {bsz:3.0f},", end='') + print(f" mean±std shapes[2]: {shapes_2_array.mean():.2f}±{shapes_2_array.std():.2f},", end='') + print(f" mean±std shapes[3]: {shapes_3_array.mean():.2f}±{shapes_3_array.std():.2f},", end='') + print(f" padded_size: {tuple(ts_padded.size())},", end='') + print(f" loop: {loop_time / iters:7.2f}ms, nt: {nt_time / iters:7.2f}ms, padded: {padded_time / iters:7.2f}ms, speedup: {loop_time / nt_time:.2f}x") + +if __name__ == "__main__": + iters = 10 + + def _benchmark(model_name, bsz): + model = build_model({"name": model_name}) + model = model.cuda().half().eval() + random.seed(123) + shapes = [(1, 3, random.randint(100, 600), random.randint(100, 600)) for _ in range(bsz)] + run_benchmark(iters, shapes, model, model_name, bsz) + + for bsz in [16, 32, 64, 128]: + _benchmark("resnext101_32x4d", bsz) + + for bsz in [16, 32]: + _benchmark("regnet_y_128gf", bsz) diff --git a/benchmarks/conv2d.py b/benchmarks/conv2d.py new file mode 100644 index 00000000..d1e1f0c9 --- /dev/null +++ b/benchmarks/conv2d.py @@ -0,0 +1,63 @@ +import torch +import time +import nestedtensor + + +@torch.inference_mode() +def benchmark_torch_function(iters, f, *args): + f(*args) + if torch.cuda.is_available(): + torch.cuda.synchronize() + start_event = torch.cuda.Event(enable_timing=True) + end_event = torch.cuda.Event(enable_timing=True) + start_event.record() + else: + t0 = time.time() + for _ in range(iters): + f(*args) + if torch.cuda.is_available(): + end_event.record() + torch.cuda.synchronize() + return start_event.elapsed_time(end_event) + else: + return (time.time() - t0) * 1e3 + + +# def run(bdim, embedding_dim, out_dim, min_t, max_t, iters, device): +def run(bdim, nchannel, min_t, max_t, iters, device): + import random + random.seed(1010) + + # The following is meant to emulate the lenghts of randomly sampled tokenized sentences + lengths1 = [random.randint(min_t, max_t) for _ in range(bdim)] + lengths2 = [random.randint(min_t, max_t) for _ in range(bdim)] + + # List of sentence embeddings + tensors = [torch.rand(nchannel, l1, l2).to(device=device, dtype=torch.float) for (l1, l2) in zip(lengths1, lengths2)] + # Create packed NestedTensor + nt = nestedtensor.nested_tensor(tensors, device=device, dtype=torch.float) + + lin = torch.nn.Conv2d(nchannel, nchannel, (1, 1), bias=False).to(device) + + def _loop(tensors): + result = [] + for t in tensors: + result.append(lin(t.unsqueeze(0)).squeeze(0)) + return result + + nt_time = benchmark_torch_function(iters, lin, nt) + t_time = benchmark_torch_function(iters, _loop, tensors) + + # print(f"batch size: {bdim:4.0f}, embedding dim: {embedding_dim}, out_dim: {out_dim}, T mean:{lengths_mean:5.0f}, T std: {lengths_std:4.0f}", end='') + print(f"batch size: {bdim:4.0f}, nchannel: {nchannel:4.0f}", end='') + # print(f", padding: {percentage_padded:3.0f}%, NT: {nt_time/iters:4.0f}ms, T: {t_time/iters:4.0f}ms, Speedup: {t_time/nt_time:3.2f}x") + print(f", NT: {nt_time/iters:4.0f}ms, T: {t_time/iters:4.0f}ms, Speedup: {t_time/nt_time:3.2f}x") + + +if torch.cuda.is_available(): + print("CUDA device: ", torch.cuda.get_device_name(0)) +iters = 10 +for nchannel in [3, 128, 256, 512]: + for min_t, max_t in [(16, 128), (32, 128), (64, 128), (128, 128)]: + run(256, nchannel, min_t, max_t, iters, torch.device('cuda')) + break diff --git a/benchmarks/embedding.py b/benchmarks/embedding.py new file mode 100644 index 00000000..c2e6fee4 --- /dev/null +++ b/benchmarks/embedding.py @@ -0,0 +1,64 @@ +import torch +import time +import nestedtensor + + +@torch.inference_mode() +def benchmark_torch_function(iters, f, *args): + f(*args) + if torch.cuda.is_available(): + torch.cuda.synchronize() + start_event = torch.cuda.Event(enable_timing=True) + end_event = torch.cuda.Event(enable_timing=True) + start_event.record() + else: + t0 = time.time() + for _ in range(iters): + f(*args) + if torch.cuda.is_available(): + end_event.record() + torch.cuda.synchronize() + return start_event.elapsed_time(end_event) * 1e3 + else: + return (time.time() - t0) * 1e6 + + +def run(bdim, embedding_dim, vocab_size, min_t, max_t, iters, device): + import random + random.seed(1010) + + # The following is meant to emulate the lenghts of randomly sampled tokenized sentences + lengths = [random.randint(min_t, max_t) for _ in range(bdim)] + lengths_mean = torch.tensor(lengths, dtype=torch.float).mean().item() + lengths_std = torch.tensor(lengths, dtype=torch.float).std().item() + + # List of sentence embeddings + tensors = [torch.tensor(random.randint(1, vocab_size)) for i in lengths] + # Create packed NestedTensor + nt = nestedtensor.nested_tensor(tensors, device=device, dtype=torch.int64) + # Created regular padded Tensor + data, _ = nt.to_tensor_mask() + data = data.to(torch.int64) + # Amount of storage used for padding only + percentage_padded = 100 * (data.numel() - nt.numel()) / data.numel() + + # Projects embeddings into another space + lin = torch.nn.Embedding(vocab_size, embedding_dim, padding_idx=0).to(device) + nt_time = benchmark_torch_function(iters, lin, nt) + t_time = benchmark_torch_function(iters, lin, data) + + print(f"batch size: {bdim:4.0f}, embedding dim: {embedding_dim}, vocab_size: {vocab_size}, T mean:{lengths_mean:5.0f}, T std: {lengths_std:4.0f}", end='') + print(f", padding: {percentage_padded:3.0f}%, NT: {nt_time/iters:4.0f}us, T: {t_time/iters:4.0f}us, Speedup: {t_time/nt_time:3.2f}x") + + +device = torch.device('cpu') +if torch.cuda.is_available(): + print("CUDA device: ", torch.cuda.get_device_name(0)) + device = torch.device('cuda') +iters = 100 +for vocab_size in [65536, 32768, 16384, 8192, 4096]: + print("") + for embed_dim in [4096, 2048, 1024, 512, 256]: + print("") + for min_t, max_t in [(16, 128), (32, 128), (64, 128), (128, 128)]: + run(256, embed_dim, vocab_size, min_t, max_t, iters, device) diff --git a/benchmarks/gat.py b/benchmarks/gat.py new file mode 100644 index 00000000..514c8007 --- /dev/null +++ b/benchmarks/gat.py @@ -0,0 +1,110 @@ +import torch +import torch.nn.functional as F +from torch_geometric.nn import GATConv +import random +import time +import nestedtensor +from nestedtensor import nested_tensor as ntnt + +@torch.inference_mode() +def benchmark_torch_function(iters, f, *args, **kwargs): + f(*args, **kwargs) + if torch.cuda.is_available(): + torch.cuda.synchronize() + start_event = torch.cuda.Event(enable_timing=True) + end_event = torch.cuda.Event(enable_timing=True) + start_event.record() + else: + t0 = time.time() + for _ in range(iters): + f(*args, **kwargs) + if torch.cuda.is_available(): + end_event.record() + torch.cuda.synchronize() + return start_event.elapsed_time(end_event) + else: + return (time.time() - t0) + + +num_features = 1433 +num_classes = 7 + + +class Net(torch.nn.Module): + def __init__(self): + super(Net, self).__init__() + self.conv1 = GATConv(num_features, 8, heads=8, + dropout=0.6) + + self.conv2 = GATConv(64, num_classes, heads=1, concat=True, + dropout=0.6) + + def forward(self, x, edge_index): + x = F.dropout(x, p=0.6, training=self.training) + x = F.elu(self.conv1(x, edge_index)) + x = F.dropout(x, p=0.6, training=self.training) + x = self.conv2(x, edge_index) + return F.log_softmax(x, dim=1) + + +class NTNet(torch.nn.Module): + def __init__(self): + super(NTNet, self).__init__() + self.conv1 = GATConv(num_features, 8, heads=8, + dropout=0.6) + + self.conv2 = GATConv(64, num_classes, heads=1, concat=True, + dropout=0.6) + + def forward(self, x, edge_index): + x = F.dropout(x, p=0.6, training=self.training) + x = ntnt([self.conv1(xi, edge_index_i) for (xi, edge_index_i) in zip(x.unbind(), edge_index.unbind())], dtype=x.dtype, device=x.device) + x = F.elu(x) + x = F.dropout(x, p=0.6, training=self.training) + x = ntnt([self.conv2(xi, edge_index_i) for (xi, edge_index_i) in zip(x.unbind(), edge_index.unbind())], dtype=x.dtype, device=x.device) + return F.log_softmax(x, dim=1) + + +def create_models(device): + model = Net().to(device).eval() + nt_model = NTNet().to(device).eval() + return model, nt_model + +def create_tensors(): + random.seed(1010) + nnodes_list = [] + nedges_list = [] + for i in range(50): + nnodes_list.append(random.randint(100, 4000)) + nedges_list.append(random.randint(8000, 15000)) + + tensors_x = [] + tensors_edge_index = [] + for nnodes, nedges in zip(nnodes_list, nedges_list): + x = torch.normal(-10, 4, (nnodes, 1433)) + x[x < 0] = 0. + x[x > 1] = 1. + edge_index = torch.randint(0, nnodes, (2, nedges), dtype=torch.int64) + tensors_x.append(x) + tensors_edge_index.append(edge_index) + return tensors_x, tensors_edge_index + + +@torch.inference_mode() +def loop(model, tensors_x, tensors_edge_index): + for x, edge_index in zip(tensors_x, tensors_edge_index): + model(x, edge_index) + + +@torch.inference_mode() +def nt(nt_model, nt_x, nt_edge_index): + nt_model(nt_x, nt_edge_index) + +if __name__ == "__main__": + device = torch.device('cuda') + model, nt_model = create_models(device) + tensors_x, tensors_edge_index = create_tensors() + print(benchmark_torch_function(10, loop, model, tensors_x, tensors_edge_index)) + nt_x = ntnt(tensors_x, device=device) + nt_edge_index = ntnt(tensors_edge_index, device=device, dtype=torch.int64) + print(benchmark_torch_function(10, nt, nt_model, nt_x, nt_edge_index)) diff --git a/benchmarks/linear.py b/benchmarks/linear.py new file mode 100644 index 00000000..98e3d36c --- /dev/null +++ b/benchmarks/linear.py @@ -0,0 +1,61 @@ +import torch +import time +import nestedtensor + + +@torch.inference_mode() +def benchmark_torch_function(iters, f, *args): + f(*args) + if torch.cuda.is_available(): + torch.cuda.synchronize() + start_event = torch.cuda.Event(enable_timing=True) + end_event = torch.cuda.Event(enable_timing=True) + start_event.record() + else: + t0 = time.time() + for _ in range(iters): + f(*args) + if torch.cuda.is_available(): + end_event.record() + torch.cuda.synchronize() + return start_event.elapsed_time(end_event) + else: + return (time.time() - t0) * 1e3 + + +def run(bdim, embedding_dim, out_dim, min_t, max_t, iters, device): + import random + random.seed(1010) + + # The following is meant to emulate the lenghts of randomly sampled tokenized sentences + lengths = [random.randint(min_t, max_t) for _ in range(bdim)] + lengths_mean = torch.tensor(lengths, dtype=torch.float).mean().item() + lengths_std = torch.tensor(lengths, dtype=torch.float).std().item() + + # List of sentence embeddings + tensors = [torch.rand(i, embedding_dim) for i in lengths] + # Create packed NestedTensor + nt = nestedtensor.nested_tensor(tensors, device=device, dtype=torch.float) + # Created regular padded Tensor + data = nt.to_padded_tensor(padding=0) + # Amount of storage used for padding only + percentage_padded = 100 * (data.numel() - nt.numel()) / data.numel() + + # Projects embeddings into another space + lin = torch.nn.Linear(embedding_dim, out_dim).to(device) + nt_time = benchmark_torch_function(iters, lin, nt) + t_time = benchmark_torch_function(iters, lin, data) + + print(f"batch size: {bdim:4.0f}, embedding dim: {embedding_dim}, out_dim: {out_dim}, T mean:{lengths_mean:5.0f}, T std: {lengths_std:4.0f}", end='') + print(f", padding: {percentage_padded:3.0f}%, NT: {nt_time/iters:4.0f}ms, T: {t_time/iters:4.0f}ms, Speedup: {t_time/nt_time:3.2f}x") + + +if torch.cuda.is_available(): + print("CUDA device: ", torch.cuda.get_device_name(0)) +iters = 10 +for out_dim in [4096, 2048, 1024, 512, 256]: + print("") + for embed_dim in [4096, 2048, 1024, 512, 256]: + print("") + for min_t, max_t in [(16, 128), (32, 128), (64, 128), (128, 128)]: + run(256, embed_dim, out_dim, min_t, max_t, iters, torch.device('cuda')) diff --git a/benchmarks/matmul.py b/benchmarks/matmul.py index 27717fd4..90786fd8 100644 --- a/benchmarks/matmul.py +++ b/benchmarks/matmul.py @@ -5,47 +5,35 @@ import random random.seed(1010) +BDIM=10 + # Performance tanks hard for lots of small Tensors as expected RAND_INTS = [random.randint(10, 30) for _ in range(2000)] -RAND_INTS = [random.randint(1000, 3000) for _ in range(20)] -TENSORS0 = [torch.rand(9, 245, 2560, requires_grad=True).cuda() for i in RAND_INTS] -TENSORS1 = [torch.rand(9, 2560, 245, requires_grad=True).cuda() for i in RAND_INTS] +OUTDIM=256 + +TENSORS0 = [torch.rand(i, OUTDIM).cuda() for i in RAND_INTS] def gen_t_matmul(): - tensor0 = torch.stack(TENSORS0) - tensor1 = torch.stack(TENSORS1) + nt0 = nestedtensor.nested_tensor(TENSORS0, device=torch.device('cuda'), dtype=torch.float) + data, _ = nt0.to_tensor_mask() + t1 = torch.randn(OUTDIM, 512).cuda() def t(): - tensor0.requires_grad_() - tensor1.requires_grad_() - torch.matmul(tensor0, tensor1).sum().backward() - tensor0.detach_() - tensor1.detach_() + torch.matmul(data, t1) return t -def gen_t_loop_matmul(): - tensors = [torch.rand(i, 2560).cuda() for i in RAND_INTS] - - def t_loop(): - for (t0, t1) in zip(TENSORS0, TENSORS1): - torch.matmul(t0, t1).sum().backward() - t0.grad = None - t1.grad = None - return t_loop - - +@torch.inference_mode() def gen_nt_matmul(): - nt0 = nestedtensor.nested_tensor(TENSORS0, device=torch.device('cuda'), dtype=torch.float, requires_grad=True) - nt1 = nestedtensor.nested_tensor(TENSORS1, device=torch.device('cuda'), dtype=torch.float, requires_grad=True) + nt0 = nestedtensor.nested_tensor(TENSORS0, device=torch.device('cuda'), dtype=torch.float) + t1 = torch.randn(OUTDIM, 512).cuda() def nt(): - torch.matmul(nt0, nt1).sum().backward() + torch.matmul(nt0, t1) return nt if __name__ == "__main__": - # print(utils.benchmark_fn(gen_t_matmul())) - # print(utils.benchmark_fn(gen_t_loop_matmul())) + print(utils.benchmark_fn(gen_t_matmul())) print(utils.benchmark_fn(gen_nt_matmul())) diff --git a/benchmarks/mha.py b/benchmarks/mha.py index 22332e62..1a592e2d 100644 --- a/benchmarks/mha.py +++ b/benchmarks/mha.py @@ -53,7 +53,7 @@ def from_tensor_list(cls, tensor_list): MODEL = torch.nn.MultiheadAttention(NDIM, NHEAD).to(DEVICE).eval() -def run_benchmark(bsz, mean_i, mean_j, var, autograd, writer): +def run_benchmark(bsz, mean_i, mean_j, var, writer): RAND_INTS = [(int(random.gauss(mean_j, var)), int( random.gauss(mean_i, var))) for _ in range(bsz)] src_ = nestedtensor.nested_tensor( @@ -70,13 +70,8 @@ def gen_t_loop_mha(src): src, mask = detr_nt_src.decompose() src = src.flatten(2).permute(2, 0, 1).contiguous() mask = mask.flatten(1).contiguous() - if autograd: - src.requires_grad_() def te(): - if autograd: - MODEL(src, src, src, key_padding_mask=mask, - need_weights=False)[0].sum().backward() MODEL(src, src, src, key_padding_mask=mask, need_weights=False) @@ -84,26 +79,26 @@ def te(): def gen_nt_mha(src): src = nestedtensor.nested_tensor([t.flatten(1).permute( - 1, 0) for t in src], device=DEVICE, dtype=torch.float, requires_grad=True) + 1, 0) for t in src], device=DEVICE, dtype=torch.float) def nt(): - if autograd: - MODEL(src, src, src, need_weights=False)[0].sum().backward() MODEL(src, src, src, need_weights=False) return nt result_t = {**utils.benchmark_fn(gen_t_loop_mha(src), 5.0, cuda=True), "bsz": bsz, - "sparsity": sparsity, "autograd": autograd, "var": var, "mean_i": mean_i, "mean_j": mean_j} + "sparsity": sparsity, "var": var, "mean_i": mean_i, "mean_j": mean_j} result_t["numel"] = sum([x.numel() for x in src_]) - result_t["numel_div_avg_us"] = result_t["numel"] / result_t["avg_us"] - result_t["avg_ns_div_numel"] = result_t["avg_us"] / result_t["numel"] * 1000 + result_t["numel_div_avg_us"] = result_t["numel"] / result_t["avg_us"] + result_t["avg_ns_div_numel"] = result_t["avg_us"] / \ + result_t["numel"] * 1000 writer.writerow(result_t) result_nt = {**utils.benchmark_fn(gen_nt_mha(src), 5.0, cuda=True), - "bsz": bsz, "sparsity": 0.0, "autograd": autograd, "var": var, "mean_i": mean_i, "mean_j": mean_j} + "bsz": bsz, "sparsity": 0.0, "var": var, "mean_i": mean_i, "mean_j": mean_j} result_nt["numel"] = sum([x.numel() for x in src_]) - result_nt["numel_div_avg_us"] = result_nt["numel"] / result_nt["avg_us"] - result_nt["avg_ns_div_numel"] = result_nt["avg_us"] / result_nt["numel"] * 1000 + result_nt["numel_div_avg_us"] = result_nt["numel"] / result_nt["avg_us"] + result_nt["avg_ns_div_numel"] = result_nt["avg_us"] / \ + result_nt["numel"] * 1000 writer.writerow(result_nt) @@ -112,10 +107,9 @@ def nt(): torch.manual_seed(1011) writer = csv.DictWriter(sys.stdout, fieldnames=[ "name", "avg_us", "std_us", "runs", "bsz", "sparsity", - "autograd", "var", "mean_i", "mean_j", "numel", "numel_div_avg_us", + "var", "mean_i", "mean_j", "numel", "numel_div_avg_us", "avg_ns_div_numel"]) writer.writeheader() for var in [float(i) / 10 for i in range(0, 100, 50)]: - for autograd in [True, False]: - for batch_size in [2, 8, 16]: - run_benchmark(batch_size, 30, 30, var, autograd, writer) + for batch_size in [2, 8, 16]: + run_benchmark(batch_size, 30, 30, var, writer) diff --git a/benchmarks/mha_cuda.py b/benchmarks/mha_cuda.py new file mode 100644 index 00000000..12311df6 --- /dev/null +++ b/benchmarks/mha_cuda.py @@ -0,0 +1,83 @@ +import torch +import time +import nestedtensor + + +@torch.inference_mode() +def benchmark_torch_function(iters, f, *args, **kwargs): + f(*args, **kwargs) + if torch.cuda.is_available(): + torch.cuda.synchronize() + start_event = torch.cuda.Event(enable_timing=True) + end_event = torch.cuda.Event(enable_timing=True) + start_event.record() + else: + t0 = time.time() + for _ in range(iters): + f(*args, **kwargs) + if torch.cuda.is_available(): + end_event.record() + torch.cuda.synchronize() + return start_event.elapsed_time(end_event) * 1e3 + else: + return (time.time() - t0) * 1e6 + + +def run(bdim, embedding_dim, nhead, min_t, max_t, iters, device): + import random + random.seed(1010) + + # The following is meant to emulate the lenghts of randomly sampled tokenized sentences + lengths = [random.randint(min_t, max_t) for _ in range(bdim)] + lengths_mean = torch.tensor(lengths, dtype=torch.float).mean().item() + lengths_std = torch.tensor(lengths, dtype=torch.float).std().item() + + # List of sentence embeddings + tensors = [torch.rand(i, embedding_dim) for i in lengths] + # Create packed NestedTensor + nt = nestedtensor.nested_tensor(tensors, device=device, dtype=torch.float) + + # Create MHA with self-attention in mind + mha = torch.nn.MultiheadAttention(embedding_dim, nhead).to(device).eval() + + # Create regular padded Tensor with corresponding mask + data, mask = nt.to_tensor_mask(mask_dim=2) + # Prepare input for torch.nn.MHA, which is batch second for Tensor input + data = data.transpose(0, 1) + not_mask = torch.logical_not(mask) + + # Comparison test to show correctness and API differences + with torch.inference_mode(): + nt_output, _ = mha(nt, nt, nt, need_weights=False) + t_output, _ = mha(data, data, data, key_padding_mask=not_mask, need_weights=False) + nt_output_padded = nt_output.to_padded_tensor(padding=0) + t_output = t_output.transpose(0, 1) + # Fill in zero for masked-out values to enable comparison + t_output = t_output * mask.unsqueeze(-1) + # Tolerances taken from torch/testing/_core.py + assert torch.isclose(nt_output_padded, t_output, rtol=1e-4, atol=1e-5).all().item() + + # Time NT version + nt_time = benchmark_torch_function(iters, mha, nt, nt, nt, need_weights=False) + + # Amount of storage used for padding only + percentage_padded = 100 * (data.numel() - nt.numel()) / data.numel() + + # Time Tensor version + t_time = benchmark_torch_function(iters, mha, data, data, data, key_padding_mask=not_mask, need_weights=False) + + print(f"batch size: {bdim:4.0f}, embedding dim: {embedding_dim}, nhead: {nhead}, T mean:{lengths_mean:5.0f}, T std: {lengths_std:4.0f}", end='') + print(f", padding: {percentage_padded:3.0f}%, NT: {nt_time/iters:4.0f}us, T: {t_time/iters:4.0f}us, Speedup: {t_time/nt_time:3.2f}x") + + +device = torch.device('cpu') +if torch.cuda.is_available(): + print("CUDA device: ", torch.cuda.get_device_name(0)) + device = torch.device('cuda') +iters = 10 +for nhead in [2, 4, 8]: + print("") + for embed_dim in [1024, 512, 256, 128]: + print("") + for min_t, max_t in [(16, 128), (32, 128), (64, 128), (128, 128)]: + run(256, embed_dim, nhead, min_t, max_t, iters, device) diff --git a/benchmarks/segmentation_layers.py b/benchmarks/segmentation_layers.py index 8d508377..e89136fd 100644 --- a/benchmarks/segmentation_layers.py +++ b/benchmarks/segmentation_layers.py @@ -302,7 +302,7 @@ def run(self): var_params = itertools.product(self.args.HV, self.args.WV) params = [[p + v for v in var_params] for p in params] params = sum(params, []) - + writer = None i = 0 for cuda, n, c, h, w, seed, h_var, w_var in params: @@ -344,7 +344,7 @@ def get_input(self, cuda, n, c, h, w, h_var, w_var, seed): random.seed(seed) if cuda: torch.cuda.init() - for i in range(n): + for _ in range(n): h_res = max(1, int(random.gauss(h, h_var))) w_res = max(1, int(random.gauss(w, w_var))) input_i = torch.randn(c, h_res, w_res, device=device) diff --git a/benchmarks/utils.py b/benchmarks/utils.py index 711e197d..0934f219 100644 --- a/benchmarks/utils.py +++ b/benchmarks/utils.py @@ -1,9 +1,9 @@ -from nestedtensor import torch +import torch import time -import random -import pprint -import cProfile, pstats, io +import cProfile +import pstats +import io from pstats import SortKey EMBED_DIM = 256 @@ -16,7 +16,8 @@ def gen_tensor(): # return torch.tensor([globals()['SEED']]) return torch.rand(EMBED_DIM) -def benchmark_fn(fn, run_time = 5.0, use_cprofile=False, warmup=1.0, cuda=False): + +def benchmark_fn(fn, run_time=5.0, use_cprofile=False, warmup=1.0, cuda=False): times = [] t = 0.0 pr = cProfile.Profile() diff --git a/build_tools/travis/after_success.sh b/build_tools/travis/after_success.sh deleted file mode 100644 index 5f672c0d..00000000 --- a/build_tools/travis/after_success.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash -# This script is meant to be called by the "after_success" step defined in -# .travis.yml. See http://docs.travis-ci.com/ for more details. - -set -e - -if [[ "$COVERAGE" == "true" ]]; then - # Ignore codecov failures as the codecov server is not - # very reliable but we don't want travis to report a failure - # in the github UI just because the coverage report failed to - # be published. - codecov || echo "codecov upload failed" -fi diff --git a/build_tools/travis/install.sh b/build_tools/travis/install.sh deleted file mode 100644 index dccff358..00000000 --- a/build_tools/travis/install.sh +++ /dev/null @@ -1,60 +0,0 @@ -#!/bin/bash -# This script is meant to be called by the "install" step defined in -# .travis.yml. See http://docs.travis-ci.com/ for more details. -# The behavior of the script is controlled by environment variabled defined -# in the .travis.yml in the top level folder of the project. - -set -e - -echo 'List files from cached directories' -if [ -d $HOME/download ]; then - echo 'download:' - ls $HOME/download -fi -if [ -d $HOME/.cache/pip ]; then - echo 'pip:' - ls $HOME/.cache/pip -fi - -# Deactivate the travis-provided virtual environment and setup a -# conda-based environment instead -deactivate - -# Add the miniconda bin directory to $PATH -export PATH=/home/travis/miniconda3/bin:$PATH -echo $PATH - -# Use the miniconda installer for setup of conda itself -pushd . -cd -mkdir -p download -cd download -if [[ ! -f /home/travis/miniconda3/bin/activate ]] -then - if [[ ! -f miniconda.sh ]] - then - wget http://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh \ - -O miniconda.sh - fi - chmod +x miniconda.sh && ./miniconda.sh -b -f - conda update --yes conda - echo "Creating environment to run tests in." - conda create -n testenv --yes python="$PYTHON_VERSION" -fi -cd .. -popd - -# Activate the python environment we created. -source activate testenv - -# Install requirements via pip in our conda environment -pip install -r requirements.txt - -# Install the following only if running tests -if [[ "$SKIP_TESTS" != "true" ]]; then - # PyTorch - conda install --yes pytorch torchvision -c pytorch - - # Installation - python setup.py install -fi diff --git a/build_tools/travis/test_script.sh b/build_tools/travis/test_script.sh deleted file mode 100644 index a469ca4b..00000000 --- a/build_tools/travis/test_script.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/bash -# This script is meant to be called by the "script" step defined in -# .travis.yml. See http://docs.travis-ci.com/ for more details. -# The behavior of the script is controlled by environment variabled defined -# in the .travis.yml in the top level folder of the project. - -set -e - -python --version - -run_tests() { - if [[ "$RUN_SLOW" == "true" ]]; then - TEST_CMD="py.test --runslow -s -v --cov=nestedtensor --durations=20" - else - TEST_CMD="py.test -v --cov=nestedtensor --durations=20" - fi - $TEST_CMD -} - -if [[ "$RUN_FLAKE8" == "true" ]]; then - flake8 -fi - -if [[ "$SKIP_TESTS" != "true" ]]; then - run_tests -fi diff --git a/examples/basic.ipynb b/examples/basic.ipynb deleted file mode 100644 index fbcd810d..00000000 --- a/examples/basic.ipynb +++ /dev/null @@ -1,904 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Basic properties of NestedTensor\n", - "\n", - "This notebook illustries some of the basic properties of NestedTensor such as dim, size and nested_size." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import torch\n", - "import nestedtensor\n", - "from IPython.display import Markdown, display\n", - "\n", - "def print_eval(s):\n", - " colorS = \"$ {}\".format(s)\n", - " display(Markdown('**{}**'.format(colorS))) \n", - " print('{}\\n'.format(str(eval(s))))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Imagine the following is a collection of Grey-scale images. The NestedTensor represents a list with two entries. The first entry of that list is a list of two images, the second entry of that list is a list with one image." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "**$ nt**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "nested_tensor([\n", - "\t[\n", - "\t\ttensor([[0.1525, 0.9457, 0.8438],\n", - "\t\t [0.6784, 0.9376, 0.5344]]),\n", - "\t\ttensor([[0.5654, 0.6054, 0.2726, 0.8868, 0.3417],\n", - "\t\t [0.1225, 0.4104, 0.9022, 0.6978, 0.2081],\n", - "\t\t [0.5641, 0.2983, 0.7589, 0.5495, 0.1304],\n", - "\t\t [0.1999, 0.3803, 0.0336, 0.4855, 0.9838]])\n", - "\t],\n", - "\t[\n", - "\t\ttensor([[0.8105, 0.6778]])\n", - "\t]\n", - "])\n", - "\n" - ] - } - ], - "source": [ - "nt = nestedtensor.nested_tensor(\n", - " [\n", - " [\n", - " torch.rand(2, 3),\n", - " torch.rand(4, 5)\n", - " ],\n", - " [\n", - " torch.rand(1, 2)\n", - " ]\n", - " ])\n", - "print_eval(\"nt\")" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "**$ nt.nested_dim()**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2\n", - "\n" - ] - }, - { - "data": { - "text/markdown": [ - "**$ nt.tensor_dim()**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2\n", - "\n" - ] - }, - { - "data": { - "text/markdown": [ - "**$ nt.dim()**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "4\n", - "\n" - ] - }, - { - "data": { - "text/markdown": [ - "**$ nt2.nested_dim()**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2\n", - "\n" - ] - }, - { - "data": { - "text/markdown": [ - "**$ nt2.tensor_dim()**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1\n", - "\n" - ] - }, - { - "data": { - "text/markdown": [ - "**$ nt2.dim()**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "3\n", - "\n" - ] - } - ], - "source": [ - "# Every non-empty NestedTensor is of at least dimension one, because it must represent at least a list.\n", - "# For each level lists with list entries added we increase the nested dimension by one. That means\n", - "# this NestedTensor is of dimension two.\n", - "print_eval(\"nt.nested_dim()\")\n", - "\n", - "# The tensor dimension is two, because the Tensor constiuents are of dimension two.\n", - "print_eval(\"nt.tensor_dim()\")\n", - "\n", - "# The dimension is four, because it is the sum of the nested and tensor dimension.\n", - "print_eval(\"nt.dim()\")\n", - "\n", - "# Additional example\n", - "a = torch.tensor([1])\n", - "b = torch.tensor([[2, 2],\n", - " [3, 3],\n", - " [4, 4],\n", - " [5, 5]])\n", - "nt2 = nestedtensor.nested_tensor([[a],[b]])\n", - "print_eval(\"nt2.nested_dim()\")\n", - "print_eval(\"nt2.tensor_dim()\")\n", - "print_eval(\"nt2.dim()\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**nested_size, size and len()** should be part of the bread and butter of a NestedTensor user.\n", - "\n", - "Therefore it is important to understand these concepts well.\n", - "\n", - "NestedTensor.nested_size is defined as the result of recusrively mapping ```lambda x: x.size()``` onto a NestedTensor's tensor constiuents. Or more loosely defined, it is the result of replacing the Tensor constiuents by their size.\n", - "\n", - "NestedTensor.nested_size optionally also accepts a dim argument. This will return a slice across the given dimension. This might be easiest explain via below example.\n", - "\n", - "nt.nested_size(0) returns the length of nt or the number of entries in the list it represents. This is very similar to ```list.__len__```.\n", - "\n", - "nt.nested_size(1) returns the length of the entries of the outer list.\n", - "\n", - "nt.nested_size(2) returns the first entry of each Tensor constiuent's size. \n", - "\n", - "nt.nested_size(3) returns the second entry of each Tensor constiuent's size.\n", - "\n", - "We will soon define .size and unbind which will make the definition of this even clearer. We will also show some examples that justify these methods.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "scrolled": false - }, - "outputs": [ - { - "data": { - "text/markdown": [ - "**$ nt**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "nested_tensor([\n", - "\t[\n", - "\t\ttensor([[0.1525, 0.9457, 0.8438],\n", - "\t\t [0.6784, 0.9376, 0.5344]]),\n", - "\t\ttensor([[0.5654, 0.6054, 0.2726, 0.8868, 0.3417],\n", - "\t\t [0.1225, 0.4104, 0.9022, 0.6978, 0.2081],\n", - "\t\t [0.5641, 0.2983, 0.7589, 0.5495, 0.1304],\n", - "\t\t [0.1999, 0.3803, 0.0336, 0.4855, 0.9838]])\n", - "\t],\n", - "\t[\n", - "\t\ttensor([[0.8105, 0.6778]])\n", - "\t]\n", - "])\n", - "\n" - ] - }, - { - "data": { - "text/markdown": [ - "**$ nt.nested_size()**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "torch.NestedSize((\n", - "\t(\n", - "\t\ttorch.Size([2, 3]),\n", - "\t\ttorch.Size([4, 5])\n", - "\t),\n", - "\t(\n", - "\t\ttorch.Size([1, 2])\n", - "\t)\n", - "))\n", - "\n" - ] - }, - { - "data": { - "text/markdown": [ - "**$ len(nt)**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2\n", - "\n" - ] - }, - { - "data": { - "text/markdown": [ - "**$ nt.nested_size(0)**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2\n", - "\n" - ] - }, - { - "data": { - "text/markdown": [ - "**$ nt.nested_size(1)**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(2, 1)\n", - "\n" - ] - }, - { - "data": { - "text/markdown": [ - "**$ nt.nested_size(2)**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "((2, 4), (1,))\n", - "\n" - ] - }, - { - "data": { - "text/markdown": [ - "**$ nt.nested_size(3)**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "((3, 5), (2,))\n", - "\n" - ] - } - ], - "source": [ - "print_eval(\"nt\")\n", - "print_eval(\"nt.nested_size()\")\n", - "print_eval(\"len(nt)\")\n", - "print_eval(\"nt.nested_size(0)\")\n", - "print_eval(\"nt.nested_size(1)\")\n", - "print_eval(\"nt.nested_size(2)\")\n", - "print_eval(\"nt.nested_size(3)\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**NestedTensor.size** is a function that returns a tuple of the format\n", - "(n_1, n_2, ..., n_nested_dim, t_1, t_2, ..., t_tensor_dim). The sizes lead by n_ are defined \n", - "to be the nested sizes each at a nested dimension, the sizes lead by t_ are defined to be the \n", - "tensor sizes each at a tensor dimension. They are a reduced version of nested_size and \n", - "aim to represent the size across a slice of nested_size.\n", - "\n", - "size(i) is of value k if all numerical entries of nested_size(dim) are of value k, otherwise it is None.\n", - "size() is a tuple with entries size(i)\n", - "In this case most size(i) will be None, except for the first. We will later see examples of NestedTensors where this is not the case" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "**$ nt.size()**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(2, None, None, None)\n", - "\n" - ] - } - ], - "source": [ - "print_eval(\"nt.size()\")" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "**$ nt.dtype**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "torch.float32\n", - "\n" - ] - }, - { - "data": { - "text/markdown": [ - "**$ nt.layout**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "torch.strided\n", - "\n" - ] - }, - { - "data": { - "text/markdown": [ - "**$ nt.device**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "cpu\n", - "\n" - ] - } - ], - "source": [ - "# The data type, layout and device of a NestedTensor as unsurprisingly that of the Tensor constiuent.\n", - "# Just as with torch.tensor these properties must align during construction.\n", - "print_eval(\"nt.dtype\")\n", - "print_eval(\"nt.layout\")\n", - "print_eval(\"nt.device\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### torch.nested_tensor_from_tensor_mask, torch.NestedTensor.to_tensor_mask and more\n", - "To put NestedTensors in context of current approaches of dealing with variably sized datapoints, such as padding and masking, we will introduce construction and conversion to tensors with masks and tensors with speical non-data identifying values." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "**$ tensor**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "tensor([[[0.8413, 0.7325, 0.0000, 0.0000],\n", - " [0.0000, 0.0000, 0.0000, 0.0000],\n", - " [0.0000, 0.0000, 0.0000, 0.0000]],\n", - "\n", - " [[0.6334, 0.5473, 0.3273, 0.0564],\n", - " [0.3023, 0.6826, 0.3519, 0.1804],\n", - " [0.8431, 0.1645, 0.1821, 0.9185]]])\n", - "\n" - ] - }, - { - "data": { - "text/markdown": [ - "**$ mask**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "tensor([[[ True, True, False, False],\n", - " [False, False, False, False],\n", - " [False, False, False, False]],\n", - "\n", - " [[ True, True, True, True],\n", - " [ True, True, True, True],\n", - " [ True, True, True, True]]])\n", - "\n" - ] - }, - { - "data": { - "text/markdown": [ - "**$ nestedtensor.nested_tensor_from_tensor_mask(tensor, mask)**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "nested_tensor([\n", - "\ttensor([[0.8413, 0.7325]]),\n", - "\ttensor([[0.6334, 0.5473, 0.3273, 0.0564],\n", - "\t [0.3023, 0.6826, 0.3519, 0.1804],\n", - "\t [0.8431, 0.1645, 0.1821, 0.9185]])\n", - "])\n", - "\n" - ] - }, - { - "data": { - "text/markdown": [ - "**$ nestedtensor.nested_tensor_from_padded_tensor(tensor, padding=0)**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "nested_tensor([\n", - "\ttensor([[0.8413, 0.7325]]),\n", - "\ttensor([[0.6334, 0.5473, 0.3273, 0.0564],\n", - "\t [0.3023, 0.6826, 0.3519, 0.1804],\n", - "\t [0.8431, 0.1645, 0.1821, 0.9185]])\n", - "])\n", - "\n" - ] - } - ], - "source": [ - "tensor = torch.tensor(\n", - " [[[0.8413, 0.7325, 0.0000, 0.0000],\n", - " [0.0000, 0.0000, 0.0000, 0.0000],\n", - " [0.0000, 0.0000, 0.0000, 0.0000]],\n", - "\n", - " [[0.6334, 0.5473, 0.3273, 0.0564],\n", - " [0.3023, 0.6826, 0.3519, 0.1804],\n", - " [0.8431, 0.1645, 0.1821, 0.9185]]])\n", - "mask = torch.tensor(\n", - " [[[ True, True, False, False],\n", - " [False, False, False, False],\n", - " [False, False, False, False]],\n", - "\n", - " [[ True, True, True, True],\n", - " [ True, True, True, True],\n", - " [ True, True, True, True]]])\n", - "print_eval(\"tensor\")\n", - "print_eval(\"mask\")\n", - "nt2 = nestedtensor.nested_tensor_from_tensor_mask(tensor, mask)\n", - "print_eval(\"nestedtensor.nested_tensor_from_tensor_mask(tensor, mask)\")\n", - "print_eval(\"nestedtensor.nested_tensor_from_padded_tensor(tensor, padding=0)\")" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "scrolled": false - }, - "outputs": [ - { - "data": { - "text/markdown": [ - "**$ nt2.to_tensor_mask()**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(tensor([[[0.8413, 0.7325, 0.0000, 0.0000],\n", - " [0.0000, 0.0000, 0.0000, 0.0000],\n", - " [0.0000, 0.0000, 0.0000, 0.0000]],\n", - "\n", - " [[0.6334, 0.5473, 0.3273, 0.0564],\n", - " [0.3023, 0.6826, 0.3519, 0.1804],\n", - " [0.8431, 0.1645, 0.1821, 0.9185]]]), tensor([[[ True, True, False, False],\n", - " [False, False, False, False],\n", - " [False, False, False, False]],\n", - "\n", - " [[ True, True, True, True],\n", - " [ True, True, True, True],\n", - " [ True, True, True, True]]]))\n", - "\n" - ] - }, - { - "data": { - "text/markdown": [ - "**$ nt2.to_padded_tensor(padding=-10)**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "tensor([[[ 0.8413, 0.7325, -10.0000, -10.0000],\n", - " [-10.0000, -10.0000, -10.0000, -10.0000],\n", - " [-10.0000, -10.0000, -10.0000, -10.0000]],\n", - "\n", - " [[ 0.6334, 0.5473, 0.3273, 0.0564],\n", - " [ 0.3023, 0.6826, 0.3519, 0.1804],\n", - " [ 0.8431, 0.1645, 0.1821, 0.9185]]])\n", - "\n" - ] - } - ], - "source": [ - "print_eval(\"nt2.to_tensor_mask()\")\n", - "print_eval(\"nt2.to_padded_tensor(padding=-10)\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**unbind** is a fundamental building block of NestedTensors. Applying unbind to a NestedTensor will return the constiuents of the list it represents. More importantly, it returns a few of these elements. It does not take a dim argument, for now, in comparison to torch.Tensor.unbind." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/markdown": [ - "**$ entries[0]**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "nested_tensor([\n", - "\ttensor([[0.1525, 0.9457, 0.8438],\n", - "\t [0.6784, 0.9376, 0.5344]]),\n", - "\ttensor([[0.5654, 0.6054, 0.2726, 0.8868, 0.3417],\n", - "\t [0.1225, 0.4104, 0.9022, 0.6978, 0.2081],\n", - "\t [0.5641, 0.2983, 0.7589, 0.5495, 0.1304],\n", - "\t [0.1999, 0.3803, 0.0336, 0.4855, 0.9838]])\n", - "])\n", - "\n" - ] - }, - { - "data": { - "text/markdown": [ - "**$ entries[1]**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "nested_tensor([\n", - "\ttensor([[0.8105, 0.6778]])\n", - "])\n", - "\n" - ] - } - ], - "source": [ - "entries = nt.unbind()\n", - "print_eval('entries[0]')\n", - "print_eval('entries[1]')" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "**$ nt**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "nested_tensor([\n", - "\t[\n", - "\t\ttensor([[0.9884, 0.5852, 0.6646],\n", - "\t\t [0.7786, 0.5917, 0.8606]]),\n", - "\t\ttensor([[0.5654, 0.6054, 0.2726, 0.8868, 0.3417],\n", - "\t\t [0.1225, 0.4104, 0.9022, 0.6978, 0.2081],\n", - "\t\t [0.5641, 0.2983, 0.7589, 0.5495, 0.1304],\n", - "\t\t [0.1999, 0.3803, 0.0336, 0.4855, 0.9838]])\n", - "\t],\n", - "\t[\n", - "\t\ttensor([[0.8105, 0.6778]])\n", - "\t]\n", - "])\n", - "\n" - ] - } - ], - "source": [ - "# Edit the first entry of the first list in-place. You can see that the memory is shared between these constructs.\n", - "entries[0].unbind()[0].cos_()\n", - "print_eval('nt')" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/indexing.ipynb b/examples/indexing.ipynb deleted file mode 100644 index 69adff3d..00000000 --- a/examples/indexing.ipynb +++ /dev/null @@ -1,763 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Manipulating shape and indexing" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import torch\n", - "import nestedtensor\n", - "from IPython.display import Markdown, display\n", - "\n", - "def print_eval(s):\n", - " colorS = \"$ {}\".format(s)\n", - " display(Markdown('**{}**'.format(colorS))) \n", - " print('{}\\n'.format(str(eval(s))))" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "**$ nt2**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "nested_tensor([\n", - "\t[\n", - "\t\ttensor([[1.0000, 0.5000],\n", - "\t\t [0.1000, 0.6000]]),\n", - "\t\ttensor([[5.5000, 3.3000],\n", - "\t\t [2.2000, 6.6000]])\n", - "\t],\n", - "\t[\n", - "\t\ttensor([[3.0000, 1.0000],\n", - "\t\t [0.5000, 0.7000]]),\n", - "\t\ttensor([[5., 4.],\n", - "\t\t [1., 2.]])\n", - "\t]\n", - "])\n", - "\n" - ] - } - ], - "source": [ - "nt2 = nestedtensor.nested_tensor(\n", - "[\n", - " [\n", - " torch.tensor([[1.0, 0.5], [0.1, 0.6]]),\n", - " torch.tensor([[5.5, 3.3], [2.2, 6.6]])\n", - " ],\n", - " [\n", - " torch.tensor([[3.0, 1.0], [0.5, 0.7]]),\n", - " torch.tensor([[5.0, 4.0], [1.0, 2.0]])\n", - " ]\n", - "])\n", - "print_eval('nt2')" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "**$ nt2**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "nested_tensor([\n", - "\t[\n", - "\t\ttensor([[1.0000, 0.5000],\n", - "\t\t [0.1000, 0.6000]]),\n", - "\t\ttensor([[5.5000, 3.3000],\n", - "\t\t [2.2000, 6.6000]])\n", - "\t],\n", - "\t[\n", - "\t\ttensor([[3.0000, 1.0000],\n", - "\t\t [0.5000, 0.7000]]),\n", - "\t\ttensor([[5., 4.],\n", - "\t\t [1., 2.]])\n", - "\t]\n", - "])\n", - "\n" - ] - }, - { - "data": { - "text/markdown": [ - "**$ nt3**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "nested_tensor([\n", - "\ttensor([[[1.0000, 0.5000],\n", - "\t [0.1000, 0.6000]],\n", - "\t\n", - "\t [[5.5000, 3.3000],\n", - "\t [2.2000, 6.6000]]]),\n", - "\ttensor([[[3.0000, 1.0000],\n", - "\t [0.5000, 0.7000]],\n", - "\t\n", - "\t [[5.0000, 4.0000],\n", - "\t [1.0000, 2.0000]]])\n", - "])\n", - "\n" - ] - }, - { - "data": { - "text/markdown": [ - "**$ nt3.size()**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(2, 2, 2, 2)\n", - "\n" - ] - }, - { - "data": { - "text/markdown": [ - "**$ nt3.nested_dim()**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1\n", - "\n" - ] - }, - { - "data": { - "text/markdown": [ - "**$ nt3.nested_size()**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "torch.NestedSize((\n", - "\ttorch.Size([2, 2, 2]),\n", - "\ttorch.Size([2, 2, 2])\n", - "))\n", - "\n" - ] - } - ], - "source": [ - "nt3 = nt2.to_tensor(1)\n", - "print_eval(\"nt2\")\n", - "print_eval(\"nt3\")\n", - "print_eval(\"nt3.size()\")\n", - "print_eval(\"nt3.nested_dim()\")\n", - "print_eval(\"nt3.nested_size()\")" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "**$ nt2**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "nested_tensor([\n", - "\t[\n", - "\t\ttensor([[1.0000, 0.5000],\n", - "\t\t [0.1000, 0.6000]]),\n", - "\t\ttensor([[5.5000, 3.3000],\n", - "\t\t [2.2000, 6.6000]])\n", - "\t],\n", - "\t[\n", - "\t\ttensor([[3.0000, 1.0000],\n", - "\t\t [0.5000, 0.7000]]),\n", - "\t\ttensor([[5., 4.],\n", - "\t\t [1., 2.]])\n", - "\t]\n", - "])\n", - "\n" - ] - }, - { - "data": { - "text/markdown": [ - "**$ nt4**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "tensor([[[[1.0000, 0.5000],\n", - " [0.1000, 0.6000]],\n", - "\n", - " [[5.5000, 3.3000],\n", - " [2.2000, 6.6000]]],\n", - "\n", - "\n", - " [[[3.0000, 1.0000],\n", - " [0.5000, 0.7000]],\n", - "\n", - " [[5.0000, 4.0000],\n", - " [1.0000, 2.0000]]]])\n", - "\n" - ] - }, - { - "data": { - "text/markdown": [ - "**$ nt4.size()**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "torch.Size([2, 2, 2, 2])\n", - "\n" - ] - } - ], - "source": [ - "nt4 = nt2.to_tensor(0)\n", - "print_eval(\"nt2\")\n", - "print_eval(\"nt4\")\n", - "print_eval(\"nt4.size()\")\n", - "# print_eval(\"nt4.nested_dim()\") Will crash. nt4 is a regular Tensor!\n", - "# print_eval(\"nt4.nested_size()\") Will crash. nt4 is a regular Tensor!" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "**$ nt2**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "nested_tensor([\n", - "\t[\n", - "\t\ttensor([[1.0000, 0.5000],\n", - "\t\t [0.1000, 0.6000]]),\n", - "\t\ttensor([[5.5000, 3.3000],\n", - "\t\t [2.2000, 6.6000]])\n", - "\t],\n", - "\t[\n", - "\t\ttensor([[3.0000, 1.0000],\n", - "\t\t [0.5000, 0.7000]]),\n", - "\t\ttensor([[5., 4.],\n", - "\t\t [1., 2.]])\n", - "\t]\n", - "])\n", - "\n" - ] - }, - { - "data": { - "text/markdown": [ - "**$ nt2[0][0]**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "tensor([[1.0000, 0.5000],\n", - " [0.1000, 0.6000]])\n", - "\n" - ] - }, - { - "data": { - "text/markdown": [ - "**$ nt2[0, 0]**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "nested_tensor([\n", - " tensor([1.0000, 0.5000]),\n", - " tensor([5.5000, 3.3000]),\n", - "])\n", - "\n" - ] - }, - { - "data": { - "text/markdown": [ - "**$ nt2[:, 0]**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "nested_tensor([\n", - " tensor([[1.0000, 0.5000],\n", - " [0.1000, 0.6000]]),\n", - " tensor([[3.0000, 1.0000],\n", - " [0.5000, 0.7000]]),\n", - "])\n", - "\n" - ] - }, - { - "data": { - "text/markdown": [ - "**$ nt2[0, :]**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "nested_tensor([\n", - " tensor([[1.0000, 0.5000],\n", - " [0.1000, 0.6000]]),\n", - " tensor([[5.5000, 3.3000],\n", - " [2.2000, 6.6000]]),\n", - "])\n", - "\n" - ] - } - ], - "source": [ - "print_eval(\"nt2\")\n", - "print_eval(\"nt2[0][0]\")\n", - "print_eval(\"nt2[0, 0]\")\n", - "print_eval(\"nt2[:, 0]\")\n", - "print_eval(\"nt2[0, :]\")" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "**$ nt2**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "nested_tensor([\n", - "\t[\n", - "\t\ttensor([[1.0000, 0.5000],\n", - "\t\t [0.1000, 0.6000]]),\n", - "\t\ttensor([[5.5000, 3.3000],\n", - "\t\t [2.2000, 6.6000]])\n", - "\t],\n", - "\t[\n", - "\t\ttensor([[3.0000, 1.0000],\n", - "\t\t [0.5000, 0.7000]]),\n", - "\t\ttensor([[5., 4.],\n", - "\t\t [1., 2.]])\n", - "\t]\n", - "])\n", - "\n" - ] - }, - { - "data": { - "text/markdown": [ - "**$ nt2[:, :, (1, 0)]**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "nested_tensor([\n", - " nested_tensor([\n", - " tensor([[0.1000, 0.6000],\n", - " [1.0000, 0.5000]]),\n", - " tensor([[2.2000, 6.6000],\n", - " [5.5000, 3.3000]]),\n", - "]),\n", - " nested_tensor([\n", - " tensor([[0.5000, 0.7000],\n", - " [3.0000, 1.0000]]),\n", - " tensor([[1., 2.],\n", - " [5., 4.]]),\n", - "]),\n", - "])\n", - "\n" - ] - } - ], - "source": [ - "# Advanced indexing is allowed over tensor dimensions\n", - "print_eval(\"nt2\")\n", - "print_eval(\"nt2[:, :, (1, 0)]\")" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "**$ nt2**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "nested_tensor([\n", - "\t[\n", - "\t\ttensor([[1.0000, 0.5000],\n", - "\t\t [0.1000, 0.6000]]),\n", - "\t\ttensor([[5.5000, 3.3000],\n", - "\t\t [2.2000, 6.6000]])\n", - "\t],\n", - "\t[\n", - "\t\ttensor([[3.0000, 1.0000],\n", - "\t\t [0.5000, 0.7000]]),\n", - "\t\ttensor([[5., 4.],\n", - "\t\t [1., 2.]])\n", - "\t]\n", - "])\n", - "\n" - ] - }, - { - "data": { - "text/markdown": [ - "**$ ind**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "tensor([[1, 0],\n", - " [0, 1]])\n", - "\n" - ] - }, - { - "data": { - "text/markdown": [ - "**$ nt2[:, :, ind]**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "nested_tensor([\n", - " nested_tensor([\n", - " tensor([[[0.1000, 0.6000],\n", - " [1.0000, 0.5000]],\n", - "\n", - " [[1.0000, 0.5000],\n", - " [0.1000, 0.6000]]]),\n", - " tensor([[[2.2000, 6.6000],\n", - " [5.5000, 3.3000]],\n", - "\n", - " [[5.5000, 3.3000],\n", - " [2.2000, 6.6000]]]),\n", - "]),\n", - " nested_tensor([\n", - " tensor([[[0.5000, 0.7000],\n", - " [3.0000, 1.0000]],\n", - "\n", - " [[3.0000, 1.0000],\n", - " [0.5000, 0.7000]]]),\n", - " tensor([[[1., 2.],\n", - " [5., 4.]],\n", - "\n", - " [[5., 4.],\n", - " [1., 2.]]]),\n", - "]),\n", - "])\n", - "\n" - ] - } - ], - "source": [ - "# Advanced indexing using binary mask\n", - "print_eval(\"nt2\")\n", - "ind = torch.tensor(((1, 0), (0, 1)))\n", - "print_eval(\"ind\")\n", - "print_eval(\"nt2[:, :, ind]\")" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "**$ nt2**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "nested_tensor([\n", - "\t[\n", - "\t\ttensor([[1.0000, 0.5000],\n", - "\t\t [0.1000, 0.6000]]),\n", - "\t\ttensor([[5.5000, 3.3000],\n", - "\t\t [2.2000, 6.6000]])\n", - "\t],\n", - "\t[\n", - "\t\ttensor([[3.0000, 1.0000],\n", - "\t\t [0.5000, 0.7000]]),\n", - "\t\ttensor([[5., 4.],\n", - "\t\t [1., 2.]])\n", - "\t]\n", - "])\n", - "\n" - ] - }, - { - "data": { - "text/markdown": [ - "**$ nt2[:, :, ..., 0]**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "nested_tensor([\n", - " nested_tensor([\n", - " tensor([1.0000, 0.1000]),\n", - " tensor([5.5000, 2.2000]),\n", - "]),\n", - " nested_tensor([\n", - " tensor([3.0000, 0.5000]),\n", - " tensor([5., 1.]),\n", - "]),\n", - "])\n", - "\n", - "$ nt2[..., 0]\n", - "Ellipsis is not yet supported for nested dimensions\n" - ] - } - ], - "source": [ - "# Ellipsis\n", - "print_eval(\"nt2\")\n", - "print_eval(\"nt2[:, :, ..., 0]\")\n", - "print(\"$ nt2[..., 0]\")\n", - "try:\n", - " nt2[..., 0]\n", - "except NotImplementedError as e:\n", - " print(str(e))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/layers.ipynb b/examples/layers.ipynb deleted file mode 100644 index 545412a5..00000000 --- a/examples/layers.ipynb +++ /dev/null @@ -1,679 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import torch\n", - "import nestedtensor\n", - "from IPython.display import Markdown, display\n", - "\n", - "def print_eval(s):\n", - " colorS = \"$ {}\".format(s)\n", - " display(Markdown('**{}**'.format(colorS))) \n", - " print('{}\\n'.format(str(eval(s))))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Custom nn.functionals\n", - "\n", - "By default all nn.functionals are implemented as a tensorwise function. However, in some cases we want to support custom semantics that come about by slight modifications to the lifted function. Take nn.functional.conv2d as an example.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "**$ nt.size()**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(3, 3, None, None)\n", - "\n" - ] - } - ], - "source": [ - "nt = nestedtensor.nested_tensor([\n", - " torch.rand(3, 10, 30),\n", - " torch.rand(3, 20, 40),\n", - " torch.rand(3, 30, 50)\n", - "])\n", - "nt1 = nestedtensor.nested_tensor([\n", - " torch.rand(1, 3, 10, 30),\n", - " torch.rand(1, 3, 20, 40),\n", - " torch.rand(1, 3, 30, 50)\n", - "])\n", - "weight = torch.rand(64, 3, 7, 7)\n", - "print_eval(\"nt.size()\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "By default this function fails, because the components do not have a batch dimension." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "**$ nestedtensor.tensorwise()(torch.nn.functional.conv2d)(nt, weight)**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "**$ str(e)**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Expected 4-dimensional input for 4-dimensional weight 64 3 7 7, but got 3-dimensional input of size [3, 10, 30] instead\n", - "\n" - ] - }, - { - "data": { - "text/markdown": [ - "**$ nestedtensor.tensorwise()(torch.nn.functional.conv2d)(nt1, weight).size()**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(3, 1, 64, None, None)\n", - "\n" - ] - } - ], - "source": [ - "try:\n", - " print_eval(\"nestedtensor.tensorwise()(torch.nn.functional.conv2d)(nt, weight)\")\n", - "except RuntimeError as e:\n", - " print_eval(\"str(e)\")\n", - " \n", - "print_eval(\"nestedtensor.tensorwise()(torch.nn.functional.conv2d)(nt1, weight).size()\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "However, NestedTensors implement a version of conv2d that doesn't require a batch dimension for ease of use and for efficiency (more on that later)." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "**$ torch.nn.functional.conv2d(nt, weight).size()**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(3, 64, None, None)\n", - "\n" - ] - } - ], - "source": [ - "print_eval(\"torch.nn.functional.conv2d(nt, weight).size()\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We have a similar story for nn.functional.embedding_bag. The lifted version only works on elements of batch size 1, unless given an offset, which is an unnecessary annoyance. We extend the lifted embedding_bag to support inputs of dimension 1, if offset is set to None." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "nt2 = (nestedtensor.nested_tensor([\n", - " torch.rand(1, 30),\n", - " torch.rand(1, 40),\n", - " torch.rand(1, 50)\n", - "]) * 10).to(torch.int64)\n", - "nt3 = (nestedtensor.nested_tensor([\n", - " torch.rand(30),\n", - " torch.rand(40),\n", - " torch.rand(50)\n", - "]) * 10).to(torch.int64)\n", - "nt4 = (nestedtensor.nested_tensor([\n", - " [\n", - " torch.rand(1, 30),\n", - " ],\n", - " [\n", - " torch.rand(1, 40),\n", - " torch.rand(1, 50)\n", - " ]\n", - "]) * 10).to(torch.int64)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "# THIS IS TEMPORARILY DISABLED\n", - "# weight = torch.rand(100, 256)\n", - "# print_eval(\"torch.nn.functional.embedding_bag(nt2, weight).nested_size()\")\n", - "# print_eval(\"torch.nn.functional.embedding_bag(nt3, weight).nested_size()\")\n", - "# print_eval(\"torch.nn.functional.embedding_bag(nt4, weight).nested_size()\")\n", - "# print_eval(\"torch.nn.EmbeddingBag(100, 256)(nt2).nested_size()\")\n", - "# print_eval(\"torch.nn.EmbeddingBag(100, 256)(nt3).nested_size()\")\n", - "# print_eval(\"torch.nn.EmbeddingBag(100, 256)(nt4).nested_size()\")" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "**$ nt3**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "nested_tensor([\n", - "\ttensor([0., 1., 8., 3., 0., 9., 0., 9., 6., 4., 6., 1., 0., 4., 9., 5., 7., 8.,\n", - "\t 1., 8., 2., 1., 5., 2., 4., 9., 4., 4., 6., 5.]),\n", - "\ttensor([1., 0., 6., 8., 9., 7., 0., 4., 0., 1., 3., 9., 6., 5., 2., 7., 2., 5.,\n", - "\t 9., 3., 2., 6., 4., 4., 0., 4., 2., 2., 5., 5., 8., 1., 1., 2., 3., 7.,\n", - "\t 3., 3., 6., 7.]),\n", - "\ttensor([6., 5., 0., 4., 3., 4., 8., 0., 7., 5., 7., 6., 4., 7., 2., 9., 1., 0.,\n", - "\t 3., 5., 3., 2., 5., 1., 8., 2., 1., 7., 0., 4., 8., 9., 2., 2., 6., 7.,\n", - "\t 9., 4., 2., 9., 6., 3., 2., 2., 4., 6., 7., 6., 8., 4.])\n", - "])\n", - "\n" - ] - }, - { - "data": { - "text/markdown": [ - "**$ nt3.size()**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(3, None)\n", - "\n" - ] - }, - { - "data": { - "text/markdown": [ - "**$ nt3.nested_size()**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "torch.NestedSize((\n", - "\ttorch.Size([30]),\n", - "\ttorch.Size([40]),\n", - "\ttorch.Size([50])\n", - "))\n", - "\n" - ] - }, - { - "data": { - "text/markdown": [ - "**$ nestedtensor.nested_tensor(nt3.nested_size(1))**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "nested_tensor([\n", - "\ttensor(30),\n", - "\ttensor(40),\n", - "\ttensor(50)\n", - "])\n", - "\n" - ] - }, - { - "data": { - "text/markdown": [ - "**$ nt4**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "nested_tensor([\n", - "\ttensor([0.0000, 0.0333, 0.2667, 0.1000, 0.0000, 0.3000, 0.0000, 0.3000, 0.2000,\n", - "\t 0.1333, 0.2000, 0.0333, 0.0000, 0.1333, 0.3000, 0.1667, 0.2333, 0.2667,\n", - "\t 0.0333, 0.2667, 0.0667, 0.0333, 0.1667, 0.0667, 0.1333, 0.3000, 0.1333,\n", - "\t 0.1333, 0.2000, 0.1667]),\n", - "\ttensor([0.0250, 0.0000, 0.1500, 0.2000, 0.2250, 0.1750, 0.0000, 0.1000, 0.0000,\n", - "\t 0.0250, 0.0750, 0.2250, 0.1500, 0.1250, 0.0500, 0.1750, 0.0500, 0.1250,\n", - "\t 0.2250, 0.0750, 0.0500, 0.1500, 0.1000, 0.1000, 0.0000, 0.1000, 0.0500,\n", - "\t 0.0500, 0.1250, 0.1250, 0.2000, 0.0250, 0.0250, 0.0500, 0.0750, 0.1750,\n", - "\t 0.0750, 0.0750, 0.1500, 0.1750]),\n", - "\ttensor([0.1200, 0.1000, 0.0000, 0.0800, 0.0600, 0.0800, 0.1600, 0.0000, 0.1400,\n", - "\t 0.1000, 0.1400, 0.1200, 0.0800, 0.1400, 0.0400, 0.1800, 0.0200, 0.0000,\n", - "\t 0.0600, 0.1000, 0.0600, 0.0400, 0.1000, 0.0200, 0.1600, 0.0400, 0.0200,\n", - "\t 0.1400, 0.0000, 0.0800, 0.1600, 0.1800, 0.0400, 0.0400, 0.1200, 0.1400,\n", - "\t 0.1800, 0.0800, 0.0400, 0.1800, 0.1200, 0.0600, 0.0400, 0.0400, 0.0800,\n", - "\t 0.1200, 0.1400, 0.1200, 0.1600, 0.0800])\n", - "])\n", - "\n" - ] - }, - { - "data": { - "text/markdown": [ - "**$ nt4.size()**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(3, None)\n", - "\n" - ] - } - ], - "source": [ - "nt3 = nt3.float()\n", - "print_eval(\"nt3\")\n", - "print_eval(\"nt3.size()\")\n", - "print_eval(\"nt3.nested_size()\")\n", - "print_eval(\"nestedtensor.nested_tensor(nt3.nested_size(1))\")\n", - "nt4 = nt3 / nestedtensor.nested_tensor(nt3.nested_size(1))\n", - "print_eval(\"nt4\")\n", - "print_eval(\"nt4.size()\")" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "**$ nt5.nested_size()**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "torch.NestedSize((\n", - "\ttorch.Size([30, 10]),\n", - "\ttorch.Size([40, 10]),\n", - "\ttorch.Size([50, 10])\n", - "))\n", - "\n" - ] - }, - { - "data": { - "text/markdown": [ - "**$ torch.mm(nt5, torch.rand(10, 5)).nested_size()**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "torch.NestedSize((\n", - "\ttorch.Size([30, 5]),\n", - "\ttorch.Size([40, 5]),\n", - "\ttorch.Size([50, 5])\n", - "))\n", - "\n" - ] - } - ], - "source": [ - "nt5 = nestedtensor.nested_tensor([\n", - " torch.rand(30, 10),\n", - " torch.rand(40, 10),\n", - " torch.rand(50, 10)\n", - "])\n", - "print_eval(\"nt5.nested_size()\")\n", - "print_eval(\"torch.mm(nt5, torch.rand(10, 5)).nested_size()\")" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "**$ nt5.argmax(1)**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "nested_tensor([\n", - "\ttensor([28, 28, 18, 6, 17, 1, 17, 23, 18, 18]),\n", - "\ttensor([ 3, 23, 2, 4, 1, 31, 7, 14, 1, 0]),\n", - "\ttensor([38, 1, 47, 34, 46, 48, 44, 9, 11, 47])\n", - "])\n", - "\n" - ] - }, - { - "data": { - "text/markdown": [ - "**$ nt5.argmax(1).size()**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(3, 10)\n", - "\n" - ] - }, - { - "data": { - "text/markdown": [ - "**$ nt5.argmax(1).to_tensor()**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "tensor([[28, 28, 18, 6, 17, 1, 17, 23, 18, 18],\n", - " [ 3, 23, 2, 4, 1, 31, 7, 14, 1, 0],\n", - " [38, 1, 47, 34, 46, 48, 44, 9, 11, 47]])\n", - "\n" - ] - } - ], - "source": [ - "print_eval(\"nt5.argmax(1)\")\n", - "print_eval(\"nt5.argmax(1).size()\")\n", - "print_eval(\"nt5.argmax(1).to_tensor()\")" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "# THIS IS TEMOPORARILY DISABLED\n", - "# print_eval(\"nt5.nested_size()\")\n", - "# print_eval(\"nt5.argmax(2).nested_size()\")\n", - "# print_eval(\"torch.nn.functional.cross_entropy(nt5, nt5.argmax(2))\")" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "**$ nt6.lu()[0].size()**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(3, None, None)\n", - "\n" - ] - }, - { - "data": { - "text/markdown": [ - "**$ nt6.lu()[1].size()**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(3, None)\n", - "\n" - ] - } - ], - "source": [ - "nt6 = nestedtensor.nested_tensor([torch.rand(10, 10), torch.rand(20, 20), torch.rand(30, 30)])\n", - "print_eval(\"nt6.lu()[0].size()\")\n", - "print_eval(\"nt6.lu()[1].size()\")" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "**$ torch.mm(nt7, nt8)**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "nested_tensor([\n", - "\t[\n", - "\t\ttensor([[3.3967]]),\n", - "\t\ttensor([[3.2799, 2.8154],\n", - "\t\t [3.7403, 4.0024]])\n", - "\t],\n", - "\t[\n", - "\t\ttensor([[8.2538, 7.9232, 8.3564],\n", - "\t\t [7.1505, 6.9339, 8.7236],\n", - "\t\t [7.4973, 7.2823, 8.4991]])\n", - "\t]\n", - "])\n", - "\n" - ] - } - ], - "source": [ - "nt7 = nestedtensor.nested_tensor([[torch.rand(1, 10), torch.rand(2, 20)], [torch.rand(3, 30)]])\n", - "nt8 = nestedtensor.nested_tensor([[torch.rand(10, 1), torch.rand(20, 2)], [torch.rand(30, 3)]])\n", - "print_eval(\"torch.mm(nt7, nt8)\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/models.ipynb b/examples/models.ipynb deleted file mode 100644 index 072f428f..00000000 --- a/examples/models.ipynb +++ /dev/null @@ -1,202 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import torch\n", - "import nestedtensor\n", - "from IPython.display import Markdown, display\n", - "def print_eval(s):\n", - " colorS = \"$ {}\".format(s)\n", - " display(Markdown('**{}**'.format(colorS))) \n", - " print('{}\\n'.format(str(eval(s))))" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "import time as time_module\n", - "def time(fn):\n", - " t0 = time_module.time()\n", - " count = 0\n", - " past = 0\n", - " while past < 10.0:\n", - " fn()\n", - " past = time_module.time() - t0\n", - " count += 1\n", - " past = past / count\n", - " return \"average {:2.4f}ms based on {} samples\".format(past * 1000, count)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "def generate_tensors(num_tensor, vocab_size):\n", - " sentence_lengths = torch.normal(75.0, 10.0, size=(num_tensor,)).long()\n", - " return [(torch.rand(l) * vocab_size).long() for l in sentence_lengths]\n", - "\n", - "def generate_text(text):\n", - " offsets = [0] + [len(entry) for entry in text]\n", - " offsets = torch.tensor(offsets[:-1]).cumsum(dim=0)\n", - " text = torch.cat(text)\n", - " return text.to(torch.int64), offsets\n", - "\n", - "class TextSentiment(torch.nn.Module):\n", - " def __init__(self, vocab_size, embed_dim, num_class):\n", - " super().__init__()\n", - " self.embedding = torch.nn.EmbeddingBag(vocab_size, embed_dim, sparse=True)\n", - " self.fc = torch.nn.Linear(embed_dim, num_class)\n", - " self.init_weights()\n", - "\n", - " def init_weights(self):\n", - " initrange = 0.5\n", - " self.embedding.weight.data.uniform_(-initrange, initrange)\n", - " self.fc.weight.data.uniform_(-initrange, initrange)\n", - " self.fc.bias.data.zero_()\n", - "\n", - " def forward(self, text, offsets):\n", - " emb = self.embedding(text, offsets)\n", - " return self.fc(emb)\n", - "\n", - "# THIS IS TEMPORARILY DISABLED\n", - "# vocab_size = 10000\n", - "# model = TextSentiment(10000, 256, 5)\n", - "# tensors = generate_tensors(16, 10000)\n", - "# text, offsets = generate_text(tensors)\n", - "# nt_text = nestedtensor.nested_tensor(tensors)\n", - "\n", - "# print_eval(\"time(lambda: model(text, offsets))\")\n", - "# print_eval(\"time(lambda: model(nt_text, None))\")" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "**$ images.numel()**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "768000\n", - "\n" - ] - }, - { - "data": { - "text/markdown": [ - "**$ time(lambda: model(images))**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "average 55.8146ms based on 180 samples\n", - "\n" - ] - } - ], - "source": [ - "from torchvision import models\n", - "\n", - "model = models.resnet18(pretrained=False)\n", - "images = torch.rand(128, 3, 40, 50)\n", - "print_eval(\"images.numel()\")\n", - "print_eval(\"time(lambda: model(images))\")\n", - "\n", - "# THIS IS TEMPORARILY DISABLED\n", - "# nested_images = nestedtensor.nested_tensor(torch.rand(128, 3, 40, 50).unbind())\n", - "# print_eval(\"time(lambda: model(nested_images))\")\n", - "\n", - "# # There is still about a 10x gap in performance, which however\n", - "# # can be significantly allieviated via custom code (e.g. using im2col).\n", - "# images = [torch.rand(3, (i * 16) % 40 + 40, (i * 16) % 50 + 40) for i in range(64)]\n", - "# nested_irregular_images = nestedtensor.nested_tensor(images)\n", - "# print_eval(\"nested_irregular_images.numel()\")\n", - "# print_eval(\"nested_irregular_images.size()\")\n", - "# print_eval(\"time(lambda: model(nested_irregular_images))\")" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "# THIS IS TEMPORARILY DISABLED\n", - "\n", - "# def generate_tensors(num_tensor, num_features):\n", - "# sentence_lengths = torch.normal(75.0, 10.0, size=(num_tensor,)).long()\n", - "# return [torch.rand(l.item(), num_features) for l in sentence_lengths]\n", - "\n", - "# tensors = generate_tensors(32, 256)\n", - "# nt_text = nestedtensor.nested_tensor(tensors)\n", - "# text = torch.rand(32, 75, 256)\n", - "\n", - "# h0 = torch.randn(6, len(nt_text), 512)\n", - "# c0 = torch.randn(6, len(nt_text), 512)\n", - "# print_eval(\"nt_text.nested_size(1)\")\n", - "# print_eval(\"nt_text.numel()\")\n", - "# print_eval(\"text.numel()\")\n", - "# print_eval(\"time(lambda: torch.nn.LSTM(256, 512, 6, batch_first=True)(nt_text, (h0, c0)))\")\n", - "# print_eval(\"time(lambda: torch.nn.LSTM(256, 512, 6, batch_first=True)(text, (h0, c0)))\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/naryops_and_reduce.ipynb b/examples/naryops_and_reduce.ipynb deleted file mode 100644 index b22f46ec..00000000 --- a/examples/naryops_and_reduce.ipynb +++ /dev/null @@ -1,632 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import torch\n", - "import nestedtensor\n", - "from IPython.display import Markdown, display\n", - "def print_eval(s):\n", - " colorS = \"$ {}\".format(s)\n", - " display(Markdown('**{}**'.format(colorS))) \n", - " print('{}\\n'.format(str(eval(s))))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Unary, binary and reduction operations.\n", - "\n", - "This notebook illustrates unary, binary and reduction operations such as cos_, add and sum in the context of NestedTensor. It assumes you are already familiar with some of the basic operations such as nested_size.\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### n-ary operations\n", - "\n", - "As of writing NestedTensors support the following n-ary operations at a module level (e.g. torch.cos), as a method (e.g. NestedTensor.eq) and their in-place equivalents.\n", - "\n", - "abs, acos, asin, atan, ceil, clamp, cos, cosh, digamma, erf, erfc, erfinv, exp, expm1, floor, fmod, frac, lgamma, log, log10, log1p, log2, mvlgamma, neg, reciprocal, round, rsqrt, sigmoid, sign, sin, sinh, sqrt, tan, tanh, trunc, add, mul, sub, div, pow, atan2, remainder, eq, ge, gt, le, ne, lt\n", - "\n", - "The code for this is generated based on a few core principles, that we only exhibit superficially here. See the notebook on the tensorwise decorator for a more detail exposition and on how to ad-hoc add your own operations to the NestedTensor ecosytem." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "nt = nestedtensor.nested_tensor(\n", - "[\n", - " [\n", - " torch.tensor([1.0, 0.5, 1.5]),\n", - " torch.tensor([3.0, 1.0, 3.3]),\n", - " ],\n", - " [\n", - " torch.tensor([3.0, 1.0, 2.0]),\n", - " torch.tensor([5.0, 4.0, 1.0])\n", - " ]\n", - "])\n", - "\n", - "nt1 = nestedtensor.nested_tensor(\n", - "[\n", - " [\n", - " torch.tensor([1.0, 0.5, 1.5]),\n", - " torch.tensor([5.0, 6.5])\n", - " ],\n", - " [\n", - " torch.tensor([3.0, 1.0, 3.3]),\n", - " torch.tensor([5.0, 4.0])\n", - " ]\n", - "])\n", - "\n", - "nt2 = nestedtensor.nested_tensor(\n", - "[\n", - " [\n", - " torch.tensor([1.0, 0.5, 1.5]),\n", - " torch.tensor([5.0, 6.5])\n", - " ],\n", - " [\n", - " torch.tensor([3.0, 1.0, 3.3, 2.2]),\n", - " torch.tensor([6.6])\n", - " ]\n", - "])" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "nested_tensor([\n", - "\t[\n", - "\t\ttensor([6.0000, 3.7500, 8.7500]),\n", - "\t\ttensor([20.0000, 6.0000, 22.7900])\n", - "\t],\n", - "\t[\n", - "\t\ttensor([20., 6., 12.]),\n", - "\t\ttensor([42., 30., 6.])\n", - "\t]\n", - "])\n" - ] - } - ], - "source": [ - "# Broadcasting of scalar and addition etc. all work as expected\n", - "print((nt + 1) * (nt + 2))" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "nested_tensor([\n", - "\t[\n", - "\t\ttensor([0.5403, 0.8776, 0.0707]),\n", - "\t\ttensor([-0.9900, 0.5403, -0.9875])\n", - "\t],\n", - "\t[\n", - "\t\ttensor([-0.9900, 0.5403, -0.4161]),\n", - "\t\ttensor([ 0.2837, -0.6536, 0.5403])\n", - "\t]\n", - "])\n" - ] - } - ], - "source": [ - "# The same is true for the usual unary operations.\n", - "print(torch.cos(nt))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Reductions\n", - "\n", - "As of writing NestedTensors support the following reduction operations.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(2, 2, 3)\n" - ] - }, - { - "data": { - "text/plain": [ - "tensor(1.)" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "print(nt.size())\n", - "nt[0][0][0]" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "torch.NestedSize((\n", - "\t(\n", - "\t\ttorch.Size([3]),\n", - "\t\ttorch.Size([3])\n", - "\t),\n", - "\t(\n", - "\t\ttorch.Size([3]),\n", - "\t\ttorch.Size([3])\n", - "\t)\n", - "))" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "nt.nested_size()" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "**$ nt**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "nested_tensor([\n", - "\t[\n", - "\t\ttensor([1.0000, 0.5000, 1.5000]),\n", - "\t\ttensor([3.0000, 1.0000, 3.3000])\n", - "\t],\n", - "\t[\n", - "\t\ttensor([3., 1., 2.]),\n", - "\t\ttensor([5., 4., 1.])\n", - "\t]\n", - "])\n", - "\n" - ] - }, - { - "data": { - "text/markdown": [ - "**$ nt.sum()**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "tensor(26.3000)\n", - "\n" - ] - }, - { - "data": { - "text/markdown": [ - "**$ nt.sum(0)**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "nested_tensor([\n", - "\ttensor([4.0000, 1.5000, 3.5000]),\n", - "\ttensor([8.0000, 5.0000, 4.3000])\n", - "])\n", - "\n" - ] - }, - { - "data": { - "text/markdown": [ - "**$ nt.sum(1)**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "nested_tensor([\n", - "\ttensor([4.0000, 1.5000, 4.8000]),\n", - "\ttensor([8., 5., 3.])\n", - "])\n", - "\n" - ] - }, - { - "data": { - "text/markdown": [ - "**$ nt.sum(2)**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "nested_tensor([\n", - "\t[\n", - "\t\ttensor(3.),\n", - "\t\ttensor(7.3000)\n", - "\t],\n", - "\t[\n", - "\t\ttensor(6.),\n", - "\t\ttensor(10.)\n", - "\t]\n", - "])\n", - "\n" - ] - } - ], - "source": [ - "print_eval(\"nt\")\n", - "print_eval(\"nt.sum()\")\n", - "print_eval(\"nt.sum(0)\")\n", - "print_eval(\"nt.sum(1)\")\n", - "print_eval(\"nt.sum(2)\")\n" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "**$ nt1**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "nested_tensor([\n", - "\t[\n", - "\t\ttensor([1.0000, 0.5000, 1.5000]),\n", - "\t\ttensor([5.0000, 6.5000])\n", - "\t],\n", - "\t[\n", - "\t\ttensor([3.0000, 1.0000, 3.3000]),\n", - "\t\ttensor([5., 4.])\n", - "\t]\n", - "])\n", - "\n" - ] - }, - { - "data": { - "text/markdown": [ - "**$ nt1.nested_size()**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "torch.NestedSize((\n", - "\t(\n", - "\t\ttorch.Size([3]),\n", - "\t\ttorch.Size([2])\n", - "\t),\n", - "\t(\n", - "\t\ttorch.Size([3]),\n", - "\t\ttorch.Size([2])\n", - "\t)\n", - "))\n", - "\n" - ] - }, - { - "data": { - "text/markdown": [ - "**$ nt1.floor().to(torch.bool)**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "nested_tensor([\n", - "\t[\n", - "\t\ttensor([ True, False, True]),\n", - "\t\ttensor([True, True])\n", - "\t],\n", - "\t[\n", - "\t\ttensor([True, True, True]),\n", - "\t\ttensor([True, True])\n", - "\t]\n", - "])\n", - "\n" - ] - }, - { - "data": { - "text/markdown": [ - "**$ nt1.floor().to(torch.bool).all(2)**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "nested_tensor([\n", - "\t[\n", - "\t\ttensor(False),\n", - "\t\ttensor(True)\n", - "\t],\n", - "\t[\n", - "\t\ttensor(True),\n", - "\t\ttensor(True)\n", - "\t]\n", - "])\n", - "\n" - ] - } - ], - "source": [ - "print_eval(\"nt1\")\n", - "print_eval(\"nt1.nested_size()\")\n", - "# Fails because (torch.Size([1, 3]), torch.Size([1, 1]) and \n", - "# (torch.Size([2, 1]), torch.Size([2, 2])) cannot be added\n", - "# print_eval(\"nt.sum((0, 1))\") \n", - "print_eval(\"nt1.floor().to(torch.bool)\")\n", - "print_eval(\"nt1.floor().to(torch.bool).all(2)\")" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "**$ nt1**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "nested_tensor([\n", - "\t[\n", - "\t\ttensor([1.0000, 0.5000, 1.5000]),\n", - "\t\ttensor([5.0000, 6.5000])\n", - "\t],\n", - "\t[\n", - "\t\ttensor([3.0000, 1.0000, 3.3000]),\n", - "\t\ttensor([5., 4.])\n", - "\t]\n", - "])\n", - "\n" - ] - }, - { - "data": { - "text/markdown": [ - "**$ nt1.max(2)[0]**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "nested_tensor([\n", - "\t[\n", - "\t\ttensor(1.5000),\n", - "\t\ttensor(6.5000)\n", - "\t],\n", - "\t[\n", - "\t\ttensor(3.3000),\n", - "\t\ttensor(5.)\n", - "\t]\n", - "])\n", - "\n" - ] - }, - { - "data": { - "text/markdown": [ - "**$ nt1.max(2)[1]**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "nested_tensor([\n", - "\t[\n", - "\t\ttensor(2),\n", - "\t\ttensor(1)\n", - "\t],\n", - "\t[\n", - "\t\ttensor(2),\n", - "\t\ttensor(0)\n", - "\t]\n", - "])\n", - "\n" - ] - } - ], - "source": [ - "print_eval(\"nt1\")\n", - "print_eval(\"nt1.max(2)[0]\")\n", - "print_eval(\"nt1.max(2)[1]\")" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "nested_tensor([\n", - "\t[\n", - "\t\ttensor([1, 0, 1], dtype=torch.int32),\n", - "\t\ttensor([5, 6], dtype=torch.int32)\n", - "\t],\n", - "\t[\n", - "\t\ttensor([3, 1, 3], dtype=torch.int32),\n", - "\t\ttensor([5, 4], dtype=torch.int32)\n", - "\t]\n", - "])" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "nt1.int()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/text_classification.ipynb b/examples/text_classification.ipynb deleted file mode 100644 index 15fdad84..00000000 --- a/examples/text_classification.ipynb +++ /dev/null @@ -1,239 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "ename": "Exception", - "evalue": "This is currently disabled!", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mException\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 18\u001b[0m \u001b[0mURL\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m\"https://github.com/le-scientifique/torchDatasets/raw/master/dbpedia_csv.tar.gz\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 19\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 20\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mException\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"This is currently disabled!\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mException\u001b[0m: This is currently disabled!" - ] - } - ], - "source": [ - "import re\n", - "import requests\n", - "import io\n", - "import tarfile\n", - "import csv\n", - "import torch\n", - "import torch.nn as nn\n", - "import random\n", - "import sys\n", - "import concurrent.futures\n", - "import time\n", - "from collections import Counter\n", - "from collections import namedtuple\n", - "\n", - "import torch\n", - "import nestedtensor\n", - "\n", - "URL = \"https://github.com/le-scientifique/torchDatasets/raw/master/dbpedia_csv.tar.gz\"\n", - "\n", - "raise Exception(\"This example notebook is temporarily disabled!\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "Point = namedtuple('Point', 'label text')\n", - "\n", - "def get_data(URL):\n", - " r = requests.get(URL)\n", - " file_like_object = io.BytesIO(r.content)\n", - " tar = tarfile.open(fileobj=file_like_object)\n", - " d = {}\n", - " for member in tar.getmembers():\n", - " if member.isfile() and member.name.endswith('csv'):\n", - " k = 'train' if 'train' in member.name else 'test'\n", - " d[k] = tar.extractfile(member)\n", - " return d\n", - "\n", - "\n", - "def preprocess(iterator):\n", - " def _preprocess(line):\n", - " line = line.decode('UTF-8')\n", - " line = line.lower()\n", - " line = re.sub(r'[^0-9a-zA-Z,\\s]', \"\", line)\n", - " line = line.split(',')\n", - " label = int(line[0]) - 1\n", - " text = (\" \".join(line[1:])).split()\n", - " if len(line) > 2:\n", - " return Point(label=label, text=text)\n", - " for line in iterator:\n", - " yield _preprocess(line)\n", - "\n", - "\n", - "def build_vocab(iterator):\n", - " counter = Counter()\n", - " labels = set()\n", - " for point in iterator:\n", - " counter.update(point.text)\n", - " labels.add(point.label)\n", - " vocab = {}\n", - " for i, (word, count) in enumerate(counter.most_common()):\n", - " vocab[word] = i\n", - "\n", - " return vocab, labels" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "data = get_data(URL)\n", - "data = {k: list(preprocess(v)) for (k, v) in data.items()}\n", - "vocab, labels = build_vocab(data['train'])\n", - "UNK = len(vocab)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "class TextSentiment(nn.Module):\n", - " def __init__(self, vocab_size, embed_dim, num_class):\n", - " super().__init__()\n", - " self.embedding = nn.EmbeddingBag(vocab_size, embed_dim, sparse=True)\n", - " self.fc = nn.Linear(embed_dim, num_class)\n", - " self.init_weights()\n", - "\n", - " def init_weights(self):\n", - " initrange = 0.5\n", - " self.embedding.weight.data.uniform_(-initrange, initrange)\n", - " self.fc.weight.data.uniform_(-initrange, initrange)\n", - " self.fc.bias.data.zero_()\n", - "\n", - " def forward(self, text):\n", - " return self.fc(self.embedding(text))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "embed_dim = 10\n", - "model = TextSentiment(len(vocab) + 1, embed_dim, len(labels)).cuda()\n", - "criterion = torch.nn.CrossEntropyLoss().cuda()\n", - "optimizer = torch.optim.SGD(model.parameters(), lr=1.0)\n", - "scheduler = torch.optim.lr_scheduler.StepLR(optimizer, 1, gamma=0.9)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def create_batch(data):\n", - " data = torch.nested_tensor(\n", - " [torch.tensor(list(map(lambda x: vocab.get(x, UNK), tokens))) for tokens in data])\n", - " return data\n", - "\n", - "def yield_data_futures(data):\n", - " random.shuffle(data)\n", - " labels = []\n", - " batch_data = []\n", - " futures = []\n", - " with concurrent.futures.ProcessPoolExecutor(max_workers=8) as executor:\n", - " for i, point in enumerate(data):\n", - " # Stop accumulating lines of text once we reach 4000 tokens or more\n", - " # This yields variable batch sizes, but with consistent memory pressure\n", - " if sum(map(len, batch_data), 0) < 10000:\n", - " labels.append(point.label)\n", - " batch_data.append(point.text)\n", - " else:\n", - " if len(futures) < 40:\n", - " futures.append((torch.tensor(labels), executor.submit(create_batch, batch_data)))\n", - " else:\n", - " yield futures[0]\n", - " futures = futures[1:]\n", - " labels = []\n", - " batch_data = []\n", - "\n", - " for future in futures:\n", - " yield future" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "num_tokens = sum(map(lambda x: len(x.text), data['train']))\n", - "print(\"Total number of tokens: {}\".format(num_tokens))\n", - "for epoch in range(5):\n", - " i = 0\n", - " t0 = time.time()\n", - " for labels, future in yield_data_futures(data['train']):\n", - " batch = future.result()\n", - " labels = labels.to('cuda', non_blocking=True)\n", - " batch = batch.to('cuda', non_blocking=True)\n", - " optimizer.zero_grad()\n", - " output = model(batch)\n", - " loss = criterion(output, labels)\n", - " loss.backward()\n", - " optimizer.step()\n", - " if i % 16 == 1:\n", - " sys.stderr.write(\n", - " \"\\rtime: {:3.0f}s epoch: {:3.0f} lr: {:3.6f} loss: {:3.6f}\".format(\n", - " time.time() - t0, \n", - " epoch, \n", - " scheduler.get_lr()[0],\n", - " loss, \n", - " )\n", - " )\n", - " sys.stderr.flush()\n", - " i += batch.numel()\n", - " scheduler.step()\n", - " sys.stderr.write('\\n')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "output = [(tb[0], model(tb[1].result().to('cuda')).argmax(1).cpu()) for tb in yield_data_futures(data['test'])]\n", - "predictions = torch.cat(list(map(lambda x: x[1], output)))\n", - "labels = torch.cat(list(map(lambda x: x[0], output)))\n", - "\n", - "print(\"Test accuracy: {}\".format((labels == predictions).sum().float() / len(labels)))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/nestedtensor/__init__.py b/nestedtensor/__init__.py index 6b210ae1..13df136b 100644 --- a/nestedtensor/__init__.py +++ b/nestedtensor/__init__.py @@ -7,14 +7,16 @@ from .nested.masking import nested_tensor_from_padded_tensor from .nested.nested import NestedTensor +from .nested.nested import to_nested_tensor +from .nested.nested import transpose_nchw_nhwc +from .nested.nested import transpose_nhwc_nchw + +from .nested.fuser import fuse_conv_bn +from .nested.fuser import fuse_conv_relu +from .nested.fuser import fuse_conv_add_relu from . import nested from . import _C from . import nn - -# TODO: https://github.com/pytorch/pytorch/issues/34294 -# torch.cat does not call __torch_function__ properly -from .nested.nested import _new_torch_stack as stack -from .nested.nested import _new_torch_cat as cat diff --git a/nestedtensor/csrc/BinaryOps.cpp b/nestedtensor/csrc/BinaryOps.cpp index ff376016..696c1030 100644 --- a/nestedtensor/csrc/BinaryOps.cpp +++ b/nestedtensor/csrc/BinaryOps.cpp @@ -1,141 +1,562 @@ #include +#ifdef WITH_CUDA +#include +#include +#include +#endif namespace at { using namespace torch::nested_tensor; -Tensor& NestedTensor_sub_(Tensor& self, const Tensor& other, Scalar alpha) { - check_binary_shape(self, other); - if (is_nested_tensor_impl(self, other)) { - torch_check_tensor_shape_matches(self, other); - apply_nested_tensor( - [&alpha](Tensor& tensor, Tensor& other) { - at::native::sub_(tensor, other, alpha); - }, - self, - other); - return self; +Tensor NestedTensor_add_Tensor( + const Tensor& self_, + const Tensor& other_, + const Scalar& alpha) { + Tensor self = self_; + Tensor other = other_; + if (is_nested_tensor_impl(self) && is_nested_tensor_impl(other)) { + EfficientSizeNode self_efficient_nested_size = + get_efficient_nested_size(self); + EfficientSizeNode other_efficient_nested_size = + get_efficient_nested_size(other); + if (efficient_size_matches( + self_efficient_nested_size, other_efficient_nested_size)) { + if (get_is_contiguous(self, c10::MemoryFormat::ChannelsLast) && + get_is_contiguous(other, c10::MemoryFormat::ChannelsLast)) { + return wrap_buffer( + at::add( + get_buffer(self).view({-1}), get_buffer(other).view({-1})), + self_efficient_nested_size, + get_efficient_nested_stride(self)); + } + if (!get_is_contiguous(self)) { + self = NestedTensor_contiguous(self); + } + if (!get_is_contiguous(other)) { + other = NestedTensor_contiguous(other); + } + return wrap_buffer( + at::add( + get_buffer(self).reshape({-1}), get_buffer(other).reshape({-1})), + self_efficient_nested_size, + get_efficient_nested_stride(self)); + } } - if (is_nested_tensor_impl(self)) { - torch_check_tensor_shape_matches(self); - apply_nested_tensor( - [&other, &alpha](Tensor& self) { - at::native::sub_(self, other, alpha); - }, - self); - return self; + if (is_nested_tensor_impl(self) && !is_nested_tensor_impl(other)) { + self = NestedTensor_contiguous(self); + int64_t self_dim = get_dim(self); + auto self_opt_sizes = get_opt_sizes(self); +#ifdef WITH_CUDA + if (self_dim == 4 && other.dim() == 4 && + self_opt_sizes[0] && + self_opt_sizes[1] && + (*self_opt_sizes[1]) == other.size(1) && + other.size(0) == 1 && + other.size(2) == 1 && + other.size(3) == 1 && + self.dtype() == c10::ScalarType::Half && + other.dtype() == c10::ScalarType::Half) { + other = other.contiguous(); + at::Tensor self_buffer = get_buffer(self); + Tensor nt_sizes_ = + get_efficient_nested_size(self).sizes().to(torch::kInt32); + Tensor nt_sizes_1 = at::native::narrow(nt_sizes_, 1, 1, 1); + Tensor nt_sizes_2 = at::native::narrow(nt_sizes_, 1, 2, 1); + Tensor nt_sizes_all = nt_sizes_1 * nt_sizes_2; + std::vector numbers; + for (int64_t i = 0; i < nt_sizes_all.size(0); i++) { + for (int64_t j = 0; j < *self_opt_sizes[1]; j++) { + numbers.push_back(nt_sizes_all[i].item()); + } + } + at::Tensor numbers_t = torch::tensor(numbers).to(torch::kInt32); + Tensor nt_sizes_cumsum = + at::cumsum(numbers_t, 0).to(torch::kInt32).reshape({-1}); + TORCH_CHECK(nt_sizes_.dim() == 2, "NestedTensor metadata of unexpected dimension.") + Tensor nt_sizes = at::cat({torch::tensor({0}, torch::kInt32), nt_sizes_cumsum}); + nt_sizes = nt_sizes.to(torch::kCUDA); + at::cuda::CUDAStream defaultStream = at::cuda::getDefaultCUDAStream(); + at::Tensor result_buffer = self_buffer.clone(); + + c10::Half* self_ptr = self_buffer.data_ptr(); + c10::Half* other_ptr = other.data_ptr(); + c10::Half* result_ptr = result_buffer.data_ptr(); + nested_tensor::cuda::add_scalar_kernelLauncher( + self_ptr, + other_ptr, + result_ptr, + (int)(*self_opt_sizes[0] * *self_opt_sizes[1]), + (int)(*self_opt_sizes[0]), + nt_sizes.data_ptr(), + defaultStream); + return wrap_buffer(std::move(result_buffer), get_efficient_nested_size(self), + get_efficient_nested_stride(self)); + } +#endif + if (self_opt_sizes[self_dim - 1] && other.dim() == 1 && + (*(self_opt_sizes[self_dim - 1])) == other.size(0)) { + Tensor self_buffer = get_buffer(self); + Tensor result_buffer = + at::add(self_buffer.reshape({-1, other.size(0)}), other) + .reshape({-1}); + return wrap_buffer( + std::move(result_buffer), + get_efficient_nested_size(self), + get_efficient_nested_stride(self)); + } } - torch_check_tensor_shape_matches(other); + std::tie(self, other) = _expand_other_as(self_, other_); + return map_nested_tensor( + [&alpha](Tensor s, Tensor o) { + return at::add(s, o, alpha); }, + self, + other); +} + +Tensor& NestedTensor_add__Tensor( + Tensor& self_, + const Tensor& other_, + const Scalar& alpha) { + at::Tensor self; + at::Tensor other; + std::tie(self, other) = _expand_other_as(self_, other_); apply_nested_tensor( - [&self, &alpha](Tensor& other) { at::native::sub_(self, other, alpha); }, + [&alpha](Tensor& tensor, const Tensor other) { + tensor.add_(other, alpha); + return tensor; + }, + self, other); - return self; + return self_; } -Tensor& NestedTensor_sub_out( - Tensor& result, +Tensor& NestedTensor_add_out( const Tensor& self, const Tensor& other, - Scalar alpha) { + const Scalar& alpha, + Tensor& out) { + TORCH_CHECK( + is_nested_tensor_impl(out), + "NT binary out variant requires NT as out argument."); TORCH_CHECK( - is_nested_tensor_impl(result), - "NT binary out variant requires NT as result argument."); - check_binary_shape(self, other); - is_nested_tensor_impl(result, self, other); + is_nested_tensor_impl(out, self, other), + "binary_out doesn't support non-NT arguments.") + apply_nested_tensor( + [&alpha](Tensor& self, Tensor& other, Tensor& out) { + return at::add_out(out, self, other, alpha); + }, + self, + other, + out); + return out; +} + +Tensor NestedTensor_div_Tensor(const Tensor& self_, const Tensor& other_) { + Tensor self; + Tensor other; + std::tie(self, other) = _expand_other_as(self_, other_); + return map_nested_tensor( + [](Tensor s, Tensor o) { return at::div(s, o); }, self, other); +} + +Tensor& NestedTensor_div__Tensor(Tensor& self_, const Tensor& other_) { + at::Tensor self; + at::Tensor other; + std::tie(self, other) = _expand_other_as(self_, other_); apply_nested_tensor( - [&alpha](Tensor& result, Tensor& tensor, Tensor& other) { - return at::sub_out(result, tensor, other, alpha); + [](Tensor& tensor, const Tensor other) { + tensor.div_(other); + return tensor; }, - result, self, other); - return result; + return self_; } -Tensor& NestedTensor_pow_out_1( - Tensor& result, - const Tensor& base, - const Tensor& exp) { +Tensor& NestedTensor_div_out( + const Tensor& self, + const Tensor& other, + Tensor& out) { TORCH_CHECK( - is_nested_tensor_impl(result), - "NT binary out variant requires NT as result argument."); - check_binary_shape(base, exp); - if (is_nested_tensor_impl(result, base, exp)) { - torch_check_tensor_shape_matches(result, base, exp); - apply_nested_tensor( - [](Tensor& result, Tensor& base, Tensor& exp) { - at::pow_out(result, base, exp); - }, - result, - base, - exp); - return result; - } - if (is_nested_tensor_impl(result, base)) { - torch_check_tensor_shape_matches(result, base); - apply_nested_tensor( - [&exp](Tensor& result, Tensor& base) { - at::pow_out(result, base, exp); - }, - result, - base); - return result; + is_nested_tensor_impl(out), + "NT binary out variant requires NT as out argument."); + TORCH_CHECK( + is_nested_tensor_impl(out, self, other), + "binary_out doesn't support non-NT arguments.") + apply_nested_tensor( + [](Tensor& self, Tensor& other, Tensor& out) { + return at::div_out(self, other, out); + }, + self, + other, + out); + return out; +} + +Tensor NestedTensor_floor_divide_Tensor( + const Tensor& self_, + const Tensor& other_) { + Tensor self; + Tensor other; + std::tie(self, other) = _expand_other_as(self_, other_); + return map_nested_tensor( + [](Tensor s, Tensor o) { return at::floor_divide(s, o); }, self, other); +} + +Tensor& NestedTensor_floor_divide__Tensor(Tensor& self_, const Tensor& other_) { + at::Tensor self; + at::Tensor other; + std::tie(self, other) = _expand_other_as(self_, other_); + apply_nested_tensor( + [](Tensor& tensor, const Tensor other) { + tensor.floor_divide_(other); + return tensor; + }, + self, + other); + return self_; +} + +Tensor& NestedTensor_floor_divide_out( + const Tensor& self, + const Tensor& other, + Tensor& out) { + TORCH_CHECK( + is_nested_tensor_impl(out), + "NT binary out variant requires NT as out argument."); + TORCH_CHECK( + is_nested_tensor_impl(out, self, other), + "binary_out doesn't support non-NT arguments.") + apply_nested_tensor( + [](Tensor& self, Tensor& other, Tensor& out) { + return at::floor_divide_out(self, other, out); + }, + self, + other, + out); + return out; +} + +Tensor NestedTensor_mul_Tensor(const Tensor& self_, const Tensor& other_) { + Tensor self = self_; + Tensor other = other_; + if (is_nested_tensor_impl(self) && !is_nested_tensor_impl(other)) { + self = NestedTensor_contiguous(self); + int64_t self_dim = get_dim(self); + auto self_opt_sizes = get_opt_sizes(self); +#ifdef WITH_CUDA + if (self_dim == 4 && other.dim() == 4 && + self_opt_sizes[0] && + self_opt_sizes[1] && + (*self_opt_sizes[1]) == other.size(1) && + other.size(0) == 1 && + other.size(2) == 1 && + other.size(3) == 1 && + self.dtype() == c10::ScalarType::Half && + other.dtype() == c10::ScalarType::Half) { + other = other.contiguous(); + at::Tensor self_buffer = get_buffer(self); + Tensor nt_sizes_ = + get_efficient_nested_size(self).sizes().to(torch::kInt32); + Tensor nt_sizes_1 = at::native::narrow(nt_sizes_, 1, 1, 1); + Tensor nt_sizes_2 = at::native::narrow(nt_sizes_, 1, 2, 1); + Tensor nt_sizes_all = nt_sizes_1 * nt_sizes_2; + std::vector numbers; + for (int64_t i = 0; i < nt_sizes_all.size(0); i++) { + for (int64_t j = 0; j < *self_opt_sizes[1]; j++) { + numbers.push_back(nt_sizes_all[i].item()); + } + } + at::Tensor numbers_t = torch::tensor(numbers).to(torch::kInt32); + Tensor nt_sizes_cumsum = + at::cumsum(numbers_t, 0).to(torch::kInt32).reshape({-1}); + TORCH_CHECK(nt_sizes_.dim() == 2, "NestedTensor metadata of unexpected dimension.") + Tensor nt_sizes = at::cat({torch::tensor({0}, torch::kInt32), nt_sizes_cumsum}); + nt_sizes = nt_sizes.to(torch::kCUDA); + at::cuda::CUDAStream defaultStream = at::cuda::getDefaultCUDAStream(); + at::Tensor result_buffer = self_buffer.clone(); + + c10::Half* self_ptr = self_buffer.data_ptr(); + c10::Half* other_ptr = other.data_ptr(); + c10::Half* result_ptr = result_buffer.data_ptr(); + nested_tensor::cuda::mul_scalar_kernelLauncher( + self_ptr, + other_ptr, + result_ptr, + (int)(*self_opt_sizes[0] * *self_opt_sizes[1]), + (int)(*self_opt_sizes[0]), + nt_sizes.data_ptr(), + defaultStream); + return wrap_buffer(std::move(result_buffer), get_efficient_nested_size(self), + get_efficient_nested_stride(self)); + } +#endif } + std::tie(self, other) = _expand_other_as(self_, other_); + return map_nested_tensor( + [](Tensor s, Tensor o) { + return at::mul(s, o); }, self, other); +} + +Tensor& NestedTensor_mul__Tensor(Tensor& self_, const Tensor& other_) { + at::Tensor self; + at::Tensor other; + std::tie(self, other) = _expand_other_as(self_, other_); + apply_nested_tensor( + [](Tensor& tensor, const Tensor other) { + tensor.mul_(other); + return tensor; + }, + self, + other); + return self_; +} + +Tensor& NestedTensor_mul_out( + const Tensor& self, + const Tensor& other, + Tensor& out) { + TORCH_CHECK( + is_nested_tensor_impl(out), + "NT binary out variant requires NT as out argument."); + TORCH_CHECK( + is_nested_tensor_impl(out, self, other), + "binary_out doesn't support non-NT arguments.") + apply_nested_tensor( + [](Tensor& self, Tensor& other, Tensor& out) { + return at::mul_out(self, other, out); + }, + self, + other, + out); + return out; +} + +Tensor& NestedTensor_sub_out( + const Tensor& self, + const Tensor& other, + const Scalar& alpha, + Tensor& out) { + TORCH_CHECK( + is_nested_tensor_impl(out), + "NT binary out variant requires NT as out argument."); TORCH_CHECK( - is_nested_tensor_impl(result, exp), - "At least one of base or exp needs to be a NestedTensor"); - torch_check_tensor_shape_matches(result, exp); + is_nested_tensor_impl(out, self, other), + "binary_out doesn't support non-NT arguments.") + apply_nested_tensor( + [&alpha](Tensor& self, Tensor& other, Tensor& out) { + return at::sub_out(out, self, other, alpha); + }, + self, + other, + out); + return out; +} + +Tensor NestedTensor_sub_Tensor( + const Tensor& self_, + const Tensor& other_, + const Scalar& alpha) { + Tensor self = self_; + Tensor other = other_; + if (is_nested_tensor_impl(self) && !is_nested_tensor_impl(other)) { + self = NestedTensor_contiguous(self); + int64_t self_dim = get_dim(self); + auto self_opt_sizes = get_opt_sizes(self); +#ifdef WITH_CUDA + if (self_dim == 4 && other.dim() == 4 && + self_opt_sizes[0] && + self_opt_sizes[1] && + (*self_opt_sizes[1]) == other.size(1) && + other.size(0) == 1 && + other.size(2) == 1 && + other.size(3) == 1 && + self.dtype() == c10::ScalarType::Half && + other.dtype() == c10::ScalarType::Half) { + other = other.contiguous(); + at::Tensor self_buffer = get_buffer(self); + Tensor nt_sizes_ = + get_efficient_nested_size(self).sizes().to(torch::kInt32); + Tensor nt_sizes_1 = at::native::narrow(nt_sizes_, 1, 1, 1); + Tensor nt_sizes_2 = at::native::narrow(nt_sizes_, 1, 2, 1); + Tensor nt_sizes_all = nt_sizes_1 * nt_sizes_2; + std::vector numbers; + for (int64_t i = 0; i < nt_sizes_all.size(0); i++) { + for (int64_t j = 0; j < *self_opt_sizes[1]; j++) { + numbers.push_back(nt_sizes_all[i].item()); + } + } + at::Tensor numbers_t = torch::tensor(numbers).to(torch::kInt32); + Tensor nt_sizes_cumsum = + at::cumsum(numbers_t, 0).to(torch::kInt32).reshape({-1}); + TORCH_CHECK(nt_sizes_.dim() == 2, "NestedTensor metadata of unexpected dimension.") + Tensor nt_sizes = at::cat({torch::tensor({0}, torch::kInt32), nt_sizes_cumsum}); + nt_sizes = nt_sizes.to(torch::kCUDA); + at::cuda::CUDAStream defaultStream = at::cuda::getDefaultCUDAStream(); + at::Tensor result_buffer = self_buffer.clone(); + + c10::Half* self_ptr = self_buffer.data_ptr(); + c10::Half* other_ptr = other.data_ptr(); + c10::Half* result_ptr = result_buffer.data_ptr(); + nested_tensor::cuda::sub_scalar_kernelLauncher( + self_ptr, + other_ptr, + result_ptr, + (int)(*self_opt_sizes[0] * *self_opt_sizes[1]), + (int)(*self_opt_sizes[0]), + nt_sizes.data_ptr(), + defaultStream); + return wrap_buffer(std::move(result_buffer), get_efficient_nested_size(self), + get_efficient_nested_stride(self)); + } +#endif + } + std::tie(self, other) = _expand_other_as(self_, other_); + return map_nested_tensor( + [&alpha](Tensor s, Tensor o) { + return at::sub(s, o, alpha); }, + self, + other); +} + +Tensor& NestedTensor_sub__Tensor( + Tensor& self_, + const Tensor& other_, + const Scalar& alpha) { + at::Tensor self; + at::Tensor other; + std::tie(self, other) = _expand_other_as(self_, other_); + apply_nested_tensor( + [&alpha](Tensor& tensor, const Tensor other) { + tensor.sub_(other, alpha); + return tensor; + }, + self, + other); + return self_; +} + +Tensor& NestedTensor_remainder__Tensor(Tensor& self_, const Tensor& other_) { + at::Tensor self; + at::Tensor other; + std::tie(self, other) = _expand_other_as(self_, other_); apply_nested_tensor( - [&exp](Tensor& result, Tensor& base) { at::pow_out(result, base, exp); }, - result, - base); - return result; + [](Tensor& tensor, const Tensor other) { + tensor.remainder_(other); + return tensor; + }, + self, + other); + return self_; } -Tensor& NestedTensor_pow__1(Tensor& base, const Tensor& other) { - check_binary_shape(base, other); - return NestedTensor_pow_out_1(base, base, other); +Tensor& NestedTensor_atan2_out( + const Tensor& self, + const Tensor& other, + Tensor& out) { + TORCH_CHECK( + is_nested_tensor_impl(out), + "NT binary out variant requires NT as out argument."); + TORCH_CHECK( + is_nested_tensor_impl(out, self, other), + "binary_out doesn't support non-NT arguments.") + apply_nested_tensor( + [](Tensor& self, Tensor& other, Tensor& out) { + return at::atan2_out(self, other, out); + }, + self, + other, + out); + return out; } -Tensor& NestedTensor_pow_out_2(Tensor& result, const Tensor& base, Scalar exp) { +Tensor& NestedTensor_atan2_(Tensor& self_, const Tensor& other_) { + at::Tensor self; + at::Tensor other; + std::tie(self, other) = _expand_other_as(self_, other_); apply_nested_tensor( - [&exp](Tensor& result, Tensor& base) { - return at::pow_out(result, base, exp); + [](Tensor& tensor, const Tensor other) { + tensor.atan2_(other); + return tensor; }, - result, - base); - return result; + self, + other); + return self_; +} + +Tensor NestedTensor_atan2(const Tensor& self_, const Tensor& other_) { + Tensor self; + Tensor other; + std::tie(self, other) = _expand_other_as(self_, other_); + return map_nested_tensor( + [](Tensor s, Tensor o) { return at::atan2(s, o); }, self, other); } -Tensor NestedTensor_pow_2(const Tensor& base, Scalar exp) { - return autograd_map_nested_tensor( - [exp](Tensor base) { return at::pow(base, exp); }, base); +Tensor NestedTensor_remainder_Tensor( + const Tensor& self_, + const Tensor& other_) { + Tensor self; + Tensor other; + std::tie(self, other) = _expand_other_as(self_, other_); + return map_nested_tensor( + [](Tensor s, Tensor o) { return at::remainder(s, o); }, self, other); } -Tensor& NestedTensor_pow_out_3(Tensor& result, Scalar base, const Tensor& exp) { +Tensor& NestedTensor_pow__Tensor(Tensor& self_, const Tensor& other_) { + at::Tensor self; + at::Tensor other; + std::tie(self, other) = _expand_other_as(self_, other_); apply_nested_tensor( - [&base](Tensor& result, Tensor& exp) { - return at::pow_out(result, base, exp); + [](Tensor& tensor, const Tensor other) { + tensor.pow_(other); + return tensor; }, - result, - exp); - return result; + self, + other); + return self_; } -Tensor NestedTensor_pow_3(Scalar base, const Tensor& exp) { - return autograd_map_nested_tensor( - [&base](Tensor exp) { return at::pow(base, exp); }, exp); +Tensor NestedTensor_pow_Scalar(const Scalar& base, const Tensor& exponent_) { + Tensor exponent = exponent_; + return map_nested_tensor( + [&base](Tensor exponent) { return at::pow(base, exponent); }, exponent); } -TORCH_LIBRARY_IMPL(aten, PrivateUse1_PreAutograd, m) { - nt_impl(m, "sub_.Tensor", NestedTensor_sub_); - nt_impl(m, "sub.out", NestedTensor_sub_out); +Tensor NestedTensor_pow_Tensor_Tensor( + const Tensor& self_, + const Tensor& other_) { + Tensor self; + Tensor other; + std::tie(self, other) = _expand_other_as(self_, other_); + return map_nested_tensor( + [](Tensor s, Tensor o) { return at::pow(s, o); }, self, other); +} - nt_impl(m, "pow.Tensor_Tensor_out", NestedTensor_pow_out_1); - nt_impl(m, "pow_.Tensor", NestedTensor_pow__1); - nt_impl(m, "pow.Tensor_Scalar_out", NestedTensor_pow_out_2); - nt_impl(m, "pow.Tensor_Scalar", NestedTensor_pow_2); - nt_impl(m, "pow.Scalar_out", NestedTensor_pow_out_3); - nt_impl(m, "pow.Scalar", NestedTensor_pow_3); +TORCH_LIBRARY_IMPL(aten, NestedTensor, m) { + nt_impl(m, "add.Tensor", NestedTensor_add_Tensor); + nt_impl(m, "add_.Tensor", NestedTensor_add__Tensor); + nt_impl(m, "add.out", NestedTensor_add_out); + nt_impl(m, "div.Tensor", NestedTensor_div_Tensor); + nt_impl(m, "div_.Tensor", NestedTensor_div__Tensor); + nt_impl(m, "div.out", NestedTensor_div_out); + nt_impl(m, "floor_divide", NestedTensor_floor_divide_Tensor); + nt_impl(m, "floor_divide_.Tensor", NestedTensor_floor_divide__Tensor); + nt_impl(m, "floor_divide.out", NestedTensor_floor_divide_out); + nt_impl(m, "mul.Tensor", NestedTensor_mul_Tensor); + nt_impl(m, "mul_.Tensor", NestedTensor_mul__Tensor); + nt_impl(m, "mul.out", NestedTensor_mul_out); + nt_impl(m, "sub.out", NestedTensor_sub_out); + nt_impl(m, "sub.Tensor", NestedTensor_sub_Tensor); + nt_impl(m, "sub_.Tensor", NestedTensor_sub__Tensor); + nt_impl(m, "remainder_.Tensor", NestedTensor_remainder__Tensor); + nt_impl(m, "atan2.out", NestedTensor_atan2_out); + nt_impl(m, "atan2_", NestedTensor_atan2_); + nt_impl(m, "atan2", NestedTensor_atan2); + nt_impl(m, "remainder.Tensor", NestedTensor_remainder_Tensor); + nt_impl(m, "pow_.Tensor", NestedTensor_pow__Tensor); + nt_impl(m, "pow.Scalar", NestedTensor_pow_Scalar); + nt_impl(m, "pow.Tensor_Tensor", NestedTensor_pow_Tensor_Tensor); } + } // namespace at diff --git a/nestedtensor/csrc/BinaryOps.h b/nestedtensor/csrc/BinaryOps.h index 8c042404..5b1bfd40 100644 --- a/nestedtensor/csrc/BinaryOps.h +++ b/nestedtensor/csrc/BinaryOps.h @@ -15,12 +15,12 @@ inline void check_binary_shape(const Tensor& self, const Tensor& other) { } else if (is_nested_tensor_impl(other)) { int64_t other_nested_dim = get_nested_tensor_impl(other)->nested_dim(); TORCH_CHECK( - self.dim() <= other.dim() - other_nested_dim, + get_dim(self) <= get_dim(other) - other_nested_dim, "tensor dimension of other must match or be greater than dimension of self."); } else if (is_nested_tensor_impl(self)) { int64_t self_nested_dim = get_nested_tensor_impl(self)->nested_dim(); TORCH_CHECK( - other.dim() <= self.dim() - self_nested_dim, + get_dim(other) <= get_dim(self) - self_nested_dim, "tensor dimension of self must match or be greater than dimension of other."); } else { TORCH_CHECK(false, "check_binary_shape can only be used in NT context."); @@ -40,11 +40,16 @@ inline std::tuple _expand_other_as(const Tensor& self, c auto result = _expand_other_as(other, self); return std::make_tuple(std::get<1>(result), std::get<0>(result)); } + // self is a NestedTensor, other is a Tensor TORCH_CHECK( is_nested_tensor_impl(self), "_expand_other_as can only be used in NT context."); + if (get_dim(other) >= get_dim(self)) { + at::Tensor other_nt = NestedTensor_to_nested_tensor(other, get_nested_dim(self)); + return std::make_tuple(self, other_nt); + } int64_t self_nested_dim = get_nested_tensor_impl(self)->nested_dim(); - if (other.dim() + self_nested_dim >= self.dim()) { + if (get_dim(other) + self_nested_dim >= get_dim(self)) { at::Tensor other_ = other; for (int64_t i = 0; i < self_nested_dim; i++) { if (other.size(0) == 1) { diff --git a/nestedtensor/csrc/ComparisonOps.cpp b/nestedtensor/csrc/ComparisonOps.cpp new file mode 100644 index 00000000..8c770417 --- /dev/null +++ b/nestedtensor/csrc/ComparisonOps.cpp @@ -0,0 +1,30 @@ +#include + +namespace at { + +using namespace torch::nested_tensor; + +template +Tensor NestedTensor_binary(const Tensor& self_, const Tensor& other_) { + at::Tensor self; + at::Tensor other; + std::tie(self, other) = _expand_other_as(self_, other_); + return map_nested_tensor( + [](Tensor s, Tensor o) { return func(s, o); }, self, other); +} + +template +Tensor NestedTensor_binary_scalar(const Tensor& self, const Scalar& other) { + return map_nested_tensor( + [&other](Tensor self) { return func(self, other); }, self); +} + +TORCH_LIBRARY_IMPL(aten, NestedTensor, m) { + nt_impl(m, "eq.Tensor", NestedTensor_binary); + nt_impl(m, "eq.Scalar", NestedTensor_binary_scalar); + nt_impl(m, "ne.Tensor", NestedTensor_binary); + nt_impl(m, "ne.Scalar", NestedTensor_binary_scalar); + nt_impl(m, "ge.Tensor", NestedTensor_binary); + nt_impl(m, "ge.Scalar", NestedTensor_binary_scalar); +} +} // namespace at diff --git a/nestedtensor/csrc/EmbeddingBag.cpp b/nestedtensor/csrc/EmbeddingBag.cpp new file mode 100644 index 00000000..91be7070 --- /dev/null +++ b/nestedtensor/csrc/EmbeddingBag.cpp @@ -0,0 +1,52 @@ +#include +#include +#include +#include + +using namespace torch::nn; +namespace F = torch::nn::functional; + +namespace at { + +std::tuple NestedTensor_embedding_bag( + const Tensor& weight, + const Tensor& indices_, + const Tensor& offsets, + const bool scale_grad_by_freq, + const int64_t mode, + bool sparse, + const c10::optional& per_sample_weights, + bool include_last_offset) { + at::Tensor indices = get_buffer(indices_).contiguous(); + int64_t emb_dim = weight.size(1); + SizeNode output_size = map( + [&emb_dim](std::vector inp) { + std::vector new_size; + new_size.push_back(emb_dim); + return new_size; + }, + get_nested_size(indices_)); + c10::impl::ExcludeDispatchKeyGuard guard(c10::DispatchKey::NestedTensor); + std::tuple emb_outputs = at::embedding_bag( + weight, + indices, + offsets, + scale_grad_by_freq, + mode, + sparse, + per_sample_weights, + include_last_offset); + at::Tensor emb_output_0 = std::get<0>(emb_outputs).reshape({-1}); + auto output = wrap_buffer(std::move(emb_output_0), output_size); + return std::make_tuple( + output, + std::get<1>(emb_outputs), + std::get<2>(emb_outputs), + std::get<3>(emb_outputs)); +} + +TORCH_LIBRARY_IMPL(aten, NestedTensor, m) { + nt_impl(m, "embedding_bag", NestedTensor_embedding_bag); +} + +} // namespace at diff --git a/nestedtensor/csrc/Expand.cpp b/nestedtensor/csrc/Expand.cpp new file mode 100644 index 00000000..348ce74a --- /dev/null +++ b/nestedtensor/csrc/Expand.cpp @@ -0,0 +1,44 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace at { + +using namespace torch::nested_tensor; +using namespace c10; + +Tensor NestedTensor_expand_as(const Tensor& self_, const Tensor& other) { + at::Tensor self = self_; + if (is_nested_tensor_impl(self, other)) { + TORCH_CHECK( + get_nested_tensor_impl(self)->nested_dim(), + get_nested_tensor_impl(other)->nested_dim(), + "Given NestedTensors need to have same nested dimension."); + return map_nested_tensor( + [](at::Tensor s, at::Tensor o) { return at::native::expand_as(s, o); }, + self, + other); + } + TORCH_CHECK( + !is_nested_tensor_impl(self), + "Cannot expand a NestedTensor as a Tensor."); + TORCH_CHECK( + get_dim(self) <= get_dim(other), + "Cannot expand to a Tensor of smaller dimension."); + while (get_dim(self) > 0 && self.size(0) == 1) { + self = self.squeeze(0); + } + return map_nested_tensor( + [](at::Tensor s, at::Tensor o) { return s.expand_as(o); }, self, other); +} + +TORCH_LIBRARY_IMPL(aten, NestedTensor, m) { + nt_impl(m, "expand_as", NestedTensor_expand_as); +} +} // namespace at diff --git a/nestedtensor/csrc/README.md b/nestedtensor/csrc/README.md new file mode 100644 index 00000000..816721e0 --- /dev/null +++ b/nestedtensor/csrc/README.md @@ -0,0 +1,144 @@ +Below are tables built on top of the stable 1.7 ops [documention](https://pytorch.org/docs/1.7.0/torch.html), which aim to track the implementation of various operations. + +### Pointwise Ops +
+ +| Name | Native | Derivative | +| ---- | ------ | ---------- | +|abs|☑|| +|absolute||| +|acos|☑|| +|arccos||| +|acosh||| +|arccosh||| +|add||| +|addcdiv||| +|addcmul||| +|angle||| +|asin|☑|| +|arcsin||| +|asinh||| +|arcsinh||| +|atan|☑|| +|arctan||| +|atanh||| +|arctanh||| +|atan2||| +|bitwise_not||| +|bitwise_and||| +|bitwise_or||| +|bitwise_xor||| +|ceil|☑|| +|clamp|☑|| +|clip||| +|conj||| +|cos|☑|| +|cosh|☑|| +|deg2rad||| +|div||| +|divide||| +|digamma|☑|| +|erf|☑|| +|erfc|☑|| +|erfinv|☑|| +|exp|☑|| +|exp2||| +|expm1|☑|| +|fix||| +|floor|☑|| +|floor_divide||| +|fmod||| +|frac|☑|| +|imag||| +|lerp||| +|lgamma|☑|| +|log|☑|| +|log10|☑|| +|log1p|☑|| +|log2|☑|| +|logaddexp||| +|logaddexp2||| +|logical_and||| +|logical_not||| +|logical_or||| +|logical_xor||| +|logit||| +|hypot||| +|i0||| +|mul||| +|multiply||| +|mvlgamma|☑|| +|neg|☑|| +|negative||| +|nextafter||| +|polygamma||| +|pow||| +|rad2deg||| +|real||| +|reciprocal|☑|| +|remainder||| +|round|☑|| +|rsqrt|☑|| +|sigmoid|☑|| +|sign|☑|| +|signbit||| +|sin|☑|| +|sinh|☑|| +|sqrt|☑|| +|square||| +|sub||| +|subtract||| +|tan|☑|| +|tanh|☑|| +|true_divide||| +|trunc|☑|| + +
+ +### Reduction Ops + +
+ +| Name | Native | Derivative | +| ---- | ------ | ---------- | +| argmax ||| +| argmin ||| +| amax ||| +| amin ||| +| max ||| +| min ||| +| dist ||| +| logsumexp ||| +| mean |☑|| +| median ||| +| nanmedian ||| +| mode ||| +| norm ||| +| nansum ||| +| prod |☑|| +| quantile ||| +| nanquantile ||| +| std ||| +| std_mean ||| +| sum |☑|| +| unique ||| +| unique_consecutive ||| +| var ||| +| var_mean ||| +| count_nonzero ||| + +
+ +### Non-linear Activations + +
+ +| Name | Native | Derivative | +| ---- | ------ | ---------- | +| nn.Softmin ||| +| nn.Softmax |☑|| +| nn.Softmax2d ||| +| nn.LogSoftmax ||| +| nn.AdaptiveLogSoftmaxWithLoss ||| + +
diff --git a/nestedtensor/csrc/ReduceOps.cpp b/nestedtensor/csrc/ReduceOps.cpp index 19c6b985..7312b536 100644 --- a/nestedtensor/csrc/ReduceOps.cpp +++ b/nestedtensor/csrc/ReduceOps.cpp @@ -1,6 +1,11 @@ +#include #include #include #include +#include +#include +#include +#include namespace at { @@ -12,7 +17,7 @@ Tensor NestedTensor_cumsum( c10::optional dtype) { auto nt_impl = get_nested_tensor_impl(self); int64_t nested_dim = nt_impl->nested_dim(); - dim = maybe_wrap_dim(dim, nt_impl->dim()); + dim = maybe_wrap_dim(dim, get_dim(self)); TORCH_CHECK( dim >= nested_dim, "cumsum of nested dimensions is not implemented yet."); return map_nested_tensor( @@ -22,131 +27,317 @@ Tensor NestedTensor_cumsum( self); } -#define REDUCE_DIM_LIST_FUNC(NAME, FUNC, MSG) \ - Tensor NestedTensor_##NAME( \ - const Tensor& self, \ - c10::ArrayRef dims, \ - bool keepdims, \ - c10::optional dtype) { \ - auto nt_impl = get_nested_tensor_impl(self); \ - int64_t nested_dim = nt_impl->nested_dim(); \ - std::vector newdims; \ - for (auto dim : dims) { \ - dim = maybe_wrap_dim(dim, nt_impl->dim()); \ - TORCH_CHECK( \ - dim >= nested_dim, \ - MSG " of nested dimensions is not implemented yet for dimension " + \ - std::to_string(dim)); \ - newdims.push_back(dim - nested_dim); \ - } \ - return autograd_map_nested_tensor( \ - [nested_dim, newdims, keepdims](at::Tensor tensor) { \ - return FUNC(tensor, c10::ArrayRef(newdims), keepdims); \ - }, \ - self); \ - } - -REDUCE_DIM_LIST_FUNC(mean_dim, at::mean, "mean"); -REDUCE_DIM_LIST_FUNC(sum_dim, at::sum, "sum"); -#undef REDUCE_DIM_LIST_FUNC +std::tuple, std::vector> make_split_dims( + const Tensor& self, + c10::ArrayRef dims) { + auto nt_impl = get_nested_tensor_impl(self); + int64_t nested_dim = nt_impl->nested_dim(); + std::vector tensordims; + std::vector nesteddims; + for (size_t i = 0; i < dims.size(); i++) { + int64_t dim = maybe_wrap_dim(dims[i], get_dim(self)); + if (dim < nested_dim) { + nesteddims.push_back(dim); + } else { + tensordims.push_back(dim - nested_dim); + } + } + std::sort(tensordims.begin(), tensordims.end()); + std::sort(nesteddims.begin(), nesteddims.end()); + return std::make_tuple(tensordims, nesteddims); +} -Tensor NestedTensor_mean(const Tensor& self, c10::optional dtype) { - auto tensors = flatten( - map([&dtype](at::Tensor tensor) { return at::mean(tensor, dtype); }, - get_nested_tensor_structure(self))); - if (tensors.size() == 0) { - if (dtype) { - return at::ones({0}, *dtype); +template +Tensor NestedTensor_func_dim( + F& fn, + const Tensor& self, + c10::ArrayRef dims, + bool keepdims, + c10::optional dtype) { + std::vector tensordims; + std::vector nesteddims; + std::tie(tensordims, nesteddims) = make_split_dims(self, dims); + at::Tensor output = self; + if (tensordims.size() > 0) { + output = map_nested_tensor( + [fn, tensordims, keepdims, dtype](at::Tensor tensor) { + return fn( + tensor, c10::ArrayRef(tensordims), keepdims, dtype); + }, + output); + } + if (nesteddims.size() > 0) { + auto opt_sizes = get_opt_sizes(output); + for (auto opt_size : opt_sizes) { + TORCH_CHECK( + opt_size, + "Current shape doesn't support reduction across nested dimension. Please open a feature request https://t.ly/62F6."); } + auto new_nested_size = get_nested_size(output); + for (size_t i = nesteddims.size(); i > 0; i--) { + new_nested_size = squeeze(new_nested_size, nesteddims[i - 1], keepdims); + } + auto tmp = + fn(NestedTensor_to_tensor(output, c10::nullopt), + IntArrayRef(nesteddims), + keepdims, + dtype); + return wrap_buffer(tmp.reshape({-1}), new_nested_size); + } + return output; +} + +Tensor NestedTensor_sum_dim( + const Tensor& self, + c10::ArrayRef dims, + bool keepdims, + c10::optional dtype) { + auto my_sum = [](const Tensor& self, + IntArrayRef dims, + bool keepdims, + c10::optional dtype) { + return at::sum(self, dims, keepdims, dtype); + }; + return NestedTensor_func_dim( + my_sum, self, dims, keepdims, dtype); +} + +std::tuple NestedTensor_max_dim( + const Tensor& self, + int64_t dim, + bool keepdims) { + int64_t nested_dim = get_nested_tensor_impl(self)->nested_dim(); + at::Tensor output = self; + if (dim >= nested_dim) { + std::vector result = unzip(map( + [nested_dim, dim, keepdims](at::Tensor tensor) { + auto tmp = at::max(tensor, dim - nested_dim, keepdims); + std::vector result_i; + result_i.push_back(std::get<0>(tmp)); + result_i.push_back(std::get<1>(tmp)); + return result_i; + }, + get_nested_tensor_structure(output))); + return std::make_tuple( + wrap_tensor_node(std::move(result[0])), + wrap_tensor_node(std::move(result[1]))); + } + auto opt_sizes = get_opt_sizes(output); + TORCH_CHECK( + opt_sizes[dim], + "Current shape doesn't support reduction across nested dimension. Please open a feature request https://t.ly/62F6."); + auto new_nested_size = get_nested_size(output); + new_nested_size = squeeze(new_nested_size, dim, keepdims); + auto tmp = + at::max(NestedTensor_to_tensor(output, c10::nullopt), dim, keepdims); + return std::make_tuple( + wrap_buffer(std::get<0>(tmp).reshape({-1}), new_nested_size), + wrap_buffer(std::get<1>(tmp).reshape({-1}), new_nested_size)); +} + +Tensor NestedTensor_max(const Tensor& self) { + auto tensors = flatten_nested_tensor(map_nested_tensor( + [](at::Tensor tensor) { return at::max(tensor); }, self)); + if (tensors.size() == 0) { return at::ones({0}); } auto all_tensor = at::stack(tensors); - return at::mean(all_tensor, dtype); + return at::max(all_tensor); } -Tensor NestedTensor_prod(const Tensor& self, c10::optional dtype) { - auto tensors = flatten( - map([&dtype](at::Tensor tensor) { return at::prod(tensor, dtype); }, - get_nested_tensor_structure(self))); +Tensor NestedTensor_mean_dim( + const Tensor& self, + c10::ArrayRef dims, + bool keepdims, + c10::optional dtype) { + auto my_mean = [](const Tensor& self, + IntArrayRef dims, + bool keepdims, + c10::optional dtype) { + return at::mean(self, dims, keepdims, dtype); + }; + return NestedTensor_func_dim( + my_mean, self, dims, keepdims, dtype); +} + +Tensor NestedTensor_sum(const Tensor& self, c10::optional dtype) { + auto tensors = flatten_nested_tensor(map_nested_tensor( + [&dtype](at::Tensor tensor) { return at::sum(tensor, dtype); }, self)); if (tensors.size() == 0) { if (dtype) { - return at::ones({1}, *dtype); + return at::ones({0}, *dtype); } - return at::ones({1}); + return at::ones({0}); } auto all_tensor = at::stack(tensors); - return at::prod(all_tensor, dtype); + return at::sum(all_tensor, dtype); } -struct NestedTensorFunction_sum - : public torch::autograd::Function { - static Tensor forward( - torch::autograd::AutogradContext* ctx, - const Tensor& input_, - c10::optional dtype) { - auto input = map_nested_tensor( - [](Tensor t) { - // XXX: Does this require autogradmode(true)? - AutoGradMode autogradmode(true); - auto alias = t.alias(); - alias.requires_grad_(); - return alias; - }, - input_); - auto tensors = flatten(map( - [&dtype](at::Tensor tensor) { - AutoGradMode autogradmode(true); - return at::sum(tensor, dtype); - }, - get_nested_tensor_structure(input))); - Tensor result; - { - AutoGradMode autogradmode(true); - if (tensors.size() == 0) { - if (dtype) { - return at::ones({0}, *dtype); +Tensor NestedTensor_mean(const Tensor& self, c10::optional dtype) { + return at::sum(self, dtype).div_(torch::tensor(get_numel(self))); +} + +std::tuple _make_m2( + const std::vector& tensors, + IntArrayRef tensordims) { + std::vector m2_tensors; + std::vector mean_tensors; + std::vector numel_tensors; + for (size_t i = 0; i < tensors.size(); i++) { + at::Tensor mean = at::mean(tensors[i], tensordims, true); + at::Tensor centered = tensors[i] - mean; + m2_tensors.push_back((centered * centered).sum(tensordims, true)); + mean_tensors.push_back(mean); + int64_t numel = get_numel(tensors[i]) / get_numel(mean); + numel_tensors.push_back(torch::zeros_like(mean, torch::kLong).fill_(numel)); + // numel_tensors.push_back(torch::tensor({numel})); + } + at::Tensor m2_tensor = at::stack(m2_tensors); + at::Tensor mean_tensor = at::stack(mean_tensors); + at::Tensor numel_tensor = at::stack(numel_tensors); + return std::make_tuple(m2_tensor, mean_tensor, numel_tensor); +} + +std::tuple _merge_m2( + Tensor m2_tensor, + Tensor mean_tensor, + Tensor numel) { + if (m2_tensor.size(0) <= 1) { + return std::make_tuple(m2_tensor, mean_tensor, numel); + } + int64_t start = 0; + int64_t mid = m2_tensor.size(0) / 2; + int64_t end = mid * 2; + at::Tensor numel_0 = at::slice(numel, 0, start, mid); + at::Tensor numel_1 = at::slice(numel, 0, mid, end); + at::Tensor mean_0 = at::slice(mean_tensor, 0, start, mid); + at::Tensor mean_1 = at::slice(mean_tensor, 0, mid, end); + at::Tensor m2_0 = at::slice(m2_tensor, 0, start, mid); + at::Tensor m2_1 = at::slice(m2_tensor, 0, mid, end); + at::Tensor numel_prod = numel_0 * numel_1; + at::Tensor numel_sum = numel_0 + numel_1; + at::Tensor delta = mean_0 - mean_1; + at::Tensor output_m2 = + (m2_0 + m2_1) + delta * delta * (numel_prod / numel_sum); + at::Tensor new_mean = + (numel_0 / numel_sum) * mean_0 + (numel_1 / numel_sum) * mean_1; + if (end < m2_tensor.size(0)) { + output_m2 = torch::cat({output_m2, at::slice(m2_tensor, 0, end)}); + new_mean = torch::cat({new_mean, at::slice(mean_tensor, 0, end)}); + numel_sum = torch::cat({numel_sum, at::slice(numel, 0, end)}); + } + return _merge_m2(output_m2, new_mean, numel_sum); +} + +Tensor NestedTensor_var(const Tensor& self, bool unbiased) { + at::Tensor m2_tensor, mean_tensor, numel; + std::vector tensors = flatten(get_nested_tensor_structure(self)); + if (tensors.size() == 0) { + return at::ones({0}); + } + std::vector tensordims; + for (int64_t i = 0; i < get_dim(tensors[0]); i++) { + tensordims.push_back(i); + } + std::tie(m2_tensor, mean_tensor, numel) = + _make_m2(tensors, IntArrayRef(tensordims)); + std::tie(m2_tensor, mean_tensor, numel) = + _merge_m2(m2_tensor, mean_tensor, numel); + TORCH_CHECK(m2_tensor.size(0) == 1, "output size wrong."); + if (unbiased) { + return (m2_tensor / (numel - 1)).reshape({}); + } + return (m2_tensor / numel).reshape({}); +} + +Tensor NestedTensor_var_dim( + const Tensor& self, + IntArrayRef dims, + bool unbiased, + bool keepdims) { + std::vector tensordims; + std::vector nesteddims; + std::tie(tensordims, nesteddims) = make_split_dims(self, dims); + + auto nested_size = get_nested_size(self); + int64_t nested_dim = get_nested_tensor_impl(self)->nested_dim(); + auto new_nested_size = map( + [&tensordims](std::vector sizes) { + std::vector new_sizes; + for (size_t i = 0; i < sizes.size(); i++) { + if (std::find(tensordims.begin(), tensordims.end(), i) == + tensordims.end()) { + new_sizes.push_back(sizes[i]); + } } - return at::ones({0}); - } - auto all_tensor = at::stack(tensors); - result = at::sum(all_tensor, dtype); - } - ctx->save_for_backward({result, input}); - return result.alias(); - } - static torch::autograd::variable_list backward( - torch::autograd::AutogradContext* ctx, - torch::autograd::variable_list grad_output_) { - auto saved = ctx->get_saved_variables(); - at::Tensor result = saved[0]; - at::Tensor input = saved[1]; - at::Tensor grad_output = grad_output_[0]; + return new_sizes; + }, + nested_size); + if (nesteddims.size() > 0) { + TORCH_CHECK( + nesteddims.size() == 1 && nesteddims[0] == 0, + "Can only reduce across nested dimension 0."); TORCH_CHECK( - !grad_output.requires_grad(), - "NestedTensor sum doesn't support double backward."); - Tensor undef; - // TODO: - // Flatten constituents and call grad on all of the variable lists at once - // - at::Tensor tensor = map_nested_tensor( - [&](Tensor i) { - // return grad_output.expand(i.sizes()); - return torch::autograd::grad({result}, {i}, {grad_output}, true)[0]; + nested_dim == 1, + "Can only reduce across nested dimensions if given nested tensor is of nested dimension 1."); + auto opt_sizes = construct_size(new_nested_size); + for (size_t i = 1; i < opt_sizes.size(); i++) { + TORCH_CHECK( + opt_sizes[i], + "Can only reduce across nested dimensions of Tensor compliant shapes.") + } + new_nested_size = squeeze(new_nested_size, 0, keepdims); + } + if (tensordims.size() == 0) { + return wrap_buffer( + at::var( + NestedTensor_to_tensor(self, c10::nullopt), 0, unbiased, keepdims) + .reshape({-1}), + new_nested_size); + } + if (nesteddims.size() == 0) { + return map_nested_tensor( + [tensordims, unbiased, keepdims](at::Tensor t) { + return at::var(t, tensordims, unbiased, keepdims); }, - input); - return {tensor, undef}; + self); } -}; -Tensor NestedTensor_sum(const Tensor& self, c10::optional dtype) { - return NestedTensorFunction_sum::apply(self, dtype); + at::Tensor m2_tensor, mean_tensor, numel; + std::vector tensors = flatten(get_nested_tensor_structure(self)); + std::tie(m2_tensor, mean_tensor, numel) = + _make_m2(tensors, IntArrayRef(tensordims)); + std::tie(m2_tensor, mean_tensor, numel) = + _merge_m2(m2_tensor, mean_tensor, numel); + if (unbiased) { + return wrap_buffer( + (m2_tensor / (numel - 1)).reshape({-1}), new_nested_size); + } + return wrap_buffer((m2_tensor / numel).reshape({-1}), new_nested_size); +} + +Tensor NestedTensor_prod(const Tensor& self, c10::optional dtype) { + auto tensors = flatten_nested_tensor(map_nested_tensor( + [&dtype](at::Tensor tensor) { return at::prod(tensor, dtype); }, self)); + if (tensors.size() == 0) { + if (dtype) { + return at::ones({1}, *dtype); + } + return at::ones({1}); + } + auto all_tensor = at::stack(tensors); + return at::prod(all_tensor, dtype); } -TORCH_LIBRARY_IMPL(aten, AutogradPrivateUse1, m) { +TORCH_LIBRARY_IMPL(aten, NestedTensor, m) { nt_impl(m, "sum", NestedTensor_sum); nt_impl(m, "sum.dim_IntList", NestedTensor_sum_dim); - nt_impl(m, "mean.dim", NestedTensor_mean_dim); nt_impl(m, "mean", NestedTensor_mean); + nt_impl(m, "mean.dim", NestedTensor_mean_dim); + nt_impl(m, "max", NestedTensor_max); + nt_impl(m, "max.dim", NestedTensor_max_dim); + nt_impl(m, "var", NestedTensor_var); + nt_impl(m, "var.dim", NestedTensor_var_dim); nt_impl(m, "prod", NestedTensor_prod); nt_impl(m, "cumsum", NestedTensor_cumsum); } diff --git a/nestedtensor/csrc/SoftMax.cpp b/nestedtensor/csrc/SoftMax.cpp new file mode 100644 index 00000000..9149d716 --- /dev/null +++ b/nestedtensor/csrc/SoftMax.cpp @@ -0,0 +1,53 @@ +#include +#include +#include +#include +#include + +using namespace torch::nn; +namespace F = torch::nn::functional; + +namespace at { + +Tensor NestedTensor_softmax( + const Tensor& input, + const int64_t dim_, + c10::optional dtype) { + int64_t dim = maybe_wrap_dim(dim_, get_dim(input)); + auto input_data = get_nested_tensor_impl(input); + int64_t nested_dim = input_data->nested_dim(); + TORCH_CHECK( + dim >= nested_dim, + "Cannot apply softmax across nested dimensions ", + std::to_string(dim)); + return map_nested_tensor( + [dim, nested_dim, dtype](const at::Tensor t) { + return at::softmax(t, dim - nested_dim, dtype); + }, + input); +} + +Tensor NestedTensor_log_softmax( + const Tensor& input, + const int64_t dim_, + c10::optional dtype) { + int64_t dim = maybe_wrap_dim(dim_, get_dim(input)); + auto input_data = get_nested_tensor_impl(input); + int64_t nested_dim = input_data->nested_dim(); + TORCH_CHECK( + dim >= nested_dim, + "Cannot apply log_softmax across nested dimensions ", + std::to_string(dim)); + return map_nested_tensor( + [dim, nested_dim, dtype](const at::Tensor t) { + return at::log_softmax(t, dim - nested_dim, dtype); + }, + input); +} + +TORCH_LIBRARY_IMPL(aten, NestedTensor, m) { + nt_impl(m, "softmax.int", NestedTensor_softmax); + nt_impl(m, "log_softmax.int", NestedTensor_log_softmax); +} + +} // namespace at diff --git a/nestedtensor/csrc/UnaryOps.cpp b/nestedtensor/csrc/UnaryOps.cpp index 1ece762b..99cfcf3e 100644 --- a/nestedtensor/csrc/UnaryOps.cpp +++ b/nestedtensor/csrc/UnaryOps.cpp @@ -23,23 +23,21 @@ Tensor& NestedTensor_unary_method_(Tensor& self) { template Tensor NestedTensor_unary(const Tensor& self) { - return autograd_map_nested_tensor( + return map_nested_tensor( [](at::Tensor tensor) { return func(tensor); }, self); } template -Tensor& NestedTensor_unary_out(Tensor& result, const Tensor& self) { +Tensor& NestedTensor_unary_out(const Tensor& self, Tensor& result) { apply_nested_tensor( - [](at::Tensor& result, at::Tensor& tensor) { func(result, tensor); }, - result, - self); + [](Tensor& result, Tensor& self) { func(result, self); }, result, self); return result; } Tensor& NestedTensor_clamp_( Tensor& self, - optional min, - optional max) { + const optional& min, + const optional& max) { apply_nested_tensor( [min, max](at::Tensor& tensor) { at::clamp_(tensor, min, max); }, self); return self; @@ -47,42 +45,42 @@ Tensor& NestedTensor_clamp_( Tensor NestedTensor_clamp( const Tensor& self, - optional min, - optional max) { - return autograd_map_nested_tensor( + const optional& min, + const optional& max) { + return map_nested_tensor( [min, max](at::Tensor tensor) { return at::clamp(tensor, min, max); }, self); } Tensor& NestedTensor_clamp_out( - Tensor& result, const Tensor& self, - optional min, - optional max) { + const optional& min, + const optional& max, + Tensor& result) { apply_nested_tensor( - [min, max](at::Tensor result, const at::Tensor tensor) { - at::clamp_out(result, tensor, min, max); + [min, max](const at::Tensor self, at::Tensor result) { + at::clamp_out(result, self, min, max); }, - result, - self); + self, + result); return result; } -Tensor& NestedTensor_clamp_min_(Tensor& self, Scalar min) { +Tensor& NestedTensor_clamp_min_(Tensor& self, const c10::Scalar& min) { apply_nested_tensor( [min](at::Tensor& tensor) { at::clamp_min_(tensor, min); }, self); return self; } -Tensor NestedTensor_clamp_min(const Tensor& self, Scalar min) { - return autograd_map_nested_tensor( +Tensor NestedTensor_clamp_min(const Tensor& self, const c10::Scalar& min) { + return map_nested_tensor( [min](at::Tensor tensor) { return at::clamp_min(tensor, min); }, self); } Tensor& NestedTensor_clamp_min_out( - Tensor& result, const Tensor& self, - Scalar min) { + const c10::Scalar& min, + Tensor& result) { apply_nested_tensor( [min](at::Tensor result, const at::Tensor tensor) { at::clamp_min_out(result, tensor, min); @@ -92,24 +90,24 @@ Tensor& NestedTensor_clamp_min_out( return result; } -Tensor& NestedTensor_clamp_max_(Tensor& self, Scalar min) { +Tensor& NestedTensor_clamp_max_(Tensor& self, const c10::Scalar& min) { apply_nested_tensor( [min](at::Tensor tensor) { at::clamp_max_(tensor, min); }, self); return self; } -Tensor NestedTensor_clamp_max(const Tensor& self, Scalar min) { - return autograd_map_nested_tensor( +Tensor NestedTensor_clamp_max(const Tensor& self, const c10::Scalar& min) { + return map_nested_tensor( [min](at::Tensor tensor) { return at::clamp_max(tensor, min); }, self); } Tensor& NestedTensor_clamp_max_out( - Tensor& result, const Tensor& self, - Scalar min) { + const Scalar& max, + Tensor& result) { apply_nested_tensor( - [min](at::Tensor result, const at::Tensor tensor) { - at::clamp_max_out(result, tensor, min); + [max](Tensor result, const Tensor tensor) { + at::clamp_max_out(result, tensor, max); }, result, self); @@ -122,7 +120,7 @@ Tensor& NestedTensor_mvlgamma_(Tensor& self, int64_t p) { } Tensor NestedTensor_mvlgamma(const Tensor& self, int64_t p) { - return autograd_map_nested_tensor( + return map_nested_tensor( [p](at::Tensor tensor) { return at::mvlgamma(tensor, p); }, self); } @@ -157,7 +155,7 @@ Tensor NestedTensor_mvlgamma(const Tensor& self, int64_t p) { #NAME "_", \ (NestedTensor_unary_)); -TORCH_LIBRARY_IMPL(aten, AutogradPrivateUse1, m) { +TORCH_LIBRARY_IMPL(aten, NestedTensor, m) { UNARY_OP(abs); UNARY_OP(acos); UNARY_OP(asin); @@ -182,7 +180,7 @@ TORCH_LIBRARY_IMPL(aten, AutogradPrivateUse1, m) { // UNARY_OP(mvlgamma); UNARY_OP(neg); UNARY_OP(reciprocal); - UNARY_OP(round); + // UNARY_OP(round); UNARY_OP(rsqrt); UNARY_OP(sigmoid); UNARY_OP_INPLACE_METHOD(sign) diff --git a/nestedtensor/csrc/activation.cpp b/nestedtensor/csrc/activation.cpp index db1aa05d..cb7f5688 100644 --- a/nestedtensor/csrc/activation.cpp +++ b/nestedtensor/csrc/activation.cpp @@ -9,20 +9,38 @@ namespace F = torch::nn::functional; namespace at { Tensor NestedTensor_gelu(const Tensor& self) { - return autograd_map_nested_tensor( + if (is_nested_tensor_impl(self) && get_is_contiguous(self)) { + return wrap_buffer( + at::gelu(get_buffer(self)), + get_efficient_nested_size(self), + get_efficient_nested_stride(self)); + } + return map_nested_tensor( [](at::Tensor tensor) { return at::gelu(tensor); }, self); } +Tensor NestedTensor_elu(const Tensor& self, const Scalar& alpha, const Scalar& scale, const Scalar& input_scale) { + if (is_nested_tensor_impl(self) && get_is_contiguous(self)) { + return wrap_buffer( + at::elu(get_buffer(self), alpha, scale, input_scale), + get_efficient_nested_size(self), + get_efficient_nested_stride(self)); + } + return map_nested_tensor( + [&alpha, &scale, &input_scale](at::Tensor tensor) { return at::elu(tensor, alpha, scale, input_scale); }, self); +} + // Registered below autograd Tensor NestedTensor_relu(const Tensor& self) { auto impl = get_nested_tensor_impl(self); auto structure = get_nested_tensor_structure(self); - if (structure.buffer()) { + if (get_is_contiguous(self)) { #ifdef TRACEPACKED std::cout << "calling packed relu" << std::endl; #endif - return wrap_tensor_node(torch::nested_tensor::impl::build_structure( - at::relu(*structure.buffer()), impl->nested_size())); + return wrap_buffer(at::relu(get_buffer(self)), + get_efficient_nested_size(self), + get_efficient_nested_stride(self)); } return map_nested_tensor( [](at::Tensor tensor) { return at::relu(tensor); }, self); @@ -30,31 +48,26 @@ Tensor NestedTensor_relu(const Tensor& self) { // Registered below autograd Tensor& NestedTensor_relu_(Tensor& self) { + if (get_is_contiguous(self) || get_is_contiguous(self, c10::MemoryFormat::ChannelsLast)) { +#ifdef TRACEPACKED + std::cout << "calling packed relu_" << std::endl; +#endif + Tensor buffer = get_buffer(self); + at::relu_(buffer); + return self; + } apply_nested_tensor([](at::Tensor& tensor) { at::relu_(tensor); }, self); return self; } -// Registered below autograd -Tensor NestedTensor_threshold_backward( - const Tensor& grad, - const Tensor& self, - Scalar threshold) { - return map_nested_tensor( - [&](at::Tensor g, at::Tensor s) { - return threshold_backward(g, s, threshold); - }, - grad, - self); -} - -TORCH_LIBRARY_IMPL(aten, AutogradPrivateUse1, m) { +TORCH_LIBRARY_IMPL(aten, NestedTensor, m) { nt_impl(m, "gelu", NestedTensor_gelu); + nt_impl(m, "elu", NestedTensor_elu); } -TORCH_LIBRARY_IMPL(aten, PrivateUse1, m) { +TORCH_LIBRARY_IMPL(aten, NestedTensor, m) { nt_impl(m, "relu", NestedTensor_relu); nt_impl(m, "relu_", NestedTensor_relu_); - nt_impl(m, "threshold_backward", NestedTensor_threshold_backward); } } // namespace at diff --git a/nestedtensor/csrc/autograd_functions.cpp b/nestedtensor/csrc/autograd_functions.cpp index 0d3c4091..6fa0cd65 100644 --- a/nestedtensor/csrc/autograd_functions.cpp +++ b/nestedtensor/csrc/autograd_functions.cpp @@ -2,6 +2,11 @@ #include #include #include +#ifdef WITH_CUDA +#include +#include +#include +#endif using namespace torch::nn; namespace F = torch::nn::functional; @@ -9,8 +14,11 @@ namespace F = torch::nn::functional; namespace at { Tensor NestedTensor_dropout(const Tensor& input, double p, bool train) { - return autograd_map_nested_tensor( - [&](const at::Tensor t) { return at::dropout(t, p, train); }, input); + if (train) { + return map_nested_tensor( + [&](const at::Tensor t) { return at::dropout(t, p, train); }, input); + } + return input; } Tensor NestedTensor_upsample_bilinear2d( @@ -19,7 +27,7 @@ Tensor NestedTensor_upsample_bilinear2d( bool align_corners, c10::optional scales_h, c10::optional scales_w) { - return autograd_map_nested_tensor( + return map_nested_tensor( [&](at::Tensor t) { return at::upsample_bilinear2d( t.unsqueeze(0), @@ -35,17 +43,185 @@ Tensor NestedTensor_upsample_bilinear2d( Tensor NestedTensor_clone( const Tensor& src, c10::optional optional_memory_format) { - return autograd_map_nested_tensor( + return map_nested_tensor( [&optional_memory_format](Tensor a) { return at::clone(a, optional_memory_format); }, src); } -TORCH_LIBRARY_IMPL(aten, AutogradPrivateUse1, m) { +void check_dims_match_num_input_features( + const char* arg_name, + int64_t expected, + int64_t actual) { + TORCH_CHECK( + actual == expected, + arg_name, + " should contain ", + expected, + " elements not ", + actual); +} + +std::vector make_reduce_dims(int64_t input_dim) { + std::vector result; + result.push_back(0); + for (int64_t i = 2; i < input_dim; i++) { + result.push_back(i); + } + return result; +} + +std::vector make_scalar_shape(int64_t input_dim, int64_t n_input) { + std::vector result; + result.push_back(1); + result.push_back(n_input); + for (int64_t i = 2; i < input_dim; i++) { + result.push_back(1); + } + return result; +} + +Tensor NestedTensor_batch_norm( + const Tensor& input, + const c10::optional& weight /* optional */, + const c10::optional& bias /* optional */, + const c10::optional& running_mean /* optional */, + const c10::optional& running_var /* optional */, + bool training, + double momentum, + double eps, + bool cudnn_enabled) { + auto opt_sizes = get_nested_tensor_impl(input)->opt_sizes(); + TORCH_CHECK(opt_sizes[1], "batch norm requires regular second dimension."); + TORCH_CHECK(!training, "batch norm does not support training."); + int64_t n_input = *opt_sizes[1]; + TORCH_CHECK(running_mean, "running_mean must be defined in evaluation mode"); + TORCH_CHECK(running_var, "running_var must be defined in evaluation mode"); + if (weight) { + check_dims_match_num_input_features("weight", n_input, get_numel(*weight)); + } + if (bias) { + check_dims_match_num_input_features("bias", n_input, get_numel(*bias)); + } + + at::Tensor mean = *running_mean; + at::Tensor var = *running_var; +#ifdef WITH_CUDA + if (weight && + bias && + (is_nested_tensor_impl(input)) && + (!is_nested_tensor_impl(mean)) && + (!is_nested_tensor_impl(var)) && + (!is_nested_tensor_impl(*bias)) && + (!is_nested_tensor_impl(*weight)) && + (input.dtype() == torch::kHalf) && + (mean.dtype() == torch::kHalf) && + (var.dtype() == torch::kHalf) && + (bias->dtype() == torch::kHalf) && + (weight->dtype() == torch::kHalf) && + get_is_cuda(input) + ) + { + // Custom CUDA Half implementation. + mean = mean.contiguous(); + Tensor bias_cont = (*bias).contiguous(); + Tensor weight_cont = (*weight).contiguous(); + Tensor running_var_cont = (*running_var).contiguous(); + + c10::Half* mean_ptr = mean.data_ptr(); + c10::Half* bias_ptr = bias_cont.data_ptr(); + c10::Half* weight_ptr = weight_cont.data_ptr(); + c10::Half* running_var_ptr = running_var_cont.data_ptr(); + + if (get_is_contiguous(input, c10::MemoryFormat::ChannelsLast)) { + Tensor input_buffer = get_buffer(input); + int64_t num_channel = weight_cont.size(0); + at::cuda::CUDAStream defaultStream = at::cuda::getDefaultCUDAStream(); + nested_tensor::cuda::batchnorm_inference_channels_last_kernelLauncher( + input_buffer.data_ptr(), + mean_ptr, + running_var_ptr, + c10::Half((float)(eps)), + weight_ptr, + bias_ptr, + input_buffer.data_ptr(), + num_channel, + input_buffer.numel(), + defaultStream); + input_buffer = input_buffer.view(-1); + return wrap_buffer(std::move(input_buffer), get_efficient_nested_size(input), get_efficient_nested_stride(input)); + } + + Tensor output = input; + output = NestedTensor_contiguous(output); + Tensor input_buffer = get_buffer(output); + // Tensor output_buffer = input_buffer.clone(); + + auto self_opt_sizes = get_opt_sizes(input); + + Tensor nt_sizes_ = + get_efficient_nested_size(input).sizes(); // .to(torch::kInt32); + Tensor nt_sizes_1 = at::native::narrow(nt_sizes_, 1, 1, 1); + Tensor nt_sizes_2 = at::native::narrow(nt_sizes_, 1, 2, 1); + Tensor nt_sizes_all = nt_sizes_1 * nt_sizes_2; + int64_t* nt_sizes_all_ptr = nt_sizes_all.data_ptr(); + at::Tensor numbers_t = at::empty({1 + (nt_sizes_all.size(0) * *self_opt_sizes[1])}, torch::kInt64); + int64_t* numbers_t_ptr = numbers_t.data_ptr(); + numbers_t_ptr[0] = 0; + int64_t index = 1; + for (int64_t i = 0; i < nt_sizes_all.size(0); i++) { + for (int64_t j = 0; j < *self_opt_sizes[1]; j++) { + numbers_t_ptr[index] = (numbers_t_ptr[index - 1] + nt_sizes_all_ptr[i]); + index++; + } + } + Tensor nt_sizes = numbers_t.to(at::Device(kCUDA), torch::kInt32, true, true); + + at::cuda::CUDAStream defaultStream = at::cuda::getDefaultCUDAStream(); + nested_tensor::cuda::batchnorm_inference_kernelLauncher( + input_buffer.data_ptr(), + mean_ptr, + running_var_ptr, + c10::Half((float)(eps)), + weight_ptr, + bias_ptr, + input_buffer.data_ptr(), + // output_buffer.data_ptr(), + (int)(*self_opt_sizes[0]), + (int)(weight_cont.size(0)), + (int)(*self_opt_sizes[0] * + *self_opt_sizes[1] * + *self_opt_sizes[2] * + *self_opt_sizes[3]), + nt_sizes.data_ptr(), + defaultStream + ); + return wrap_buffer(std::move(input_buffer), get_efficient_nested_size(output), get_efficient_nested_stride(output)); + } +#endif + auto scalar_shape = make_scalar_shape(get_dim(input), n_input); + + at::Tensor invstd = 1 / at::sqrt(*running_var + eps); + + Tensor output = input; + output = output - mean.reshape(IntArrayRef(scalar_shape)); + output = output * invstd.reshape(IntArrayRef(scalar_shape)); + + if (weight) { + output = output * weight->reshape(IntArrayRef(scalar_shape)); + } + if (bias) { + output = output + bias->reshape(IntArrayRef(scalar_shape)); + } + return output; +} + +TORCH_LIBRARY_IMPL(aten, NestedTensor, m) { // nt_impl(m, "upsample_bilinear2d", NestedTensor_upsample_bilinear2d); nt_impl(m, "clone", NestedTensor_clone); nt_impl(m, "dropout", NestedTensor_dropout); + nt_impl(m, "batch_norm", NestedTensor_batch_norm); } } // namespace at diff --git a/nestedtensor/csrc/conv2d.cpp b/nestedtensor/csrc/conv2d.cpp index 4542424b..218070b1 100644 --- a/nestedtensor/csrc/conv2d.cpp +++ b/nestedtensor/csrc/conv2d.cpp @@ -2,97 +2,110 @@ #include #include #include +#ifdef WITH_CUDA +#include +#include +#include +#include +#endif +#include +#include using namespace torch::nn; namespace F = torch::nn::functional; namespace at { -namespace impl { -// Transliteration of -// https://github.com/pytorch/pytorch/blob/1f0cfbaaad09921f588adf549751041b8cb2e283/torch/nn/grad.py#L8 -// into C++ -std::vector _grad_input_padding( - at::Tensor grad_output, - IntArrayRef input_size_, - IntArrayRef stride, - IntArrayRef padding, - IntArrayRef kernel_size, - IntArrayRef dilation) { - size_t k = grad_output.dim() - 2; - std::vector input_size; - if (input_size_.size() == k + 2) { - for (size_t i = 2; i < k + 2; i++) { - input_size.push_back(input_size_[i]); - } - } else { - input_size = input_size_.vec(); - } - TORCH_CHECK( - input_size.size() == k, - "input_size must have ", - k + 2, - " elements (got ", - input_size_.size(), - ")"); - - std::vector result_size; - for (size_t d = 0; d < k; d++) { - int64_t min_size = ((grad_output.size(d + 2) - 1) * stride[d]) - - (2 * padding[d]) + 1 + (dilation[d] * (kernel_size[d] - 1)); - int64_t max_size = min_size + stride[d] - 1; - TORCH_CHECK( - !(input_size[d] < min_size || input_size[d] > max_size), - "input grad size outside of valid range. input_size[", - d, - "]: ", - input_size[d], - " min_size: ", - min_size, - " max_size: ", - max_size); - result_size.push_back(input_size[d] - min_size); - } - return result_size; -} - -// Transliteration of -// https://github.com/pytorch/pytorch/blob/1f0cfbaaad09921f588adf549751041b8cb2e283/torch/nn/grad.py#L129 -// into C++ -at::Tensor _conv2d_grad_input( - const Tensor& grad_output, - const Tensor& input, +Tensor NestedTensor_conv2d( + const Tensor& input_, const Tensor& weight, const c10::optional& bias, IntArrayRef stride, IntArrayRef padding, IntArrayRef dilation, int64_t groups) { - std::vector kernel_size{weight.size(2), weight.size(3)}; - auto grad_input_padding = _grad_input_padding( - grad_output, - input.sizes(), - IntArrayRef(stride), - IntArrayRef(padding), - IntArrayRef(kernel_size), - IntArrayRef(dilation)); - auto grad_input = at::conv_transpose2d( - grad_output, - weight, - c10::nullopt, //*bias, - IntArrayRef(stride), - IntArrayRef(padding), - IntArrayRef(grad_input_padding), - groups, - IntArrayRef(dilation)); - return grad_input; + Tensor input = input_; + TORCH_CHECK(get_dim(input) == 4, "Expected input to be dim 4, but got ", get_dim(input), "."); +#ifdef WITH_CUDA + auto self_opt_sizes = get_opt_sizes(input); + if (is_nested_tensor_impl(input) && + !is_nested_tensor_impl(weight) && + (input.dtype() == torch::kFloat16 || input.dtype() == torch::kFloat32)) { + if (get_dim(input) == 4 && !bias && weight.size(2) == 1 && weight.size(3) == 1 && + stride[0] == 1 && stride[1] == 1 && + padding[0] == 0 && padding[1] == 0 && + dilation[0] == 1 && dilation[1] == 1 && + groups == 1 && + *self_opt_sizes[0] && + *self_opt_sizes[1] && + get_is_cuda(input) + ) { + if (get_is_contiguous(input, c10::MemoryFormat::ChannelsLast)) { + Tensor input_buffer = get_buffer(input); + input_buffer = input_buffer.view({-1, weight.size(1)}); + at::Tensor result_buffer = at::matmul(input_buffer, + weight.reshape({weight.size(0), weight.size(1)}).transpose(0, 1)); + int64_t weight_size_0 = weight.size(0); + auto new_sizes = map_efficient_size([&weight_size_0](int64_t* size_ptr, int64_t size) { + size_ptr[0] = weight_size_0; + }, get_efficient_nested_size(input)); + auto new_strides = map_efficient_size([] (int64_t* size_ptr, int64_t size) { + int64_t tmp2 = size_ptr[2]; + size_ptr[2] = size_ptr[0]; + int64_t tmp1 = size_ptr[1]; + size_ptr[1] = size_ptr[2] * tmp2; + size_ptr[0] = 1; + }, new_sizes); + return wrap_buffer(result_buffer.view(-1), new_sizes, new_strides); + } + if (get_is_contiguous(input)) { + input = transpose_nchw_nhwc(input); + Tensor input_buffer = get_buffer(input); + input_buffer = input_buffer.reshape({-1, weight.size(1)}); + at::Tensor result_buffer = at::matmul(input_buffer, + weight.reshape({weight.size(0), weight.size(1)}).transpose(0, 1)); + int64_t weight_size_0 = weight.size(0); + auto new_sizes = map_efficient_size([&weight_size_0](int64_t* size_ptr, int64_t size) { + size_ptr[2] = weight_size_0; + }, get_efficient_nested_size(input)); + Tensor result = wrap_buffer(result_buffer.reshape(-1), new_sizes); + return transpose_nhwc_nchw(result); + } + } + } +#endif + if (input.dtype() == torch::kFloat16) { + at::Tensor data = to_padded_tensor(input, 0); + at::Tensor result_data = at::conv2d(data, weight, bias, stride, padding, dilation, groups); + auto new_sizes = map_efficient_size([&weight, &stride, &padding, &groups, &dilation](int64_t* size_ptr, int64_t size) { + size_ptr[0] = weight.size(0); + size_ptr[1] = ((size_ptr[1] + 2 * padding[0] - dilation[0] * (weight.size(2) - 1) - 1) / stride[0]) + 1; + size_ptr[2] = ((size_ptr[2] + 2 * padding[1] - dilation[1] * (weight.size(3) - 1) - 1) / stride[1]) + 1; + }, get_efficient_nested_size(input)); + Tensor result = from_padded_tensor(result_data, new_sizes); + if (get_is_contiguous(input, c10::MemoryFormat::ChannelsLast)) { + return NestedTensor_contiguous(result, c10::MemoryFormat::ChannelsLast); + } + return result; + } + if (bias) { + return map_nested_tensor( + [&stride, &padding, &dilation, &groups](at::Tensor input, at::Tensor weight, at::Tensor bias) { + return at::conv2d(input.unsqueeze(0), weight, bias, stride, padding, dilation, groups).squeeze(0); + }, + input, + weight, + *bias); + } + return map_nested_tensor( + [&stride, &padding, &dilation, &groups](at::Tensor input, at::Tensor weight) { + return at::conv2d(input.unsqueeze(0), weight, c10::nullopt, stride, padding, dilation, groups).squeeze(0); + }, + input, + weight); } -// Transliteration of -// https://github.com/pytorch/pytorch/blob/1f0cfbaaad09921f588adf549751041b8cb2e283/torch/nn/grad.py#L170 -// into C++ -at::Tensor _conv2d_grad_weight( - const Tensor& grad_output_, +Tensor NestedTensor_cudnn_convolution_relu( const Tensor& input_, const Tensor& weight, const c10::optional& bias, @@ -100,174 +113,89 @@ at::Tensor _conv2d_grad_weight( IntArrayRef padding, IntArrayRef dilation, int64_t groups) { - int64_t in_channels = input_.size(1); - int64_t out_channels = grad_output_.size(1); - int64_t min_batch = input_.size(0); - auto weight_size = weight.sizes(); - // std::cout << "00 grad_output_.sizes(): " << grad_output_.sizes()<< - // std::endl; - at::Tensor grad_output = - grad_output_.contiguous().repeat({1, in_channels / groups, 1, 1}); - grad_output = - grad_output.contiguous().view({grad_output.size(0) * grad_output.size(1), - 1, - grad_output.size(2), - grad_output.size(3)}); - at::Tensor input = input_.contiguous().view( - {1, input_.size(0) * input_.size(1), input_.size(2), input_.size(3)}); - at::Tensor grad_weight = at::conv2d( - input, - grad_output, - c10::nullopt, - dilation, - padding, - stride, - in_channels * min_batch); - grad_weight = grad_weight.contiguous().view({min_batch, - grad_weight.size(1) / min_batch, - grad_weight.size(2), - grad_weight.size(3)}); - return grad_weight.sum(0) - .view({in_channels / groups, - out_channels, - grad_weight.size(2), - grad_weight.size(3)}) - .transpose(0, 1) - .narrow(2, 0, weight_size[2]) - .narrow(3, 0, weight_size[3]); -} - -} // namespace impl - -struct NestedTensorFunction_conv2d - : torch::autograd::Function { - static Tensor forward( - torch::autograd::AutogradContext* ctx, - const Tensor& input, - const Tensor& weight, - const c10::optional& bias, - IntArrayRef stride, - IntArrayRef padding, - IntArrayRef dilation, - int64_t groups) { - TORCH_CHECK( - !is_nested_tensor_impl(weight), - "weight needs to be a regular tensors."); - if (bias) { - TORCH_CHECK( - !is_nested_tensor_impl(*bias), "bias needs to be a regular tensors."); + Tensor input = input_; + TORCH_CHECK(get_dim(input) == 4, "Expected input to be dim 4, but got ", get_dim(input), "."); +#ifdef WITH_CUDA + auto self_opt_sizes = get_opt_sizes(input); + if (is_nested_tensor_impl(input) && + !is_nested_tensor_impl(weight) && + (input.dtype() == torch::kFloat16 || input.dtype() == torch::kFloat32)) { + if (get_dim(input) == 4 && !bias && weight.size(2) == 1 && weight.size(3) == 1 && + stride[0] == 1 && stride[1] == 1 && + padding[0] == 0 && padding[1] == 0 && + dilation[0] == 1 && dilation[1] == 1 && + groups == 1 && + *self_opt_sizes[0] && + *self_opt_sizes[1] && + get_is_cuda(input) + ) { + if (get_is_contiguous(input, c10::MemoryFormat::ChannelsLast)) { + Tensor input_buffer = get_buffer(input); + input_buffer = input_buffer.view({-1, weight.size(1)}); + at::Tensor result_buffer = at::matmul(input_buffer, + weight.reshape({weight.size(0), weight.size(1)}).transpose(0, 1)); + int64_t weight_size_0 = weight.size(0); + auto new_sizes = map_efficient_size([&weight_size_0](int64_t* size_ptr, int64_t size) { + size_ptr[0] = weight_size_0; + }, get_efficient_nested_size(input)); + auto new_strides = map_efficient_size([] (int64_t* size_ptr, int64_t size) { + int64_t tmp2 = size_ptr[2]; + size_ptr[2] = size_ptr[0]; + int64_t tmp1 = size_ptr[1]; + size_ptr[1] = size_ptr[2] * tmp2; + size_ptr[0] = 1; + }, new_sizes); + return wrap_buffer(result_buffer.view(-1), new_sizes, new_strides); + } + if (get_is_contiguous(input)) { + input = transpose_nchw_nhwc(input); + Tensor input_buffer = get_buffer(input); + input_buffer = input_buffer.reshape({-1, weight.size(1)}); + at::Tensor result_buffer = at::matmul(input_buffer, + weight.reshape({weight.size(0), weight.size(1)}).transpose(0, 1)); + int64_t weight_size_0 = weight.size(0); + auto new_sizes = map_efficient_size([&weight_size_0](int64_t* size_ptr, int64_t size) { + size_ptr[2] = weight_size_0; + }, get_efficient_nested_size(input)); + Tensor result = wrap_buffer(result_buffer.reshape(-1), new_sizes); + return transpose_nhwc_nchw(result); + } } - // The final call to .contiguous is of questionable general value - // but in the context of DETR we'll make it the default. - at::Tensor output = map_nested_tensor( - [&](at::Tensor t) { - return at::conv2d( - t.unsqueeze(0), - weight, - bias, - stride, - padding, - dilation, - groups) - .squeeze(0); - }, - input); - // std::cout << "00 output.sizes(): " << output.sizes()<< std::endl; - // std::cout << "00 input.sizes(): " << input.sizes()<< std::endl; - at::Tensor undef; - ctx->save_for_backward({weight, bias ? *bias : undef, output, input}); - ctx->saved_data["4"] = stride.vec(); - ctx->saved_data["5"] = padding.vec(); - ctx->saved_data["6"] = groups; - ctx->saved_data["7"] = dilation.vec(); - return output; } - static torch::autograd::variable_list backward( - torch::autograd::AutogradContext* ctx, - // TODO: To prevent double backward (for now) check that grad_output - // doesn't require gradients. - torch::autograd::variable_list grad_output) { - auto saved_data = ctx->get_saved_variables(); - auto weight = saved_data[0]; - c10::optional bias; - if (saved_data[1].defined()) { - bias = saved_data[1]; +#endif + if (input.dtype() == torch::kFloat16) { + at::Tensor data = to_padded_tensor(input, 0); + at::Tensor result_data = at::cudnn_convolution_relu(data, weight, bias, stride, padding, dilation, groups); + auto new_sizes = map_efficient_size([&weight, &stride, &padding, &groups, &dilation](int64_t* size_ptr, int64_t size) { + size_ptr[0] = weight.size(0); + size_ptr[1] = ((size_ptr[1] + 2 * padding[0] - dilation[0] * (weight.size(2) - 1) - 1) / stride[0]) + 1; + size_ptr[2] = ((size_ptr[2] + 2 * padding[1] - dilation[1] * (weight.size(3) - 1) - 1) / stride[1]) + 1; + }, get_efficient_nested_size(input)); + Tensor result = from_padded_tensor(result_data, new_sizes); + if (get_is_contiguous(input, c10::MemoryFormat::ChannelsLast)) { + return NestedTensor_contiguous(result, c10::MemoryFormat::ChannelsLast); } - auto autograd_output = saved_data[2]; - auto autograd_input = saved_data[3]; - - auto stride = ctx->saved_data["4"].toIntList().vec(); - auto padding = ctx->saved_data["5"].toIntList().vec(); - auto groups = ctx->saved_data["6"].toInt(); - auto dilation = ctx->saved_data["7"].toIntList().vec(); - - auto weight_grad = torch::zeros_like(weight); - c10::optional bias_grad; - if (bias) { - bias_grad = torch::zeros_like(*bias); - } - - TORCH_CHECK(grad_output.size() == 1, "not supported 0"); - at::Tensor grad = map_nested_tensor( - [&](at::Tensor r, at::Tensor i, at::Tensor g) { - TORCH_CHECK( - !g.requires_grad(), "conv2d doesn't support double backward."); - if (bias) { - (*bias_grad).add_(g.sum(1).sum(1)); - } - auto i_ = i.unsqueeze(0); - auto g_ = g.unsqueeze(0); - weight_grad.add_(impl::_conv2d_grad_weight( - g_, i_, weight, bias, stride, padding, dilation, groups)); - return impl::_conv2d_grad_input( - g_, i_, weight, bias, stride, padding, dilation, groups) - .squeeze(0); - }, - autograd_output, - autograd_input, - grad_output[0]); - at::Tensor undef; - return {grad, - weight_grad, - bias ? *bias_grad : undef, - undef, - undef, - undef, - undef, - undef}; + return result; } -}; - -Tensor NestedTensor_conv2d( - const Tensor& input, - const Tensor& weight, - const c10::optional& bias, - IntArrayRef stride, - IntArrayRef padding, - IntArrayRef dilation, - int64_t groups) { - // return NestedTensorFunction_conv2d::apply( - // input, weight, bias, stride, padding, dilation, groups); if (bias) { - return autograd_map_nested_tensor( - [&stride, &padding, &dilation, &groups](at::Tensor input, at::Tensor weight, at::Tensor bias) { - return at::conv2d(input.unsqueeze(0), weight, bias, stride, padding, dilation, groups).squeeze(0); - // return at::conv2d(input, self, c10::nullopt, stride, padding, dilation, groups); - }, - input, - weight, - *bias); + return map_nested_tensor( + [&stride, &padding, &dilation, &groups](at::Tensor input, at::Tensor weight, at::Tensor bias) { + return at::cudnn_convolution_relu(input.unsqueeze(0), weight, bias, stride, padding, dilation, groups).squeeze(0); + }, + input, + weight, + *bias); } - return autograd_map_nested_tensor( + return map_nested_tensor( [&stride, &padding, &dilation, &groups](at::Tensor input, at::Tensor weight) { - return at::conv2d(input.unsqueeze(0), weight, c10::nullopt, stride, padding, dilation, groups).squeeze(0); - // return at::conv2d(input, self, c10::nullopt, stride, padding, dilation, groups); + return at::cudnn_convolution_relu(input.unsqueeze(0), weight, c10::nullopt, stride, padding, dilation, groups).squeeze(0); }, input, weight); } -TORCH_LIBRARY_IMPL(aten, AutogradPrivateUse1, m) { +TORCH_LIBRARY_IMPL(aten, NestedTensor, m) { nt_impl(m, "conv2d", NestedTensor_conv2d); + nt_impl(m, "cudnn_convolution_relu", NestedTensor_cudnn_convolution_relu); } } // namespace at diff --git a/nestedtensor/csrc/creation.cpp b/nestedtensor/csrc/creation.cpp index 0e64c783..39ee2068 100644 --- a/nestedtensor/csrc/creation.cpp +++ b/nestedtensor/csrc/creation.cpp @@ -21,9 +21,8 @@ NestedNode py_to_nested_node(py::object&& py_obj) { result.emplace_back(py_to_nested_node(std::move(py_seq_i))); } return NestedNode(std::move(result)); - } else { - return NestedNode(std::move(py_obj)); } + TORCH_CHECK(false, "Currently only supporting a list or tuple of py::object."); } bool _verify_variables( @@ -58,11 +57,11 @@ bool _verify_variables( const at::Tensor& variable = nested_node.payload(); // TODO: Add more checks? - valid = valid && (dim == variable.dim()); + valid = valid && (dim == get_dim(variable)); if (!valid && throw_error) { std::stringstream error; error << "Given Tensor / NestedTensor constiuent of dimension "; - error << variable.dim(); + error << get_dim(variable); error << " doesn't match another constiuent of dimension "; error << dim; error << ". "; @@ -156,7 +155,7 @@ bool _verify_variables( const at::Tensor& first_variable, const TensorNode& nested_node, bool throw_error = false) { - const int64_t dim = first_variable.dim(); + const int64_t dim = get_dim(first_variable); const at::Layout& layout = first_variable.layout(); const at::Device& device = first_variable.device(); const at::ScalarType& scalar_type = first_variable.scalar_type(); @@ -171,26 +170,22 @@ bool _verify_variables( throw_error); } -NestedNode py_to_nested_tensor(const py::object& py_obj) { - if (THPVariable_Check(py_obj.ptr())) { - at::Tensor tensor = THPVariable_Unpack(py_obj.ptr()); - if (is_nested_tensor_impl(tensor)) { - auto tensor_data_structure = - get_nested_tensor_impl(tensor)->get_structure(); - return map( - [](at::Tensor a) { return c10::IValue(a); }, tensor_data_structure); - } - } +TensorNode py_to_nested_tensor(const py::object& py_obj) { if (py::isinstance(py_obj)) { - std::vector> result; + std::vector result; auto py_seq = py::sequence(py_obj); for (size_t i = 0; i < py_seq.size(); i++) { - result.emplace_back(py_to_nested_tensor(py_seq[i])); + const py::object& py_seq_i = py_seq[i]; + TORCH_CHECK(THPVariable_Check(py_seq_i.ptr()), + "Currently only supporting a sequence of Tensors."); + at::Tensor tensor = THPVariable_Unpack(py_seq_i.ptr()); + TORCH_CHECK(!is_nested_tensor_impl(tensor), + "Currently do not support NestedTensor entries."); + result.emplace_back(TensorNode(std::move(tensor))); } - return NestedNode(std::move(result)); - } else { - return NestedNode(py_obj_to_ivalue(py_obj)); + return TensorNode(std::move(result)); } + TORCH_CHECK(false, "Currently only supporting a flat sequence of Tensors."); } at::Tensor nested_tensor_impl( @@ -198,32 +193,30 @@ at::Tensor nested_tensor_impl( py::object dtype_, py::object device_, bool requires_grad, - bool pin_memory) { + bool pin_memory, + bool channels_last) { + if (requires_grad) { + throw std::runtime_error( + "This version of nestedtensor currently does not support autograd. Please open an issue on https://github.com/pytorch/nestedtensor if you need this."); + } auto dtype = toTypeInferredIValue(dtype_).toScalarType(); auto device = toTypeInferredIValue(device_).toDevice(); - NestedNode ivalue_structure = py_to_nested_tensor(list); - auto fn = [](c10::IValue a, bool result) { return result && a.isTensor(); }; - bool all_same = - reduce(ivalue_structure, fn, true); - TORCH_CHECK( - all_same, - "Input nested list entries need to consist entirely of Tensors or NestedTensors."); - TensorNode structure = map( - [&device, &dtype](c10::IValue a) { - return a.toTensor().clone().detach().to(device, dtype); - }, - ivalue_structure); - if (auto first = get_first_leaf(structure)) { - if (!_verify_variables(*first, structure)) { - _verify_variables(*first, structure, true); + TensorNode ivalue_structure = py_to_nested_tensor(list); + if (auto first = get_first_leaf(ivalue_structure)) { + if (!_verify_variables(*first, ivalue_structure)) { + _verify_variables(*first, ivalue_structure, true); } } - auto result = at::detail::make_tensor(std::move(structure)).contiguous(); - if (requires_grad) { - result.requires_grad_(); - } + Tensor result = wrap_tensor_node(std::move(ivalue_structure)); + Tensor buffer = get_buffer(result); + buffer = buffer.to(device, dtype); if (pin_memory) { - result.pin_memory(); + buffer = buffer.pin_memory(); + } + result = wrap_buffer(std::move(buffer), get_efficient_nested_size(result)); + if (channels_last) { + result = NestedTensor_contiguous(result, c10::MemoryFormat::ChannelsLast); + return result; } return result; } diff --git a/nestedtensor/csrc/creation.h b/nestedtensor/csrc/creation.h index c5305223..26cdd00a 100644 --- a/nestedtensor/csrc/creation.h +++ b/nestedtensor/csrc/creation.h @@ -12,7 +12,8 @@ at::Tensor nested_tensor_impl( pybind11::object dtype, pybind11::object device, bool requires_grad, - bool pin_memory); + bool pin_memory, + bool channels_last); } // namespace nested_tensor } // namespace torch diff --git a/nestedtensor/csrc/cuda/add.cu b/nestedtensor/csrc/cuda/add.cu new file mode 100644 index 00000000..675eee7f --- /dev/null +++ b/nestedtensor/csrc/cuda/add.cu @@ -0,0 +1,308 @@ +#include +#include +#include +#include +#include + +namespace nested_tensor { +namespace cuda { + +__global__ +void add_scalars( + c10::Half* input, + c10::Half* scalars, + c10::Half* output, + const int input_outer_stride, + const int* offsets) +{ + const int batch_id = blockIdx.x; + const int scalars_id = batch_id / input_outer_stride; + const int grain_size = blockDim.x; + const int tid = threadIdx.x; + const int range = (offsets[batch_id + 1] - offsets[batch_id]); + const int num_chunks = range / grain_size; + for (int id = 0; id < num_chunks; id++) { + output[offsets[batch_id] + id * grain_size + tid] = + input[offsets[batch_id] + id * grain_size + tid] + scalars[scalars_id]; + } + const int leftover = num_chunks * grain_size; + if (leftover + tid < range) { + output[offsets[batch_id] + leftover + tid] = + input[offsets[batch_id] + leftover + tid] + scalars[scalars_id]; + } +} + +void add_scalar_kernelLauncher( + c10::Half* input, // [batch_size x offsets[-1]] + c10::Half* scalars, // [batch_size] + c10::Half* output, // [batch_size x offsets[-1]] + const int batch_size, + const int input_outer_stride, + const int* offsets /* [batch_size] */, + const cudaStream_t stream) +{ + dim3 grid; + grid.x = batch_size; + + add_scalars<<>>( + input, + scalars, + output, + input_outer_stride, + offsets); +} + +__global__ +void mul_scalars( + c10::Half* input, + c10::Half* scalars, + c10::Half* output, + const int input_outer_stride, + const int* offsets) +{ + const int batch_id = blockIdx.x; + const int scalars_id = batch_id / input_outer_stride; + const int grain_size = blockDim.x; + const int tid = threadIdx.x; + const int range = (offsets[batch_id + 1] - offsets[batch_id]); + const int num_chunks = range / grain_size; + for (int id = 0; id < num_chunks; id++) { + output[offsets[batch_id] + id * grain_size + tid] = + input[offsets[batch_id] + id * grain_size + tid] * scalars[scalars_id]; + } + const int leftover = num_chunks * grain_size; + if (leftover + tid < range) { + output[offsets[batch_id] + leftover + tid] = + input[offsets[batch_id] + leftover + tid] * scalars[scalars_id]; + } +} + +void mul_scalar_kernelLauncher( + c10::Half* input, // [batch_size x offsets[-1]] + c10::Half* scalars, // [batch_size] + c10::Half* output, // [batch_size x offsets[-1]] + const int batch_size, + const int input_outer_stride, + const int* offsets /* [batch_size] */, + const cudaStream_t stream) +{ + dim3 grid; + grid.x = batch_size; + + mul_scalars<<>>( + input, + scalars, + output, + input_outer_stride, + offsets); +} + +__global__ +void sub_scalars( + c10::Half* input, + c10::Half* scalars, + c10::Half* output, + const int input_outer_stride, + const int* offsets) +{ + const int batch_id = blockIdx.x; + const int scalars_id = batch_id / input_outer_stride; + const int grain_size = blockDim.x; + const int tid = threadIdx.x; + const int range = (offsets[batch_id + 1] - offsets[batch_id]); + const int num_chunks = range / grain_size; + for (int id = 0; id < num_chunks; id++) { + output[offsets[batch_id] + id * grain_size + tid] = + input[offsets[batch_id] + id * grain_size + tid] - scalars[scalars_id]; + } + const int leftover = num_chunks * grain_size; + if (leftover + tid < range) { + output[offsets[batch_id] + leftover + tid] = + input[offsets[batch_id] + leftover + tid] - scalars[scalars_id]; + } +} + +void sub_scalar_kernelLauncher( + c10::Half* input, // [batch_size x offsets[-1]] + c10::Half* scalars, // [batch_size] + c10::Half* output, // [batch_size x offsets[-1]] + const int batch_size, + const int input_outer_stride, + const int* offsets /* [batch_size] */, + const cudaStream_t stream) +{ + dim3 grid; + grid.x = batch_size; + + sub_scalars<<>>( + input, + scalars, + output, + input_outer_stride, + offsets); +} + +template +__global__ +void batchnorm_inference( + const c10::Half* input, + const c10::Half* mean, + const c10::Half* running_var, + const c10::Half eps, + const c10::Half* weight, + const c10::Half* bias, + c10::Half* output, + const int num_scalars, + const int* offsets) +{ + const int batch_id = blockIdx.x; + const int scalars_id = blockIdx.y; + const int grain_size = num_threads; + const int tid = threadIdx.x; + const int offset_id = batch_id * num_scalars + scalars_id; + const int range = (offsets[offset_id + 1] - offsets[offset_id]); + const int num_chunks = range / grain_size; + c10::Half value = running_var[scalars_id] + eps; + value = __frsqrt_rn(value); + value = value * weight[scalars_id]; + c10::Half value2 = mean[scalars_id] * value - bias[scalars_id]; + + int input_offset = offsets[offset_id] + tid; + int id = 0; + for (; id < num_chunks; id++) { + output[input_offset] = input[input_offset] * value - value2; + input_offset += grain_size; + } + if (input_offset < offsets[offset_id + 1]) { + output[input_offset] = input[input_offset] * value - value2; + } +} + +void batchnorm_inference_kernelLauncher( + c10::Half* input, // [batch_size x offsets[-1]] + c10::Half* mean, // [batch_size] + c10::Half* running_var, + c10::Half eps, + c10::Half* weight, // [batch_size] + c10::Half* bias, // [batch_size] + c10::Half* output, // [batch_size x offsets[-1]] + const int batch_size, + const int num_scalars, + const int numel, + const int* offsets /* [batch_size] */, + const cudaStream_t stream) +{ + dim3 grid; + grid.x = batch_size; + grid.y = num_scalars; + + batchnorm_inference<32><<>>( + input, + mean, + running_var, + eps, + weight, + bias, + output, + num_scalars, + offsets); +} + +template +__global__ +void batchnorm_inference_channels_last( + const c10::Half* input, + const c10::Half* mean, + const c10::Half* running_var, + const c10::Half eps, + const c10::Half* weight, + const c10::Half* bias, + c10::Half* output, + const int num_channel, + const int numel) +{ + const int block_id = blockIdx.x; + const int tid = threadIdx.x; + const int slice_offset = block_id * chunk_size; + const int num_slices = numel / num_channel; + if (slice_offset + chunk_size < num_slices) { + for (int scalars_id = tid; scalars_id < num_channel; scalars_id += num_threads) { + c10::Half value = running_var[scalars_id] + eps; + value = __frsqrt_rn(value); + value = value * weight[scalars_id]; + c10::Half value2 = mean[scalars_id] * value - bias[scalars_id]; + int offset = slice_offset * num_channel + scalars_id; +#pragma unroll + for (int i = 0; i < chunk_size; i++) { + output[offset] = input[offset] * value - value2; + offset += num_channel; + } + } + } else { + for (int scalars_id = tid; scalars_id < num_channel; scalars_id += num_threads) { + c10::Half value = running_var[scalars_id] + eps; + value = __frsqrt_rn(value); + value = value * weight[scalars_id]; + c10::Half value2 = mean[scalars_id] * value - bias[scalars_id]; +#pragma unroll + for (int i = 0; i < chunk_size; i++) { + const int slice_id = slice_offset + i; + if (slice_id < num_slices) { + const int offset = slice_id * num_channel + scalars_id; + output[offset] = input[offset] * value - value2; + } + } + } + } +} + +void batchnorm_inference_channels_last_kernelLauncher( + c10::Half* input, // [batch_size x offsets[-1]] + c10::Half* mean, // [batch_size] + c10::Half* running_var, + c10::Half eps, + c10::Half* weight, // [batch_size] + c10::Half* bias, // [batch_size] + c10::Half* output, // [batch_size x offsets[-1]] + const int num_channel, + const int numel, + const cudaStream_t stream) +{ + dim3 grid; + const int chunk_size = 32; + const int slice_size = numel / num_channel; + const int num_blocks = (slice_size + chunk_size - 1) / chunk_size; + // At least 3 blocks per SM on Volta + if (num_blocks < 240) { + const int chunk_size = 16; + const int slice_size = numel / num_channel; + const int num_blocks = (slice_size + chunk_size - 1) / chunk_size; + grid.x = num_blocks; + batchnorm_inference_channels_last<16, 256><<>>( + input, + mean, + running_var, + eps, + weight, + bias, + output, + num_channel, + numel); + return; + } + grid.x = num_blocks; + + batchnorm_inference_channels_last<32, 256><<>>( + input, + mean, + running_var, + eps, + weight, + bias, + output, + num_channel, + numel); +} + +} +} diff --git a/nestedtensor/csrc/cuda/add.h b/nestedtensor/csrc/cuda/add.h new file mode 100644 index 00000000..81461144 --- /dev/null +++ b/nestedtensor/csrc/cuda/add.h @@ -0,0 +1,65 @@ +#pragma once +#include +#include +#include +#include + +namespace nested_tensor { +namespace cuda { + +void add_scalar_kernelLauncher( + c10::Half* input, + c10::Half* scalars, + c10::Half* output, + const int batch_size, + const int input_outer_stride, + const int* offsets, + const cudaStream_t stream); + +void mul_scalar_kernelLauncher( + c10::Half* input, + c10::Half* scalars, + c10::Half* output, + const int batch_size, + const int input_outer_stride, + const int* offsets, + const cudaStream_t stream); + +void sub_scalar_kernelLauncher( + c10::Half* input, + c10::Half* scalars, + c10::Half* output, + const int batch_size, + const int input_outer_stride, + const int* offsets, + const cudaStream_t stream); + +void batchnorm_inference_kernelLauncher( + c10::Half* input, + c10::Half* mean, + // c10::Half* invstd, + c10::Half* running_var, + c10::Half eps, + c10::Half* weight, + c10::Half* bias, + c10::Half* output, + const int batch_size, + const int num_scalars, + const int numel, + const int* offsets, + const cudaStream_t stream); + +void batchnorm_inference_channels_last_kernelLauncher( + c10::Half* input, + c10::Half* mean, + c10::Half* running_var, + c10::Half eps, + c10::Half* weight, + c10::Half* bias, + c10::Half* output, + const int num_channel, + const int numel, + const cudaStream_t stream); + +} +} diff --git a/nestedtensor/csrc/cuda/attention.cu b/nestedtensor/csrc/cuda/attention.cu new file mode 100644 index 00000000..895c7b37 --- /dev/null +++ b/nestedtensor/csrc/cuda/attention.cu @@ -0,0 +1,543 @@ +/* + * Copyright (C) 2020 ByteDance Inc + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include +#include + +namespace nteffectivetransformer { +namespace cuda { + +// Reduce code comes from Nvidia's DeepLearningExamples +// https://github.com/NVIDIA/DeepLearningExamples/blob/master/FasterTransformer/v1/fastertransformer/cuda/open_attention.cu#L29-L101 + +/** + * Multi-head attetion open sourced + */ + +#define FINAL_MASK 0xffffffff + +template +__inline__ __device__ +T warpReduceSum(T val) +{ + for(int mask = 16; mask > 0; mask >>= 1) + val += __shfl_xor_sync(FINAL_MASK, val, mask, 32); + return val; +} + +/* Calculate the sum of all elements in a block */ +template + __inline__ __device__ +T blockReduceSum(T val) +{ + static __shared__ T shared[32]; + int lane = threadIdx.x & 0x1f; + int wid = threadIdx.x >> 5; + + val = warpReduceSum(val); + + if(lane == 0) + shared[wid] = val; + + __syncthreads(); + + val = (threadIdx.x < (blockDim.x >> 5 )) ? shared[lane] : (T)(0.0f); + val = warpReduceSum(val); + + return val; +} + +template + __inline__ __device__ +T warpReduceMax(T val) +{ + for(int mask = 16; mask > 0; mask >>= 1) + val = max(val, __shfl_xor_sync(FINAL_MASK, val, mask, 32)); + return val; +} + +/* Calculate the maximum of all elements in a block */ +template + __inline__ __device__ +T blockReduceMax(T val) +{ + static __shared__ T shared[32]; + int lane = threadIdx.x & 0x1f; // in-warp idx + int wid = threadIdx.x >> 5; // warp idx + + val = warpReduceMax(val); // get maxx in each warp + + if(lane == 0) // record in-warp maxx by warp Idx + shared[wid] = val; + + __syncthreads(); + + + val = (threadIdx.x < (blockDim.x >> 5 )) ? shared[lane] : 0; + val = warpReduceMax(val); + + return val; +} + +__inline__ __device__ +int target_index(int id1, int id2, int id3, int id4, + int dim_1, int dim_2, int dim_3, int dim_4) +{ + return id1 * (dim_2 * dim_3 * dim_4) + + id3 * (dim_2 * dim_4) + id2 * dim_4 + id4; +} + +/// ***************************** add bias & pad ***************************** +template +__global__ +void add_QKV_bias_padding( + T* Q, const T* bias_Q, + T* K, const T* bias_K, + T* V, const T* bias_V, + T* q_buf_, T* k_buf_, T* v_buf_, + const int batch_size, const int seq_len, + const int head_num, const int size_per_head, + const int* batch_idx, const int* word_idx) +{ + int tid = blockIdx.x * blockDim.x + threadIdx.x; + int batch_id = batch_idx[blockIdx.x]; + int seq_id = word_idx[blockIdx.x]; + int head_id = (tid % (head_num * size_per_head)) / size_per_head; + int id = tid % size_per_head; + int target_id = target_index(batch_id, seq_id, head_id, id, + batch_size, seq_len, head_num, size_per_head); + int bias_id = threadIdx.x; + + T* src_ptr = (T*)Q; + T* dst_ptr = (T*)q_buf_; + const T* bias_ptr = (const T*)bias_Q; + dst_ptr[target_id] = src_ptr[tid] + __ldg(&bias_ptr[bias_id]); + + src_ptr = (T*)K; + dst_ptr = (T*)k_buf_; + bias_ptr = (const T*)bias_K; + dst_ptr[target_id] = src_ptr[tid] + __ldg(&bias_ptr[bias_id]); + + src_ptr = (T*)V; + dst_ptr = (T*)v_buf_; + bias_ptr = (const T*)bias_V; + dst_ptr[target_id] = src_ptr[tid] + __ldg(&bias_ptr[bias_id]); +} + +template +void add_QKV_bias_padding_kernelLauncher( + T* Q, const T* bias_Q, + T* K, const T* bias_K, + T* V, const T* bias_V, + T* q_buf_, T* k_buf_, T* v_buf_, + const int valid_word_num, + const int batch_size, const int seq_len, + const int head_num, const int size_per_head, + const int* batch_idx, const int* word_idx, + const cudaStream_t stream) +{ + dim3 grid; + dim3 block; + grid.x = valid_word_num; + block.x = head_num * size_per_head; + + add_QKV_bias_padding<<>>( + Q, bias_Q, K, bias_K, V, bias_V, q_buf_, k_buf_, v_buf_, + batch_size, seq_len, head_num, size_per_head, batch_idx, word_idx); +} + +template void add_QKV_bias_padding_kernelLauncher( + float* Q, const float* bias_Q, + float* K, const float* bias_K, + float* V, const float* bias_V, + float* q_buf_, float* k_buf_, float* v_buf_, + const int valid_word_num, + const int batch_size, const int seq_len, + const int head_num, const int size_per_head, + const int* batch_idx, const int* word_idx, + const cudaStream_t stream); +/// *********************************** fin *********************************** + + +/// ************************** softmax for attention ************************** +// softmax kernel code is copied from +// https://raw.githubusercontent.com/NVIDIA/FasterTransformer/main/fastertransformer/cuda/attention_kernels.cu + +template +__global__ +void softmax_kernel(T* qk_buf_, const T* attr_mask, const int batch_size, const int head_num, const int seq_len, + const T scalar) +{ + int batch_id = blockIdx.x / head_num; + int qk_offset = blockIdx.x * seq_len * seq_len; + int mask_offset = batch_id * seq_len * seq_len; + + __shared__ float s_sum, s_max; + + for(int i = 0; i < seq_len; ++i) + { + float qk = threadIdx.x < seq_len ? (float)qk_buf_[threadIdx.x + qk_offset] : 0.0f; + float mask_val = threadIdx.x < seq_len ? (float)attr_mask[threadIdx.x + mask_offset] : 0.0f; + + mask_val = (1.0f - mask_val) * -10000.0f; + + float tmp = threadIdx.x < seq_len ? (float)(qk * (float)scalar + mask_val): -1e20f; + + float max_val = blockReduceMax(tmp); + + if(threadIdx.x == 0) + s_max = max_val; + __syncthreads(); + + qk = threadIdx.x < seq_len ? __expf(tmp - s_max) : 0.0f; + + float sum_val = blockReduceSum(qk); + + if(threadIdx.x == 0) + { + s_sum = sum_val + 1e-6f; + } + __syncthreads(); + + if(threadIdx.x < seq_len) + qk_buf_[threadIdx.x + qk_offset] = (T)(qk / s_sum); + + qk_offset += seq_len; + mask_offset += seq_len; + } +} + + +template +__global__ +void softmax_kernel_v2(T* qk_buf_, const T* attr_mask, const int batch_size, const int head_num, + const int seq_len, const float scalar) +{ + int batch_id = blockIdx.x / head_num / seq_len; + int seq_id = blockIdx.x % seq_len; + int qk_offset = blockIdx.x * seq_len; + int mask_offset = batch_id * seq_len * seq_len + seq_id * seq_len; + + __shared__ float s_sum, s_max; + + float qk = threadIdx.x < seq_len ? (float)qk_buf_[threadIdx.x + qk_offset] : 0.0f; + float mask_val = threadIdx.x < seq_len ? (float)attr_mask[threadIdx.x + mask_offset] : 0.0f; + + mask_val = (1.0f - mask_val) * -10000.0f; + + float tmp = threadIdx.x < seq_len ? (float)(qk * (float)scalar + mask_val) : -1e20f; + float max_val = blockReduceMax(tmp); + if(threadIdx.x == 0) + s_max = max_val; + __syncthreads(); + + float qk_tmp = threadIdx.x < seq_len ? __expf((float)(tmp - s_max)) : 0.0f; + float sum_val = blockReduceSum(qk_tmp); + + if(threadIdx.x == 0) + { + s_sum = sum_val + 1e-6f; + } + __syncthreads(); + + if(threadIdx.x < seq_len) + qk_buf_[threadIdx.x + qk_offset] = (T)(qk_tmp / s_sum); +} + +//grid = (seq_len/word_per_thread, batch_size, head_num) +//block.x = max(32, (seq_len + 31)/32*32) +template +__global__ +void softmax_kernel_v3(T* qk_buf_, const T* attr_mask, const int batch_size, const int head_num, const int seq_len, const T scalar) +{ + + bool qual = threadIdx.x < seq_len; + for (int seq_id = blockIdx.x ; seq_id < seq_len ; seq_id += gridDim.x){ + float tmp = -1e20f; + int qk_offset; + __shared__ float s_mean, s_max; + if (qual){ + qk_offset = ((blockIdx.y*head_num + blockIdx.z)*seq_len + seq_id) *seq_len + threadIdx.x; + int mask_offset = (blockIdx.y * seq_len + seq_id) * seq_len + threadIdx.x; + + float qk = static_cast(qk_buf_[qk_offset]); + float mask_val = static_cast(__ldg(&attr_mask[mask_offset])); + + mask_val = (1.0f - mask_val) * -10000.0f; + + tmp = qk * static_cast(scalar) + mask_val; + } + + float max_val = blockReduceMax(tmp); + if (threadIdx.x == 0){ + s_max = max_val; + } + __syncthreads(); + + float qk_tmp = qual ? __expf(tmp - s_max) : 0.0f; + float sum_val = blockReduceSum(qk_tmp); + if (threadIdx.x == 0){ + s_mean = sum_val + 1e-6f; + s_mean = __fdividef(1.0f, s_mean); + } + __syncthreads(); + + if(qual) + qk_buf_[qk_offset] = (T)(qk_tmp * s_mean); + } +} + + +//grid = (seq_len/word_per_thread, batch_size, head_num) +//block.x = max(32, (seq_len/2 + 31)/32*32) +//seq_len % 2 == 0 +template <> +__global__ +void softmax_kernel_v3(half* qk_buf_, const half* attr_mask, + const int batch_size, const int head_num, + const int seq_len, const half scalar) +{ + int threadIdx2 = threadIdx.x << 1; + bool qual = threadIdx2 < seq_len; + half2* qk_buf_half2Ptr = (half2*) qk_buf_; + const half2* attr_mask_half2Ptr = (const half2*) attr_mask; + __shared__ float s_mean, s_max; + for (int seq_id = blockIdx.x ; seq_id < seq_len ; seq_id += gridDim.x){ + int qk_offset; + half2 tmp = __float2half2_rn(0.0f); + + float max_val = -1e20f; + half2 qk; + if (qual){ + qk_offset = ((((blockIdx.y*head_num + blockIdx.z)*seq_len + seq_id) *seq_len) >> 1) + threadIdx.x; + int mask_offset = (((blockIdx.y * seq_len + seq_id) * seq_len) >> 1) + threadIdx.x; + + qk = qk_buf_half2Ptr[qk_offset]; + half2 mask_val = __ldg(&attr_mask_half2Ptr[mask_offset]); + half2 mask_val_tmp = __hmul2(__hsub2(__float2half2_rn(1.0f), mask_val), __float2half2_rn(-10000.0f)); + tmp = __hadd2(__hmul2(__half2half2(scalar), qk), mask_val_tmp); + max_val = fmax((float)c10::Half(tmp.x), (float)c10::Half(tmp.y)); + } + + max_val = blockDim.x <= 32 ? warpReduceMax(max_val) : blockReduceMax(max_val); + + if (threadIdx.x == 0){ + s_max = max_val; + } + __syncthreads(); + + if (qual){ + tmp = h2exp(__hsub2(tmp, __float2half2_rn(s_max))); + } + float sum_val = blockDim.x <= 32 ? warpReduceSum((float)(c10::Half(tmp.x) + c10::Half(tmp.y))) : blockReduceSum((float)(c10::Half(tmp.x) + c10::Half(tmp.y))); + + if (threadIdx.x == 0){ + s_mean = sum_val + 1e-6f; + s_mean = __fdividef(1.0f, s_mean); + } + __syncthreads(); + + if(qual){ + qk = __hmul2(tmp, __float2half2_rn(s_mean)); + qk_buf_half2Ptr[qk_offset] = qk; + } + } +} + +template +__global__ +void softmax_kernel_v3_LE32(T* qk_buf_, const T* attr_mask, const int batch_size, const int head_num, const int seq_len, const T scalar) +{ + bool qual = threadIdx.x < seq_len; + for (int seq_id = blockIdx.x ; seq_id < seq_len ; seq_id += gridDim.x){ + int qk_offset; + __shared__ float s_mean, s_max; + float tmp = -1e20f; + if (qual){ + qk_offset = ((blockIdx.y*head_num + blockIdx.z)*seq_len + seq_id) *seq_len + threadIdx.x; + int mask_offset = (blockIdx.y * seq_len + seq_id) * seq_len + threadIdx.x; + + float qk = static_cast(qk_buf_[qk_offset]); + float mask_val = static_cast(__ldg(&attr_mask[mask_offset])); + + mask_val = (1.0f - mask_val) * -10000.0f; + + tmp = static_cast(qk) * static_cast(scalar) + mask_val; + } + float max_val = warpReduceMax(tmp); + + if (threadIdx.x == 0){ + s_max = max_val; + } + __syncthreads(); + + tmp = qual ? __expf(tmp - s_max) : 0.0f; + float sum_val = warpReduceSum(tmp); + + if (threadIdx.x == 0){ + s_mean = sum_val + 1e-6f; + s_mean = __fdividef(1.0f, s_mean); + } + __syncthreads(); + + if(qual) + qk_buf_[qk_offset] = (T)(tmp * s_mean); + } +} + +// Changed this align with prior API +// Renamed and switched head_num with seq_len +template +void softmax_kernel_kernelLauncher( + T* buffer, + const T* attr_mask, + const int batch_size, + const int head_num, + const int seq_len, + const T scalar, + cudaStream_t stream) +{ + dim3 grid, block; + //deal with odd seq_len + if (seq_len % 2 != 0){ + if(seq_len <= 32) + block.x = 32; + else if(seq_len > 32 && seq_len <= 64) + block.x = 64; + else if(seq_len > 64 && seq_len <= 128) + block.x = 128; + else if(seq_len > 128 && seq_len <= 256) + block.x = 256; + else if(seq_len > 256 && seq_len <= 512) + block.x = 512; + else + block.x = 1024; + + if(batch_size * head_num <= 120) + { + grid.x = batch_size * head_num * seq_len; + softmax_kernel_v2<<>>(buffer, attr_mask, batch_size, head_num, seq_len, scalar); + } + else + { + grid.x = batch_size * head_num; + softmax_kernel<<>>(buffer, attr_mask, batch_size, head_num, seq_len, scalar); + } + } + //deal with even seq_len + else{ + grid.x = seq_len; + if (batch_size * head_num > 360) + grid.x = ceil(float(seq_len)/32.0f); + grid.y = batch_size; + grid.z = head_num; + if (seq_len <= 32){ + block.x = 32; + softmax_kernel_v3_LE32<<>>(buffer, attr_mask, batch_size, head_num, seq_len, scalar); + } + else{ + if (sizeof(T) == 2){ + // We should be able to only need have the blocks + // but there is a bug that is triggered if we use less. + // This requires a closer auditing of the kernel. + // block.x = (seq_len/2 + 31)/32*32; + block.x = (seq_len + 31)/32*32; + softmax_kernel_v3<<>>(buffer, attr_mask, batch_size, head_num, seq_len, scalar); + } + else{ + block.x = (seq_len + 31)/32*32; + softmax_kernel_v3<<>>(buffer, attr_mask, batch_size, head_num, seq_len, scalar); + } + } + grid.x = grid.y = grid.z = 1; + } +} + +template void softmax_kernel_kernelLauncher( + float* qk_buf_, const float* attr_mask, + const int batch_size, const int head_num, const int seq_len, + const float scaler, + const cudaStream_t stream); + +template void softmax_kernel_kernelLauncher( + c10::Half* qk_buf_, const c10::Half* attr_mask, + const int batch_size, const int head_num, const int seq_len, + const c10::Half scaler, + const cudaStream_t stream); + +/// *********************************** fin *********************************** + + +/// ****************** transpose & rm padding for attention ******************* +template +__global__ +void transpose_rm_padding( + T* src, T* dst, + const int batch_size, const int seq_len, + const int head_num, const int size_per_head, + const int* batch_idx, const int* word_idx) +{ + int head_id = threadIdx.y; + int tid = threadIdx.x; + int batch_id = batch_idx[blockIdx.x]; + int word_id = word_idx[blockIdx.x]; + + int src_offset = batch_id * head_num * seq_len * size_per_head + + head_id * seq_len * size_per_head + + word_id * size_per_head + + tid; + int dst_offset = blockIdx.x * head_num * size_per_head + + head_id * size_per_head + + tid; + + T* src_ptr = (T*)src; + T* dst_ptr = (T*)dst; + dst_ptr[dst_offset] = src_ptr[src_offset]; +} + +template +void transpose_rm_padding_kernelLauncher( + T* src, T* dst, + const int valid_word_num, + const int batch_size, const int seq_len, + const int head_num, const int size_per_head, + const int* batch_idx, const int* word_idx, + const cudaStream_t stream) +{ + dim3 grid(valid_word_num); + dim3 block(size_per_head, head_num); + + transpose_rm_padding<<>>( + src, dst, + batch_size, seq_len, head_num, size_per_head, + batch_idx, word_idx); +} + +template void transpose_rm_padding_kernelLauncher( + float* src, float* dst, + const int valid_word_num, + const int batch_size, const int seq_len, + const int head_num, const int size_per_head, + const int* batch_idx, const int* word_idx, + const cudaStream_t stream); + +/// *********************************** fin *********************************** + +}//namespace cuda +}//namespace nteffectivetransformer diff --git a/nestedtensor/csrc/cuda/attention.h b/nestedtensor/csrc/cuda/attention.h new file mode 100644 index 00000000..2a6f57dd --- /dev/null +++ b/nestedtensor/csrc/cuda/attention.h @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2020 ByteDance Inc + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include +#include +#include +namespace nteffectivetransformer{ +namespace cuda{ + +template +void add_QKV_bias_padding_kernelLauncher( + T* Q, const T* bias_Q, + T* K, const T* bias_K, + T* V, const T* bias_V, + T* q_buf_, T* k_buf_, T* v_buf_, + const int valid_word_num, + const int batch_size, const int seq_len, + const int head_num, const int size_per_head, + const int* batch_idx, const int* word_idx, + const cudaStream_t stream); + +template +void softmax_kernel_kernelLauncher( + T* qk_buf_, const T* attr_mask, + const int batch_size, const int head_num, const int seq_len, + const T scaler, + const cudaStream_t stream); + +template +void transpose_rm_padding_kernelLauncher( + T* src, T* dst, + const int valid_word_num, + const int batch_size, const int seq_len, + const int head_num, const int size_per_head, + const int* batch_idx, const int* word_idx, + const cudaStream_t stream); +}//namespace cuda +}//namespace nteffectivetransformer diff --git a/nestedtensor/csrc/cuda/common.h b/nestedtensor/csrc/cuda/common.h new file mode 100644 index 00000000..5580f7f2 --- /dev/null +++ b/nestedtensor/csrc/cuda/common.h @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2019, NVIDIA CORPORATION. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#pragma once + +#include +#include +#include +#include +#include + +namespace nteffectivetransformer { + + enum class OperationType{FP32, HALF}; + enum class AllocatorType{CUDA, TF}; + +#define PRINT_FUNC_NAME_() do{\ + std::cout << "[FT][CALL] " << __FUNCTION__ << " " << std::endl; \ +} while (0) + +static const char *_cudaGetErrorEnum(cudaError_t error) { + return cudaGetErrorString(error); +} + +static const char *_cudaGetErrorEnum(cublasStatus_t error) { + switch (error) { + case CUBLAS_STATUS_SUCCESS: + return "CUBLAS_STATUS_SUCCESS"; + + case CUBLAS_STATUS_NOT_INITIALIZED: + return "CUBLAS_STATUS_NOT_INITIALIZED"; + + case CUBLAS_STATUS_ALLOC_FAILED: + return "CUBLAS_STATUS_ALLOC_FAILED"; + + case CUBLAS_STATUS_INVALID_VALUE: + return "CUBLAS_STATUS_INVALID_VALUE"; + + case CUBLAS_STATUS_ARCH_MISMATCH: + return "CUBLAS_STATUS_ARCH_MISMATCH"; + + case CUBLAS_STATUS_MAPPING_ERROR: + return "CUBLAS_STATUS_MAPPING_ERROR"; + + case CUBLAS_STATUS_EXECUTION_FAILED: + return "CUBLAS_STATUS_EXECUTION_FAILED"; + + case CUBLAS_STATUS_INTERNAL_ERROR: + return "CUBLAS_STATUS_INTERNAL_ERROR"; + + case CUBLAS_STATUS_NOT_SUPPORTED: + return "CUBLAS_STATUS_NOT_SUPPORTED"; + + case CUBLAS_STATUS_LICENSE_ERROR: + return "CUBLAS_STATUS_LICENSE_ERROR"; + } + return ""; +} + + +template +void check(T result, char const *const func, const char *const file, int const line) { + if (result) { + throw std::runtime_error(std::string("[FT][ERROR] CUDA runtime error: ") + \ + (_cudaGetErrorEnum(result)) + " " + file + \ + ":" + std::to_string(line) + " \n");\ + } +} +#define check_cuda_error(val) check((val), #val, __FILE__, __LINE__) +}//namespace nteffectivetransformer diff --git a/nestedtensor/csrc/cuda/cuda_kernels.cu b/nestedtensor/csrc/cuda/cuda_kernels.cu new file mode 100644 index 00000000..97868b67 --- /dev/null +++ b/nestedtensor/csrc/cuda/cuda_kernels.cu @@ -0,0 +1,521 @@ +/* + * Copyright (C) 2020 ByteDance Inc + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "cuda_kernels.h" +#include +#include +#include +#include +#include +#include + +namespace nteffectivetransformer{ + +// gelu code from +// https://github.com/NVIDIA/DeepLearningExamples/blob/master/FasterTransformer/v1/fastertransformer/cuda/cuda_kernels.cu#L26-L45 +template +__inline__ __device__ +T gelu(T x) +{ + float cdf = 0.5f * + (1.0f + tanhf((0.7978845608028654f * (x + 0.044715f * x * x * x)))); + return x * cdf; +} + +// reduce code from +// https://github.com/NVIDIA/DeepLearningExamples/blob/master/FasterTransformer/v1/fastertransformer/cuda/cuda_kernels.cu#L47-L73 + +#define FINAL_MASK 0xffffffff + +template +__inline__ __device__ +T warpReduceSum(T val) +{ + for(int mask = 16; mask > 0; mask >>= 1) + val += __shfl_xor_sync(FINAL_MASK, val, mask, 32); + return val; +} + +template +__inline__ __device__ +T blockReduceSum(T val) +{ + static __shared__ T shared[32]; + int lane = threadIdx.x & 0x1f; + int wid = threadIdx.x >> 5; + + val = warpReduceSum(val); + + if(lane == 0) + shared[wid] = val; + __syncthreads(); + + val = (threadIdx.x < (blockDim.x >> 5 )) ? shared[lane] : (T)0.0f; + val = warpReduceSum(val); + return val; +} + +/// ***************************** add_bias + gelu ***************************** + +template +__global__ +void add_bias_act(T* out, const T* bias, int m, int n) +{ + T val, reg_bias; + + int row_id = blockIdx.x; + int ite = n / blockDim.x; + int tid = threadIdx.x; + + for(int i = 0; i < ite; ++i) + { + reg_bias = __ldg(&bias[i * blockDim.x + tid]); + row_id = blockIdx.x; + + while(row_id < m){ + val = out[tid + i * blockDim.x + row_id * n]+ reg_bias; + out[tid + i * blockDim.x + row_id * n] = gelu(val); + row_id += gridDim.x; + } + } +} + +template +void add_bias_act_kernelLauncher( + T* out, const T* bias, int m, int n, cudaStream_t stream) +{ + dim3 grid(max(m / 4, 1)); + dim3 block(n / 4); + assert(block.x < 1024); + add_bias_act<<>>(out, bias, m, n); +} + +template void add_bias_act_kernelLauncher( + float* out, const float* bias, int m, int n, cudaStream_t stream); + +/// *********************************** fin *********************************** + + +/// ************************** add_bias + layer_norm ************************** + +template +__global__ +void add_bias_input_layernorm( + T* out, const T* input, const T* bias, const T* gamma, + const T* beta, int m, int n) +{ + int tid = threadIdx.x; + + __shared__ float s_mean; + __shared__ float s_variance; + float mean = 0.0f; + float variance = 0.0f; + + float local_out = 0.0f; + for(int i = tid; i < n; i += blockDim.x) + local_out += (float)(out[blockIdx.x * n + i] + + input[blockIdx.x * n + i] + __ldg(&bias[i])); + + mean = blockReduceSum(local_out); + if(threadIdx.x == 0) + s_mean = mean / n; + __syncthreads(); + + variance = blockReduceSum(( + local_out - s_mean) * (local_out - s_mean)); + if(threadIdx.x == 0) + s_variance = variance / n + 1e-6f; + __syncthreads(); + + for(int i = tid; i < n; i += blockDim.x) + out[blockIdx.x * n + i] = + (T)(((local_out - s_mean) * rsqrtf(s_variance)) + * (float)(__ldg(&gamma[i])) + (float)(__ldg(&beta[i]))); +} + +template +void add_bias_input_layernorm_kernelLauncher( + T* out, const T* input, const T* bias, + const T* gamma, const T* beta, int m, int n, cudaStream_t stream) +{ + assert(n < 1024); + dim3 grid(m); + dim3 block(n); + add_bias_input_layernorm<<>>( + out, input, bias, gamma, beta, m, n); +} + +template void add_bias_input_layernorm_kernelLauncher( + float* out, const float* input, + const float* bias, const float* gamma, const float* beta, + int m, int n, cudaStream_t stream); + +/// *********************************** fin *********************************** + + +/// *********************** compresse transformer input *********************** + +__global__ +void compress_bert_input( + // const T* from_tensor, + const int* mask, const int* prefix_sum, + // T* to_tensor, + int* batch_idx, int* word_idx, + int batch_size , int seq_len, int hidden_dim) +{ + int bid = blockIdx.y; // batch + int wid = blockIdx.x; // word + int tid = threadIdx.x; // + + /// 1. count pos for from tensor + int mask_idx = bid * seq_len + wid; + + if (mask[mask_idx] > 0.5) { + int valid_idx = prefix_sum[mask_idx]; + + /// 2. wirte batch id and word id for each word + if (tid == 0) { + batch_idx[valid_idx] = bid; + word_idx[valid_idx] = wid; + } + + // /// 3. copy src data + // float* src_ptr = (float*)from_tensor; + // float* dst_ptr = (float*)to_tensor; + // int src_idx = mask_idx * hidden_dim + tid; + // int dst_idx = valid_idx * hidden_dim + tid; + // dst_ptr[dst_idx] = src_ptr[src_idx]; + } +} + +void compressBertInput_kernelLauncher( + // const T* from_tensor, + const int* mask, const int* prefix_sum, + // T* to_tensor, + int* batch_idx, int* word_idx, + int batch_size , int seq_len, int hidden_dim, cudaStream_t stream) +{ + /// TODO : fp32 + dim3 grid(seq_len, batch_size); + dim3 block(hidden_dim); + // dim3 block(1); + assert(hidden_dim <= 1024); + compress_bert_input<<>>( + // from_tensor, + mask, prefix_sum, + // to_tensor, + batch_idx, word_idx, + batch_size , seq_len, hidden_dim); + return; +} + +/// *********************************** fin *********************************** + +/// *********************** restore transformer output ************************ +template +__global__ +void restore_bert_output( + T* to_tensor, + const T* from_tensor, const int* batch_idx, const int* word_idx, + int valid_word_num, int seq_len, int hidden_dim) +{ + int bid = batch_idx[blockIdx.x]; + int wid = word_idx[blockIdx.x]; + int tid = threadIdx.x; + int vid = blockIdx.x; + + /// 3. copy src data + float* src_ptr = (float*)from_tensor; + float* dst_ptr = (float*)to_tensor; + int src_idx = vid * hidden_dim + tid; + int dst_idx = (bid * seq_len + wid) * hidden_dim + tid; + dst_ptr[dst_idx] = src_ptr[src_idx]; +} + +template +void restoreBertOutput_kernelLauncher( + T* to_tensor, + const T* from_tensor, const int* batch_idx, const int* word_idx, + int valid_word_num, int seq_len, int hidden_dim, cudaStream_t stream) +{ + // TODO : fp32 + dim3 grid(valid_word_num); + dim3 block(hidden_dim); + assert(hidden_dim <= 1024); + restore_bert_output<<>>( + to_tensor, + from_tensor, batch_idx, word_idx, + valid_word_num, seq_len, hidden_dim); +} + +template void restoreBertOutput_kernelLauncher( + float* to_tensor, + const float* from_tensor, const int* batch_idx, const int* word_idx, + int valid_word_num, int seq_len, int hidden_dim, cudaStream_t stream); + +/// *********************************** fin *********************************** + +/// ***************************** exclusive scan ****************************** +// The scan code is rewritten based on this repo : +// https://github.com/mattdean1/cuda/tree/master/parallel-scan +// I only rewritted device memory allocation part. + +int THREADS_PER_BLOCK = 512; +int ELEMENTS_PER_BLOCK = THREADS_PER_BLOCK * 2; +#define SHARED_MEMORY_BANKS 32 +#define LOG_MEM_BANKS 5 +#define CONFLICT_FREE_OFFSET(n) ((n) >> LOG_MEM_BANKS) + +__global__ void prescan_large(int *output, const int *input, int n, int *sums) +{ + extern __shared__ int temp[]; + + int blockID = blockIdx.x; + int threadID = threadIdx.x; + int blockOffset = blockID * n; + + int ai = threadID; + int bi = threadID + (n / 2); + int bankOffsetA = CONFLICT_FREE_OFFSET(ai); + int bankOffsetB = CONFLICT_FREE_OFFSET(bi); + temp[ai + bankOffsetA] = input[blockOffset + ai]; + temp[bi + bankOffsetB] = input[blockOffset + bi]; + + int offset = 1; + for (int d = n >> 1; d > 0; d >>= 1) // build sum in place up the tree + { + __syncthreads(); + if (threadID < d) + { + int ai = offset * (2 * threadID + 1) - 1; + int bi = offset * (2 * threadID + 2) - 1; + ai += CONFLICT_FREE_OFFSET(ai); + bi += CONFLICT_FREE_OFFSET(bi); + + temp[bi] += temp[ai]; + } + offset *= 2; + } + __syncthreads(); + + + if (threadID == 0) { + sums[blockID] = temp[n - 1 + CONFLICT_FREE_OFFSET(n - 1)]; + temp[n - 1 + CONFLICT_FREE_OFFSET(n - 1)] = 0; + } + + for (int d = 1; d < n; d *= 2) // traverse down tree & build scan + { + offset >>= 1; + __syncthreads(); + if (threadID < d) + { + int ai = offset * (2 * threadID + 1) - 1; + int bi = offset * (2 * threadID + 2) - 1; + ai += CONFLICT_FREE_OFFSET(ai); + bi += CONFLICT_FREE_OFFSET(bi); + + int t = temp[ai]; + temp[ai] = temp[bi]; + temp[bi] += t; + } + } + __syncthreads(); + + output[blockOffset + ai] = temp[ai + bankOffsetA]; + output[blockOffset + bi] = temp[bi + bankOffsetB]; +} + +__global__ void prescan_arbitrary( + int *output, const int *input, int n, int powerOfTwo) +{ + extern __shared__ int temp[];// allocated on invocation + int threadID = threadIdx.x; + + int ai = threadID; + int bi = threadID + (n / 2); + int bankOffsetA = CONFLICT_FREE_OFFSET(ai); + int bankOffsetB = CONFLICT_FREE_OFFSET(bi); + + + if (threadID < n) { + temp[ai + bankOffsetA] = input[ai]; + temp[bi + bankOffsetB] = input[bi]; + } + else { + temp[ai + bankOffsetA] = 0; + temp[bi + bankOffsetB] = 0; + } + + + int offset = 1; + // build sum in place up the tree + for (int d = powerOfTwo >> 1; d > 0; d >>= 1) + { + __syncthreads(); + if (threadID < d) + { + int ai = offset * (2 * threadID + 1) - 1; + int bi = offset * (2 * threadID + 2) - 1; + ai += CONFLICT_FREE_OFFSET(ai); + bi += CONFLICT_FREE_OFFSET(bi); + + temp[bi] += temp[ai]; + } + offset *= 2; + } + + if (threadID == 0) { + // clear the last element + temp[powerOfTwo - 1 + CONFLICT_FREE_OFFSET(powerOfTwo - 1)] = 0; + } + + for (int d = 1; d < powerOfTwo; d *= 2) // traverse down tree & build scan + { + offset >>= 1; + __syncthreads(); + if (threadID < d) + { + int ai = offset * (2 * threadID + 1) - 1; + int bi = offset * (2 * threadID + 2) - 1; + ai += CONFLICT_FREE_OFFSET(ai); + bi += CONFLICT_FREE_OFFSET(bi); + + int t = temp[ai]; + temp[ai] = temp[bi]; + temp[bi] += t; + } + } + __syncthreads(); + + if (threadID < n) { + output[ai] = temp[ai + bankOffsetA]; + output[bi] = temp[bi + bankOffsetB]; + } +} + +__global__ void add(int *output, int length, int *n) { + int blockID = blockIdx.x; + int threadID = threadIdx.x; + int blockOffset = blockID * length; + + output[blockOffset + threadID] += n[blockID]; +} + +__global__ void add(int *output, int length, const int *n1, const int *n2) { + int blockID = blockIdx.x; + int threadID = threadIdx.x; + int blockOffset = blockID * length; + + output[blockOffset + threadID] += n1[blockID] + n2[blockID]; +} + +// from https://stackoverflow.com/a/12506181 +int nextPowerOfTwo(int x) { + int power = 1; + while (power < x) { + power *= 2; + } + return power; +} + +void scanSmallDeviceArray( + int *d_out, const int* d_in, const int length, const cudaStream_t stream); +void scanLargeDeviceArray( + int *d_out, const int* d_in, const int length, int *d_buf, + const cudaStream_t stream); +void scanLargeEvenDeviceArray( + int *d_out, const int* d_in, const int length, int *d_buf, + const cudaStream_t stream); + +void scanLargeEvenDeviceArray( + int *d_out, const int* d_in, const int length, int *d_buf, + const cudaStream_t stream) +{ + const int blocks = length / ELEMENTS_PER_BLOCK; + const int sharedMemArraySize = ELEMENTS_PER_BLOCK * sizeof(int); + + int *d_sums = d_buf; + int *d_incr = d_buf + blocks; + // cudaMalloc((void **)&d_sums, blocks * sizeof(int)); + // cudaMalloc((void **)&d_incr, blocks * sizeof(int)); + + prescan_large<<>>( + d_out, d_in, ELEMENTS_PER_BLOCK, d_sums); + + const int sumsArrThreadsNeeded = (blocks + 1) / 2; + if (sumsArrThreadsNeeded > THREADS_PER_BLOCK) { + // perform a large scan on the sums arr + scanLargeDeviceArray(d_incr, d_sums, blocks, d_buf, stream); + } + else { + // only need one block to scan sums arr so can use small scan + scanSmallDeviceArray(d_incr, d_sums, blocks, stream); + } + + add<<>>( + d_out, ELEMENTS_PER_BLOCK, d_incr); +} + +void scanSmallDeviceArray( + int *d_out, const int* d_in, const int length, const cudaStream_t stream) +{ + int powerOfTwo = nextPowerOfTwo(length); + prescan_arbitrary + <<<1, (length + 1) / 2, 2 * powerOfTwo * sizeof(int), stream >>>( + d_out, d_in, length, powerOfTwo); +} + +/// +void scanLargeDeviceArray( + int *d_out, const int* d_in, const int length, int *d_buf, + const cudaStream_t stream) +{ + int remainder = length % (ELEMENTS_PER_BLOCK); + if (remainder == 0) { + scanLargeEvenDeviceArray(d_out, d_in, length, d_buf, stream); + } + else { + // perform a large scan on a compatible multiple of elements + int lengthMultiple = length - remainder; + scanLargeEvenDeviceArray(d_out, d_in, lengthMultiple, d_buf, stream); + + // scan the remaining elements and add the (inclusive) + // last element of the large scan to this + int *startOfOutputArray = &(d_out[lengthMultiple]); + scanSmallDeviceArray( + startOfOutputArray, &(d_in[lengthMultiple]), remainder, stream); + + add<<<1, remainder, 0, stream>>>( + startOfOutputArray, remainder, &(d_in[lengthMultiple - 1]), + &(d_out[lengthMultiple - 1])); + } +} + +void exclusiveScan_kernelLauncher( + int* d_out, const int* d_in, const int length, const cudaStream_t stream) +{ + if (length > ELEMENTS_PER_BLOCK) { + scanLargeDeviceArray(d_out, d_in, length, d_out + length, stream); + } + else { + scanSmallDeviceArray(d_out, d_in, length, stream); + } +} + +/// *********************************** fin *********************************** + +}//namespace nteffectivetransformer diff --git a/nestedtensor/csrc/cuda/cuda_kernels.h b/nestedtensor/csrc/cuda/cuda_kernels.h new file mode 100644 index 00000000..f3a67318 --- /dev/null +++ b/nestedtensor/csrc/cuda/cuda_kernels.h @@ -0,0 +1,70 @@ +/* + * Copyright (C) 2020 ByteDance Inc + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once +#include +#include +namespace nteffectivetransformer { + +template +void add_bias_act_kernelLauncher( + T* out, + const T* bias, + int m, + int n, + cudaStream_t stream); + +template +void add_bias_input_layernorm_kernelLauncher( + T* out, + const T* input_tensor, + const T* bias, + const T* gamma, + const T* beta, + int m, + int n, + cudaStream_t stream); + +void exclusiveScan_kernelLauncher( + int* d_out, + const int* d_in, + const int length, + const cudaStream_t stream); + +void compressBertInput_kernelLauncher( + // const T* from_tensor, + const int* mask, + const int* prefix_sum, + // T* to_tensor, + int* batch_idx, + int* word_idx, + int batch_size, + int seq_len, + int hidden_dim, + cudaStream_t stream); + +template +void restoreBertOutput_kernelLauncher( + T* to_tensor, + const T* from_tensor, + const int* batch_idx, + const int* word_idx, + int valid_word_num, + int seq_len, + int hidden_size, + cudaStream_t stream); + +} // namespace nteffectivetransformer diff --git a/nestedtensor/csrc/cuda/layernorm.cpp b/nestedtensor/csrc/cuda/layernorm.cpp new file mode 100644 index 00000000..fd7c68fc --- /dev/null +++ b/nestedtensor/csrc/cuda/layernorm.cpp @@ -0,0 +1,79 @@ +#include +#include +#include +#include +#include + +using namespace torch::nn; +namespace F = torch::nn::functional; + +namespace torch { +namespace nested_tensor { +namespace cuda { + +Tensor NestedTensor_layer_norm( + const Tensor& input, + IntArrayRef normalized_shape, + const c10::optional& weight, + const c10::optional& bias, + double eps, + bool /* cudnn_enable, deprecated */) { + if (weight && bias) { + if (is_nested_tensor_impl(input) && !is_nested_tensor_impl(*weight) && + !is_nested_tensor_impl(*bias)) { + auto input_opt_sizes = get_opt_sizes(input); + if (get_dim(input) == 3 && get_is_contiguous(input) && + (*input_opt_sizes[2]) % 32 == 0) { + at::Tensor input_buffer = get_buffer(input); + int size2 = (int)(*input_opt_sizes[2]); + int valid_word_num = (int)(input_buffer.numel() / size2); + at::Tensor zero_bias = torch::zeros({valid_word_num}, input.options()); + at::Tensor output_buffer = torch::zeros_like(input_buffer); + at::cuda::CUDAStream defaultStream = at::cuda::getDefaultCUDAStream(); + if (input_buffer.dtype() == torch::kFloat16) { + fastertransformer::layer_norm( + input_buffer.data_ptr(), + weight->data_ptr(), + bias->data_ptr(), + (c10::Half)(eps), + output_buffer.data_ptr(), + valid_word_num, + size2, + defaultStream); + } + if (input_buffer.dtype() == torch::kFloat32) { + fastertransformer::layer_norm( + input_buffer.data_ptr(), + weight->data_ptr(), + bias->data_ptr(), + (float)(eps), + output_buffer.data_ptr(), + valid_word_num, + size2, + defaultStream); + } + return wrap_buffer( + std::move(output_buffer), + get_efficient_nested_size(input), + get_efficient_nested_stride(input)); + } + } + return map_nested_tensor( + [normalized_shape, eps](const at::Tensor t, Tensor w, Tensor b) { + return at::layer_norm(t, normalized_shape, w, b, eps, true); + }, + input, + *weight, + *bias); + } + TORCH_CHECK(!weight && !bias, "Either both weight and bias are used or not."); + return map_nested_tensor( + [normalized_shape, eps](const at::Tensor t) { + return at::layer_norm( + t, normalized_shape, c10::nullopt, c10::nullopt, eps, true); + }, + input); +} +} // namespace cuda +} // namespace nested_tensor +} // namespace torch diff --git a/nestedtensor/csrc/cuda/layernorm.h b/nestedtensor/csrc/cuda/layernorm.h new file mode 100644 index 00000000..bdaa0ab9 --- /dev/null +++ b/nestedtensor/csrc/cuda/layernorm.h @@ -0,0 +1,17 @@ +#pragma once +#include +#include + +namespace torch { +namespace nested_tensor { +namespace cuda { +at::Tensor NestedTensor_layer_norm( + const at::Tensor& input, + at::IntArrayRef normalized_shape, + const c10::optional& weight, + const c10::optional& bias, + double eps, + bool /* cudnn_enable, deprecated */); +} +} // namespace nested_tensor +} // namespace torch diff --git a/nestedtensor/csrc/cuda/mha.cpp b/nestedtensor/csrc/cuda/mha.cpp new file mode 100644 index 00000000..e9bc933b --- /dev/null +++ b/nestedtensor/csrc/cuda/mha.cpp @@ -0,0 +1,116 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +namespace py = pybind11; + +using namespace torch::nested_tensor; +using namespace at; + +namespace torch { +namespace nested_tensor { + +at::Tensor bt_min_mha( + int64_t num_heads, + int64_t head_dim, + double dropout_p, + bool training, + at::Tensor query, + at::Tensor key, + at::Tensor value, + at::Tensor attr_kernel, + at::Tensor attr_bias, + double scaling, + at::Tensor out_proj_weight, + at::Tensor out_proj_bias) { + // TODO: Assert that max seq_len is 1024! + TORCH_CHECK(get_dim(query) == 3, "query needs to be 3 dim."); + TORCH_CHECK(get_dim(key) == 3, "key needs to be 3 dim."); + TORCH_CHECK(get_dim(value) == 3, "value needs to be 3 dim."); + TORCH_CHECK(get_nested_dim(query) == 1, "Query nested dim isn't 1."); + TORCH_CHECK(get_nested_dim(key) == 1, "Key nested dim isn't 1."); + TORCH_CHECK(get_nested_dim(value) == 1, "Value nested dim isn't 1."); + // TORCH_CHECK(in_proj_bias, "Input projection bias needs to be defined."); + // auto opt_sizes = get_opt_sizes(query); + // if (!opt_sizes[2]) { + // throw std::runtime_error("query's third dimension must be regular."); + // } + // TODO: Add explicit check that verifies query, key and value are the same + // auto start = std::chrono::system_clock::now(); + auto options = + torch::TensorOptions().dtype(torch::kInt32).device(torch::kCUDA); + int64_t embedding_dim = head_dim * num_heads; //*(opt_sizes[2]); + int64_t head_num = num_heads; + int64_t size_per_head = embedding_dim / head_num; + at::cuda::CUDAStream defaultStream = at::cuda::getDefaultCUDAStream(); + at::cuda::setCurrentCUDAStream(defaultStream); + + at::Tensor packed = at::matmul(query, attr_kernel.t()) + attr_bias; + + at::Tensor packed_padded = to_padded_tensor(packed, 0).contiguous(); + std::vector packed_padded_chunks = packed_padded.chunk(3, -1); + at::Tensor query_buf = packed_padded_chunks[0]; + at::Tensor key_buf = packed_padded_chunks[1]; + at::Tensor val_buf = packed_padded_chunks[2]; + int64_t batch_size = query_buf.size(0); + int64_t seq_len = query_buf.size(1); + + query_buf = query_buf.reshape({batch_size, seq_len, head_num, size_per_head}).transpose(1, 2); + key_buf = key_buf.reshape({batch_size, seq_len, head_num, size_per_head}).transpose(1, 2); + val_buf = val_buf.reshape({batch_size, seq_len, head_num, size_per_head}).transpose(1, 2); + + key_buf = key_buf.transpose(2, 3); + at::Tensor attn_output_weights = at::matmul(query_buf, key_buf).contiguous(); + + auto mask_options = + torch::TensorOptions().dtype(query.dtype()).device(torch::kCUDA); + at::Tensor input_mask = to_mask(query, 2); + input_mask = input_mask.to(options); + at::Tensor attr_mask = input_mask.view({-1, 1, 1, seq_len}).to(mask_options); + attr_mask = attr_mask * attr_mask.transpose(2, 3); + + if (query.dtype() == torch::kFloat16) { + nteffectivetransformer::cuda::softmax_kernel_kernelLauncher( + attn_output_weights.data_ptr(), + attr_mask.data_ptr(), + batch_size, + head_num, + seq_len, + (c10::Half)(scaling), + defaultStream); + } + + if (query.dtype() == torch::kFloat) { + nteffectivetransformer::cuda::softmax_kernel_kernelLauncher( + attn_output_weights.data_ptr(), + attr_mask.data_ptr(), + batch_size, + head_num, + seq_len, + (float)(scaling), + defaultStream); + } + + auto attn_output = at::matmul(attn_output_weights, val_buf); + attn_output = attn_output.transpose(1, 2).reshape({batch_size, seq_len, embedding_dim}).contiguous(); + at::Tensor attr_out = from_padded_tensor(attn_output, get_efficient_nested_size(query)); + return at::matmul(attr_out, out_proj_weight.t()); +} + +TORCH_LIBRARY_FRAGMENT(nestedtensor, m) { + m.def( + "bt_min_mha(int num_heads, int head_dim, float dropout_p, bool training, Tensor query, Tensor key, Tensor value, Tensor attr_kernel, Tensor attr_bias, float scaling, Tensor out_proj_weight, Tensor out_proj_bias) -> Tensor"); + m.impl("bt_min_mha", NestedTensorKey, &bt_min_mha); +} + +} // namespace nested_tensor +} // namespace torch diff --git a/nestedtensor/csrc/cuda/padding.cu b/nestedtensor/csrc/cuda/padding.cu new file mode 100644 index 00000000..3ad15ab1 --- /dev/null +++ b/nestedtensor/csrc/cuda/padding.cu @@ -0,0 +1,416 @@ +#include +#include +#include +#include +#include + +namespace nested_tensor { +namespace cuda { + +template +__global__ +void add_padding_1( + const T* input, + T* output, + T padding_value, + const int* offsets, + const int* input_sizes, + int input_dim, + int output_sizes_1, + const int batch_size) +{ + const int batch_id = blockIdx.x; + const int grid_id = blockIdx.y; + const int tid = threadIdx.x + grid_id * 256; + const int grainsize = 16 * 256; + const int batch_input_offset = offsets[batch_id]; + const int* sizes_i = input_sizes + batch_id * input_dim; + const int batch_output_offset = batch_id * output_sizes_1; + for (int ii = 0; ii < (output_sizes_1 / grainsize); ii++) { + const int i = ii * grainsize + tid; + const int output_offset = batch_output_offset + i; + if (i < sizes_i[0]) { + output[output_offset] = input[batch_input_offset + i]; + } else { + output[output_offset] = padding_value; + } + } + const int i = (output_sizes_1 / grainsize) * grainsize + tid; + if (i < output_sizes_1) { + const int output_offset = batch_output_offset + i; + if (i < sizes_i[0]) { + output[output_offset] = input[batch_input_offset + i]; + } else { + output[output_offset] = padding_value; + } + } +} + +template +__global__ +void add_padding_2( + const T* input, + T* output, + T padding_value, + const int* offsets, + const int* input_sizes, + int input_dim, + int output_sizes_1, + int output_sizes_2, + const int batch_size) +{ + const int batch_id = blockIdx.x; + const int grid_id = blockIdx.y; + const int tid = threadIdx.x + grid_id * 256; + const int grainsize = 16 * 256; + const int offset = offsets[batch_id]; + const int* sizes_i = input_sizes + batch_id * input_dim; + const int output_offset = batch_id * output_sizes_1 * output_sizes_2; + const int output_numel = output_sizes_1 * output_sizes_2; + for (int ii = 0; ii < (output_numel / grainsize); ii++) { + const int i = ii * grainsize + tid; + const int i0 = i / (output_sizes_2); + const int i1 = i % output_sizes_2; + if (i0 < sizes_i[0] && i1 < sizes_i[1]) { + const int input_offset = offset + i0 * sizes_i[1] + i1; + output[output_offset + i] = input[input_offset]; + } else { + output[output_offset + i] = padding_value; + } + } + const int i = (output_numel / grainsize) * grainsize + tid; + if (i < output_numel) { + const int i0 = i / (output_sizes_2); + const int i1 = i % output_sizes_2; + if (i0 < sizes_i[0] && i1 < sizes_i[1]) { + const int input_offset = offset + i0 * sizes_i[1] + i1; + output[output_offset + i] = input[input_offset]; + } else { + output[output_offset + i] = padding_value; + } + } +} + +template +__global__ +void add_padding_3( + const T* input, + T* output, + T padding_value, + const int* offsets, + const int* input_sizes, + int input_dim, + int output_sizes_1, + int output_sizes_2, + int output_sizes_3, + const int batch_size) +{ + const int batch_id = blockIdx.x; + const int grid_id = blockIdx.y; + const int tid = threadIdx.x + grid_id * 256; + const int grainsize = 16 * 256; + const int offset = offsets[batch_id]; + const int* sizes_i = input_sizes + batch_id * input_dim; + const int output_offset = batch_id * output_sizes_1 * output_sizes_2 * output_sizes_3; + const int output_numel = output_sizes_1 * output_sizes_2 * output_sizes_3; + for (int ii = 0; ii < (output_numel / grainsize); ii++) { + const int i = ii * grainsize + tid; + const int i0 = i / (output_sizes_2 * output_sizes_3); + const int i1 = (i % (output_sizes_2 * output_sizes_3)) / output_sizes_3; + const int i2 = i % output_sizes_3; + if (i0 < sizes_i[0] && i1 < sizes_i[1] && i2 < sizes_i[2]) { + const int input_offset = offset + i0 * (sizes_i[1] * sizes_i[2]) + i1 * sizes_i[2] + i2; + output[output_offset + i] = input[input_offset]; + } else { + output[output_offset + i] = padding_value; + } + } + const int i = (output_numel / grainsize) * grainsize + tid; + if (i < output_numel) { + const int i0 = i / (output_sizes_2 * output_sizes_3); + const int i1 = (i % (output_sizes_2 * output_sizes_3)) / output_sizes_3; + const int i2 = i % output_sizes_3; + if (i0 < sizes_i[0] && i1 < sizes_i[1] && i2 < sizes_i[2]) { + const int input_offset = offset + i0 * (sizes_i[1] * sizes_i[2]) + i1 * sizes_i[2] + i2; + output[output_offset + i] = input[input_offset]; + } else { + output[output_offset + i] = padding_value; + } + } +} + +template +void add_padding_kernelLauncher( + T* input, // [batch_size x None] + T* output, // [batch_size x max(input.nested_size(1)) x inner_size] + T padding_value, + const int* offsets, + const int* input_sizes, + int input_dim, + std::vector output_sizes, + const int batch_size, + const cudaStream_t stream) +{ + dim3 grid; + grid.x = batch_size; + grid.y = 16; + if (input_dim == 1) { + add_padding_1<<>>( + input, + output, + padding_value, + offsets, + input_sizes, + input_dim, + output_sizes[1], + batch_size); + } + if (input_dim == 2) { + add_padding_2<<>>( + input, + output, + padding_value, + offsets, + input_sizes, + input_dim, + output_sizes[1], + output_sizes[2], + batch_size); + } + if (input_dim == 3) { + add_padding_3<<>>( + input, + output, + padding_value, + offsets, + input_sizes, + input_dim, + output_sizes[1], + output_sizes[2], + output_sizes[3], + batch_size); + } +} + +template void add_padding_kernelLauncher( + float* input, + float* output, + float padding_value, + const int* offsets, + const int* input_sizes, + int input_dim, + std::vector output_sizes, + const int batch_size, + const cudaStream_t stream); + +template void add_padding_kernelLauncher( + c10::Half* input, + c10::Half* output, + c10::Half padding_value, + const int* offsets, + const int* input_sizes, + int input_dim, + std::vector output_sizes, + const int batch_size, + const cudaStream_t stream); + +template +__global__ +void add_padding_mask( + const T* input, + T* output, + int* output_mask, + const int* offsets, + const int batch_size, + const int mask_stride, + const int output_stride, + const int inner_size) +{ + const int batch_id = blockIdx.x; + for (int i = 0; i < (offsets[batch_id + 1] - offsets[batch_id]); i++) { + output_mask[batch_id*mask_stride + i] = 1; + } + for (int i = 0; i < (offsets[batch_id + 1] - offsets[batch_id]) * inner_size; i++) { + output[batch_id * output_stride + i] = input[offsets[batch_id] * inner_size + i]; + } +} + +template +void add_padding_mask_kernelLauncher( + T* input, // [batch_size x None] + T* output, // [batch_size x max(input.nested_size(1)) x inner_size] + int* output_mask, // [batch_size x max(input.nested_size(1))] + const int* offsets, // [batch_size] + const int batch_size, + const int mask_stride, + const int output_stride, + const int inner_size, + const cudaStream_t stream) +{ + dim3 grid; + grid.x = batch_size; + + add_padding_mask<<>>( + input, + output, + output_mask, + offsets, + batch_size, + mask_stride, + output_stride, + inner_size); +} + +template void add_padding_mask_kernelLauncher( + float* input, + float* output, + int* output_mask, + const int* offsets, + const int batch_size, + const int mask_stride, + const int output_stride, + const int inner_size, + const cudaStream_t stream); + +template void add_padding_mask_kernelLauncher( + c10::Half* input, + c10::Half* output, + int* output_mask, + const int* offsets, + const int batch_size, + const int mask_stride, + const int output_stride, + const int inner_size, + const cudaStream_t stream); + +template +__global__ +void remove_padding_2( + const T* input, + T* output, + const int* offsets, + const int* input_sizes, + const int* output_sizes, + int output_dim, + const int batch_size) +{ + const int batch_id = blockIdx.x; + const int grid_id = blockIdx.y; + const int tid = threadIdx.x + grid_id * 256; + const int grainsize = 16 * 256; + const int offset = offsets[batch_id]; + const int* sizes_i = output_sizes + batch_id * output_dim; + const int numel_i = sizes_i[0] * sizes_i[1]; + int input_offset = batch_id * input_sizes[1] * input_sizes[2]; + for (int ii = 0; ii < (numel_i / grainsize); ii++) { + const int i = ii * grainsize + tid; + const int i0 = i / sizes_i[1]; + const int i1 = i % sizes_i[1]; + const int i0_offset = i0 * input_sizes[2]; + output[offset + i] = input[input_offset + i0_offset + i1]; + } + const int i = (numel_i / grainsize) * grainsize + tid; + if (i < numel_i) { + const int i0 = i / sizes_i[1]; + const int i1 = i % sizes_i[1]; + const int i0_offset = i0 * input_sizes[2]; + output[offset + i] = input[input_offset + i0_offset + i1]; + } +} + +template +__global__ +void remove_padding( + const T* input, + T* output, + const int* offsets, + const int* input_sizes, + const int* output_sizes, + int output_dim, + const int batch_size) +{ + const int batch_id = blockIdx.x; + const int grid_id = blockIdx.y; + const int tid = threadIdx.x + grid_id * 256; + const int grainsize = 16 * 256; + const int offset = offsets[batch_id]; + const int* sizes_i = output_sizes + batch_id * output_dim; + const int numel_i = sizes_i[0] * sizes_i[1] * sizes_i[2]; + int input_offset = batch_id * input_sizes[1] * input_sizes[2] * input_sizes[3]; + for (int ii = 0; ii < (numel_i / grainsize); ii++) { + const int i = ii * grainsize + tid; + const int i0 = i / (sizes_i[1] * sizes_i[2]); + const int i1 = (i % (sizes_i[1] * sizes_i[2])) / sizes_i[2]; + const int i2 = i % sizes_i[2]; + const int i0_offset = i0 * input_sizes[2] * input_sizes[3]; + const int i1_offset = i1 * input_sizes[3]; + output[offset + i] = input[input_offset + i0_offset + i1_offset + i2]; + } + const int i = (numel_i / grainsize) * grainsize + tid; + if (i < numel_i) { + const int i0 = i / (sizes_i[1] * sizes_i[2]); + const int i1 = (i % (sizes_i[1] * sizes_i[2])) / sizes_i[2]; + const int i2 = i % sizes_i[2]; + const int i0_offset = i0 * input_sizes[2] * input_sizes[3]; + const int i1_offset = i1 * input_sizes[3]; + output[offset + i] = input[input_offset + i0_offset + i1_offset + i2]; + } +} + +template +void remove_padding_kernelLauncher( + const T* input, + T* output, + const int* offsets, + const int* input_sizes, + const int* output_sizes, + int output_dim, + const int batch_size, + const cudaStream_t stream) +{ + dim3 grid; + grid.x = batch_size; + grid.y = 16; + + if (output_dim == 2) { + remove_padding_2<<>>( + input, + output, + offsets, + input_sizes, + output_sizes, + output_dim, + batch_size); + } else { + remove_padding<<>>( + input, + output, + offsets, + input_sizes, + output_sizes, + output_dim, + batch_size); + } +} + +template void remove_padding_kernelLauncher( + const float* input, + float* output, + const int* offsets, + const int* input_sizes, + const int* output_sizes, + int output_dim, + const int batch_size, + const cudaStream_t stream); + +template void remove_padding_kernelLauncher( + const c10::Half* input, + c10::Half* output, + const int* offsets, + const int* input_sizes, + const int* output_sizes, + int output_dim, + const int batch_size, + const cudaStream_t stream); +} +} diff --git a/nestedtensor/csrc/cuda/padding.h b/nestedtensor/csrc/cuda/padding.h new file mode 100644 index 00000000..53137a8b --- /dev/null +++ b/nestedtensor/csrc/cuda/padding.h @@ -0,0 +1,48 @@ +#pragma once + +#include +#include +#include +#include +#include + +namespace nested_tensor { +namespace cuda { + +template +void add_padding_kernelLauncher( + T* input, + T* output, + T padding_value, + const int* offsets, + const int* input_sizes, + int input_dim, + std::vector output_sizes, + const int batch_size, + const cudaStream_t stream); + +template +void add_padding_mask_kernelLauncher( + T* input, + T* output, + int* output_mask, + const int* lengths, + const int batch_size, + const int mask_stride, + const int output_stride, + const int inner_size, + const cudaStream_t stream); + +template +void remove_padding_kernelLauncher( + const T* input, + T* output, + const int* offsets, + const int* input_sizes, + const int* output_sizes, + int output_dim, + const int batch_size, + const cudaStream_t stream); + +} +} // namespace nested_tensor diff --git a/nestedtensor/csrc/cuda/transformer_kernels.cu b/nestedtensor/csrc/cuda/transformer_kernels.cu new file mode 100644 index 00000000..88a346b5 --- /dev/null +++ b/nestedtensor/csrc/cuda/transformer_kernels.cu @@ -0,0 +1,376 @@ +/* +* Copyright (c) 2020-2021, NVIDIA CORPORATION. All rights reserved. +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +#include +#include + +namespace fastertransformer +{ + + +template +__inline__ __device__ +T warpReduceSum(T val) +{ + for(int mask = 16; mask > 0; mask >>= 1) + val += __shfl_xor_sync(FINAL_MASK, val, mask, 32); + return val; +} + +template +__inline__ __device__ +T blockReduceSum(T val) +{ + static __shared__ T shared[32]; + int lane = threadIdx.x & 0x1f; + int wid = threadIdx.x >> 5; + + val = warpReduceSum(val); + + if(lane == 0) + shared[wid] = val; + __syncthreads(); + + val = (threadIdx.x < (blockDim.x >> 5 )) ? shared[lane] : (T)0.0f; + val = warpReduceSum(val); + return val; +} + +template +__global__ +void add_bias_gelu(T* out, const T* __restrict bias, int m, int n) +{ + for(int id = blockIdx.x * blockDim.x + threadIdx.x; id < m * n; id += blockDim.x * gridDim.x) + { + T reg_bias = __ldg(&bias[id % n]); + T val = out[id] + reg_bias; + out[id] = (T)(gelu(val)); + } +} + +template +__global__ +void add_bias_input_layernorm(T* out, const T* input, const T* bias, const T* gamma, const T* beta, int m, int n) +{ + int tid = threadIdx.x; + + __shared__ float s_mean; + __shared__ float s_variance; + float mean = 0.0f; + float variance = 0.0f; + + float local_out = 0.0f; + local_out += (float)(out[blockIdx.x * n + tid] + input[blockIdx.x * n + tid] + __ldg(&bias[tid])); + + mean = blockReduceSum(local_out); + if(threadIdx.x == 0) + s_mean = mean / n; + __syncthreads(); + + variance = blockReduceSum((local_out - s_mean) * (local_out - s_mean)); + if(threadIdx.x == 0) + s_variance = variance / n + 1e-6f; + __syncthreads(); + + out[blockIdx.x * n + tid] = + (T)(((local_out - s_mean) * rsqrtf(s_variance)) * (float)(__ldg(&gamma[tid])) + (float)(__ldg(&beta[tid]))); +} + +template +__global__ +void add_bias_input_layernorm_v2(T* out, const T* __restrict input, const T* __restrict bias, + const T* __restrict gamma, const T* __restrict beta, int n) +{ + const int ite = 4; + const int tid = threadIdx.x; + const int bid = blockIdx.x; + + __shared__ float s_mean; + __shared__ float s_variance; + float mean = 0.0f; + float variance = 0.0f; + float local_out[ite]; + + float sum = 0.0f; + #pragma unroll + for(int i = 0; i < ite; i++) + { + int col_id = i * blockDim.x + tid; + int id = bid * n + col_id; + local_out[i] = (float)(out[id] + __ldg(&input[id]) + __ldg(&bias[col_id])); + sum += local_out[i]; + } + + mean = blockReduceSum(sum); + if(tid == 0) + s_mean = mean / n; + __syncthreads(); + + float var = 0.0f; + #pragma unroll + for(int i = 0; i < ite; i++) + { + float diff = local_out[i] - s_mean; + var += diff * diff; + } + + variance = blockReduceSum(var); + if(tid == 0) + s_variance = rsqrtf(variance / n + 1e-6f); + __syncthreads(); + + #pragma unroll + for(int i = 0; i < ite; i++) + { + int col_id = i * blockDim.x + tid; + int id = bid * n + col_id; + out[id] = (T)((local_out[i] - s_mean) * s_variance * (float)__ldg(&gamma[col_id]) + (float)__ldg(&beta[col_id])); + } +} + +template +void add_bias_input_layernorm_kernelLauncher(T* out, const T* input, const T* bias, + const T* gamma, const T* beta, int m, int n, cudaStream_t stream) +{ + dim3 grid(m); + dim3 block(n); + assert(n <= 1024); + if(n == 768 || n == 1024) + add_bias_input_layernorm_v2<<>>(out, input, bias, gamma, beta, n); + else + add_bias_input_layernorm<<>>(out, input, bias, gamma, beta, m, n); +} + +template +__global__ +void add_bias_input_layernorm_2(const T* __restrict input, + const T* __restrict gamma, + const T* __restrict beta, + const T* __restrict bias, + T* output, T* norm_output, + int m, int n) +{ + int tid = threadIdx.x; + + __shared__ float s_mean; + __shared__ float s_variance; + float mean = 0.0f; + float variance = 0.0f; + + float local_sum = 0.0f; + for(int i = tid; i < n; i+= blockDim.x) + { + float local_out = (float)(__ldg(&input[blockIdx.x * n + i])); + local_out += (float)(output[blockIdx.x * n + i]); + local_out += (float)(__ldg(&bias[i])); + output[blockIdx.x * n + i] = (T)local_out; + local_sum += local_out; + } + + mean = blockReduceSum(local_sum); + + if(threadIdx.x == 0) + s_mean = mean / n; + __syncthreads(); + + float local_var_sum = 0.0f; + for(int i = tid; i < n; i+= blockDim.x) + { + float diff = (float)(__ldg(&output[blockIdx.x * n + i])) - s_mean; + local_var_sum += diff * diff; + } + variance = blockReduceSum(local_var_sum); + + if(threadIdx.x == 0) + s_variance = rsqrtf(variance / n + 1e-6); + __syncthreads(); + + for(int i = tid; i < n; i+= blockDim.x) + { + norm_output[blockIdx.x * n + i] = + (T)((( (float)output[blockIdx.x * n + i] - s_mean) * s_variance) * (float)(__ldg(&gamma[i])) + (float)(__ldg(&beta[i]))); + } +} + +template +void add_bias_input_layernorm_2_kernelLauncher( + const T* input, + const T* gamma, + const T* beta, + const T* bias, + T* output, + T* norm_output, + int m, int n, + cudaStream_t stream) +{ + dim3 grid(m); + dim3 block(min(n, 1024)); + + /* For general cases, n is equal to hidden_units, e.g., 512/1024. + Since we have warp shuffle inside the code, block.x % 32 should be 0. + */ + + if(n % 32 != 0) + block.x = 1024; + + block.x = block.x / (4 / sizeof(T)); // if using half, only need half of block.x + + /* should pay attention to the rsqrt precision*/ + add_bias_input_layernorm_2<<>>(input, gamma, beta, bias, output, norm_output, m, n); // For gpt-3 +} + +template +__global__ +void add_bias_input(T* output, const T* input, const T* bias, const int m, const int n) +{ + // This kernel can run with any block size and grid size + // Since the hidden dimension of GPT-3 would be larger than 1024 + const int bid = blockIdx.x; + const int blocks_per_row = n / blockDim.x; + const int col_index = (bid % blocks_per_row) * blockDim.x + threadIdx.x; + T bias_val = __ldg(&bias[col_index]); + for(int index = bid * blockDim.x + threadIdx.x; index < m * n; index += blockDim.x * gridDim.x) + { + output[index] = output[index] + input[index] + bias_val; + } +} + +template +void add_bias_input_kernelLauncher(T* output, const T* bias, const T* input, const int m, const int n, cudaStream_t stream) +{ + dim3 grid(min(m, 65536)); + dim3 block(min(n, 1024)); + + add_bias_input<<>>(output, input, bias, m, n); +} + +template +__global__ +void layer_norm_kernel_generalize(const T* __restrict input, + const T* __restrict gamma, + const T* __restrict beta, + T eps, + T* output, + int m, int n) +{ + const int tid = threadIdx.x; + + __shared__ float s_mean; + __shared__ float s_variance; + float mean = 0.0f; + float variance = 0.0f; + + float local_sum = 0.0f; + for(int i = tid; i < n; i+= blockDim.x) + { + local_sum += (float)(__ldg(&input[blockIdx.x * n + i])); + } + + mean = blockReduceSum(local_sum); + + if(threadIdx.x == 0) + s_mean = mean / n; + __syncthreads(); + + float local_var_sum = 0.0f; + for(int i = tid; i < n; i+= blockDim.x) + { + float diff = (float)(__ldg(&input[blockIdx.x * n + i])) - s_mean; + local_var_sum += diff * diff; + } + variance = blockReduceSum(local_var_sum); + + if(threadIdx.x == 0) + s_variance = rsqrtf(variance / n + eps); + + __syncthreads(); + + for(int i = tid; i < n; i+= blockDim.x) + { + output[blockIdx.x * n + i] = + (T)((( (float)input[blockIdx.x * n + i] - s_mean) * s_variance) * (float)(__ldg(&gamma[i])) + (float)(__ldg(&beta[i]))); + } +} + +template +void layer_norm( + const T* input, + const T* gamma, + const T* beta, + T eps, + T* output, + int m, int n, + cudaStream_t stream) +{ + dim3 grid(m); + dim3 block(min(n, 1024)); + + /* For general cases, n is equal to hidden_units, e.g., 512/1024. + Since we have warp shuffle inside the code, block.x % 32 should be 0. + */ + if(n % 32 != 0) + block.x = 1024; + + block.x = block.x / (4 / sizeof(T)); // if using half, only need half of block.x + // Note that this cannot be less than 32 because blockReduceSum above + // uses (threadIdx.x < blockDim.x >> 5), which is true if blockDim.x is 16 + // which happens if n is 32 and we're using half. + block.x = max(32, block.x); + + /* should pay attention to the rsqrt precision*/ + layer_norm_kernel_generalize<<>>(input, gamma, beta, eps, output, m, n); // For gpt-3 +} + +template void add_bias_input_layernorm_kernelLauncher( + float* out, const float* input, const float* bias, const float* gamma, const float* beta, + int m, int n, cudaStream_t stream); + +template void add_bias_input_layernorm_2_kernelLauncher( + const float* input, + const float* gamma, + const float* beta, + const float* bias, + float* output, + float* norm_output, + int m, int n, cudaStream_t stream); + +template void add_bias_input_kernelLauncher( + float* output, + const float* bias, + const float* input, + const int m, + const int n, + cudaStream_t stream); + +template void layer_norm( + const float* input, + const float* gamma, + const float* beta, + float eps, + float* output, + int m, int n, + cudaStream_t stream); + +template void layer_norm( + const c10::Half* input, + const c10::Half* gamma, + const c10::Half* beta, + c10::Half eps, + c10::Half* output, + int m, int n, + cudaStream_t stream); + +} // namespace fastertransformer diff --git a/nestedtensor/csrc/cuda/transformer_kernels.h b/nestedtensor/csrc/cuda/transformer_kernels.h new file mode 100644 index 00000000..ca5fdae9 --- /dev/null +++ b/nestedtensor/csrc/cuda/transformer_kernels.h @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2020-2021, NVIDIA CORPORATION. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + +Changes in comparison to original at commit 3bf1d43. Apply to both header and definitions. + - Changed include path + - Removed unneeded includes + - Removed add_bias_act.* code + - Removed code related to float16 / half + - Added FINAL_MASK define + - Added eps option to layer_norm + + */ + +#pragma once +#include +#include +#include + +namespace fastertransformer +{ + +#define FINAL_MASK 0xffffffff + +template +void add_bias_input_layernorm_kernelLauncher(T *out, const T *input_tensor, + const T *bias, const T *gamma, + const T *beta, int m, int n, + cudaStream_t stream); + +template +void add_bias_input_layernorm_2_kernelLauncher(const T *from_tensor, const T *gamma, + const T *beta, const T *bias, + T *output, T *norm_output_buf_, + const int m, const int n, cudaStream_t stream); + +template +void add_bias_input_kernelLauncher(T *output, const T *bias, const T *input, const int m, const int n, cudaStream_t stream); + +template +void layer_norm(const T *from_tensor, const T *gamma, + const T *beta, T eps, T *norm_from_tensor_buf_, const int m, const int n, cudaStream_t stream); + +} // namespace fastertransformer diff --git a/nestedtensor/csrc/cuda/transpose.cu b/nestedtensor/csrc/cuda/transpose.cu new file mode 100644 index 00000000..5c5c4dcf --- /dev/null +++ b/nestedtensor/csrc/cuda/transpose.cu @@ -0,0 +1,261 @@ +#include +#include +#include +#include +#include + +namespace nested_tensor { +namespace cuda { + +template +__global__ +void transpose_nchw_nhwc( + T* input, + T* output, + const int* block_offsets, + const int* offsets, + const int batch_size, + const int num_channel) +{ + __shared__ T tile[num_threads_sqrt][num_threads_sqrt + 1]; + const int block_id = blockIdx.x; + const int tid2 = threadIdx.x / 32; + const int tid3 = threadIdx.x % 32; + int batch_id = threadIdx.x % 32; + bool found = false; + while (batch_id < batch_size) { + if (block_offsets[batch_id] <= block_id && + block_id < block_offsets[batch_id + 1]) { + found = true; + break; + } + batch_id += 32; + } + if (!found) { + batch_id = 0; + } + // TODO: Parameterize on warp size instead of assuming 32. + for (int warp_offset = 16; warp_offset > 0; warp_offset /= 2) + batch_id = batch_id | __shfl_down_sync(0xFFFFFFFF, batch_id, warp_offset); + batch_id = __shfl_sync(0xFFFFFFFF, batch_id, 0, 32); + + const int grain_size = num_threads_sqrt; + const int size2 = num_channel; + const int block_offset = block_offsets[batch_id]; + const int offset = offsets[batch_id]; + const int next_offset = offsets[batch_id + 1]; + const int size3 = (next_offset - offset) / num_channel; + + const int num_chunks_3 = (size3 + grain_size - 1) / grain_size; + const int current_block = block_id - block_offset; + const int current_block_mod = (current_block % num_chunks_3) * grain_size; + const int current_block_div = (current_block / num_chunks_3) * grain_size; + const int offset1_tid2 = (current_block_mod) + tid2; + const int offset2_tid2 = (current_block_div) + tid2; + const int offset1_tid3 = (current_block_mod) + tid3; + const int offset2_tid3 = (current_block_div) + tid3; + const int ii3 = offset1_tid3; +#pragma unroll + for (int sub = 0; sub < 4; sub++) { + const int ii2 = offset2_tid2 + sub * 8; + if (ii2 < size2 && ii3 < size3) { + const int ii = ii2 * size3 + ii3; + tile[tid2 + sub * 8][tid3] = input[offset + ii]; + } + } + + __syncthreads(); + + const int ii21 = offset2_tid3; +#pragma unroll + for (int sub = 0; sub < 4; sub++) { + const int ii31 = offset1_tid2 + sub * 8; + if (ii21 < size2 && ii31 < size3) { + const int ii1 = ii21 * size3 + ii31; + const int j = (ii1 % size3) * size2; + const int i = (ii1 / size3); + output[offset + j + i] = tile[tid3][tid2 + sub * 8]; + } + } +} + +template +void transpose_nchw_nhwc_kernelLauncher( + T* input, // [batch_size x None] + T* output, // [batch_size x max(input.nested_size(1)) x inner_size] + const int* block_offsets, + const int* offsets, + const int batch_size, + const int block_numel, + const int num_channel, + const cudaStream_t stream) +{ + dim3 grid; + grid.x = block_numel; + + transpose_nchw_nhwc<<>>( + input, + output, + block_offsets, + offsets, + batch_size, + num_channel); +} + +template void transpose_nchw_nhwc_kernelLauncher( + c10::Half* input, + c10::Half* output, + const int* block_offsets, + const int* offsets, + const int batch_size, + const int block_numel, + const int num_channel, + const cudaStream_t stream); + +template void transpose_nchw_nhwc_kernelLauncher( + float* input, + float* output, + const int* block_offsets, + const int* offsets, + const int batch_size, + const int block_numel, + const int num_channel, + const cudaStream_t stream); + +template +__global__ +void transpose_nhwc_nchw( + T* input, + T* output, + const int* block_offsets, + const int* offsets, + const int batch_size, + const int num_channel, + const int num_chunks) +{ + __shared__ T tile[num_threads_sqrt][num_threads_sqrt + 1]; + const int block_id = blockIdx.x; + const int tid2 = threadIdx.x / 32; + const int tid3 = threadIdx.x % 32; + int batch_id = threadIdx.x % 32; + bool found = false; + while (batch_id < batch_size) { + if (block_offsets[batch_id] <= block_id && + block_id < block_offsets[batch_id + 1]) { + found = true; + break; + } + batch_id += 32; + } + if (!found) { + batch_id = 0; + } + // TODO: Parameterize on warp size instead of assuming 32. + for (int warp_offset = 16; warp_offset > 0; warp_offset /= 2) + batch_id = batch_id | __shfl_down_sync(0xFFFFFFFF, batch_id, warp_offset); + batch_id = __shfl_sync(0xFFFFFFFF, batch_id, 0, 32); + + const int block_offset = block_offsets[batch_id]; + const int offset = offsets[batch_id]; + const int next_offset = offsets[batch_id + 1]; + const int image_numel = next_offset - offset; + const int size2 = image_numel / num_channel; + + const int current_block = block_id - block_offset; + const int current_block_mod = (current_block % num_chunks) * num_threads_sqrt; + const int current_block_div = (current_block / num_chunks) * num_threads_sqrt; + const int offset1_tid2 = (current_block_mod) + tid2; + const int offset2_tid3 = (current_block_div) + tid3; + + int ii = offset + (current_block / num_chunks) * num_threads_sqrt * num_channel + tid2 * num_channel + (current_block_mod) + tid3; + if (ii + 3 * 8 * num_channel < next_offset) { + tile[tid2 + 0 * 8][tid3] = input[ii + 0 * 8 * num_channel]; + tile[tid2 + 1 * 8][tid3] = input[ii + 1 * 8 * num_channel]; + tile[tid2 + 2 * 8][tid3] = input[ii + 2 * 8 * num_channel]; + tile[tid2 + 3 * 8][tid3] = input[ii + 3 * 8 * num_channel]; + } else { +#pragma unroll + for (int sub = 0; sub < 4; sub++) { + if (ii < next_offset) { + tile[tid2 + sub * 8][tid3] = input[ii]; + } + ii += 8 * num_channel; + } + } + + __syncthreads(); + + int ii21 = offset2_tid3; + if (ii21 < size2) { + ii21 = ii21 * num_channel; + if (offset1_tid2 + 3 * 8 < num_channel) { + int ii1 = ii21 + offset1_tid2; +#pragma unroll + for (int sub = 0; sub < 4; sub++) { + const int j = (ii1 % num_channel) * size2; + const int i = (ii1 / num_channel); + output[offset + j + i] = tile[tid3][tid2 + sub * 8]; + ii1 += 8; + } + } else { +#pragma unroll + for (int sub = 0; sub < 4; sub++) { + const int ii31 = offset1_tid2 + sub * 8; + if (ii31 < num_channel) { + const int ii1 = ii21 + ii31; + const int j = (ii1 % num_channel) * size2; + const int i = (ii1 / num_channel); + output[offset + j + i] = tile[tid3][tid2 + sub * 8]; + } + } + } + } +} + +template +void transpose_nhwc_nchw_kernelLauncher( + T* input, // [batch_size x None] + T* output, // [batch_size x max(input.nested_size(1)) x inner_size] + const int* block_offsets, + const int* offsets, + const int batch_size, + const int block_numel, + const int num_channel, + const cudaStream_t stream) +{ + dim3 grid; + grid.x = block_numel; + + const int num_chunks = (num_channel + 32 - 1) / 32; + transpose_nhwc_nchw<<>>( + input, + output, + block_offsets, + offsets, + batch_size, + num_channel, + num_chunks); +} + +template void transpose_nhwc_nchw_kernelLauncher( + c10::Half* input, + c10::Half* output, + const int* block_offsets, + const int* offsets, + const int batch_size, + const int block_numel, + const int num_channel, + const cudaStream_t stream); + +template void transpose_nhwc_nchw_kernelLauncher( + float* input, + float* output, + const int* block_offsets, + const int* offsets, + const int batch_size, + const int block_numel, + const int num_channel, + const cudaStream_t stream); + +} +} // namespace nested_tensor diff --git a/nestedtensor/csrc/cuda/transpose.h b/nestedtensor/csrc/cuda/transpose.h new file mode 100644 index 00000000..42867f7e --- /dev/null +++ b/nestedtensor/csrc/cuda/transpose.h @@ -0,0 +1,33 @@ +#pragma once +#include +#include +#include +#include + +namespace nested_tensor { +namespace cuda { + +template +void transpose_nchw_nhwc_kernelLauncher( + T* input, + T* output, + const int* block_offsets, + const int* offsets, + const int batch_size, + const int block_numel, + const int num_channel, + const cudaStream_t stream); + +template +void transpose_nhwc_nchw_kernelLauncher( + T* input, + T* output, + const int* block_offsets, + const int* offsets, + const int batch_size, + const int block_numel, + const int num_channel, + const cudaStream_t stream); + +} +} // namespace nested_tensor diff --git a/nestedtensor/csrc/fold.cpp b/nestedtensor/csrc/fold.cpp index 9d7e781a..531474bf 100644 --- a/nestedtensor/csrc/fold.cpp +++ b/nestedtensor/csrc/fold.cpp @@ -14,7 +14,7 @@ Tensor NestedTensor_im2col( IntArrayRef dilation, IntArrayRef padding, IntArrayRef stride) { - return autograd_map_nested_tensor( + return map_nested_tensor( [&](at::Tensor t) { return at::im2col( t.unsqueeze(0), kernel_size, dilation, padding, stride) @@ -30,7 +30,7 @@ Tensor NestedTensor_col2im( IntArrayRef dilation, IntArrayRef padding, IntArrayRef stride) { - return autograd_map_nested_tensor( + return map_nested_tensor( [&](at::Tensor t) { return at::col2im( t.unsqueeze(0), @@ -44,7 +44,7 @@ Tensor NestedTensor_col2im( self); } -TORCH_LIBRARY_IMPL(aten, AutogradPrivateUse1, m) { +TORCH_LIBRARY_IMPL(aten, NestedTensor, m) { nt_impl(m, "im2col", NestedTensor_im2col); nt_impl(m, "col2im", NestedTensor_col2im); } diff --git a/nestedtensor/csrc/functions.cpp b/nestedtensor/csrc/functions.cpp index 443f1704..5dd2d8c6 100644 --- a/nestedtensor/csrc/functions.cpp +++ b/nestedtensor/csrc/functions.cpp @@ -1,3 +1,6 @@ +#ifdef WITH_CUDA +#include +#endif #include #include #include @@ -16,14 +19,42 @@ Tensor NestedTensor_embedding( bool sparse) { if (is_nested_tensor_impl(weight)) { // TODO: Needs test coverage - return autograd_map_nested_tensor( + return map_nested_tensor( [&](at::Tensor w, at::Tensor i) { return at::embedding(w, i, padding_idx, scale_grad_by_freq, sparse); }, weight, indices); } - return autograd_map_nested_tensor( + if (is_nested_tensor_impl(indices) && + !is_nested_tensor_impl(weight) && + get_dim(indices) == 1 && + get_dim(weight) == 2 && + get_is_contiguous(indices) && + get_is_contiguous(weight)) { + Tensor indices_buffer = get_buffer(indices); + Tensor result_buffer = at::embedding( + weight, indices_buffer, padding_idx, scale_grad_by_freq, sparse); + EfficientSizeNode new_nested_size = get_efficient_nested_size(indices); + EfficientSizeNode new_nested_stride = get_efficient_nested_stride(indices); + auto new_nested_size_sizes = new_nested_size.sizes(); + auto new_nested_stride_sizes = new_nested_stride.sizes(); + auto tmp = torch::empty( + {new_nested_size_sizes.size(0)}, new_nested_size_sizes.options()); + tmp.fill_(weight.size(1)); + tmp = tmp.reshape({new_nested_size_sizes.size(0), 1}); + new_nested_size_sizes = at::cat({new_nested_size_sizes, tmp}, 1); + new_nested_stride_sizes = at::cat({tmp, new_nested_stride_sizes}, 1); + return wrap_buffer( + std::move(result_buffer), + EfficientSizeNode( + new_nested_size.structure(), + new_nested_size_sizes), + EfficientSizeNode( + new_nested_stride.structure(), + new_nested_stride_sizes)); + } + return map_nested_tensor( [&](at::Tensor i) { return at::embedding( weight, i, padding_idx, scale_grad_by_freq, sparse); @@ -31,25 +62,6 @@ Tensor NestedTensor_embedding( indices); } - -Tensor NestedTensor_softmax( - const Tensor& input, - const int64_t dim_, - c10::optional dtype) { - int64_t dim = maybe_wrap_dim(dim_, input.dim()); - auto input_data = get_nested_tensor_impl(input); - int64_t nested_dim = input_data->nested_dim(); - TORCH_CHECK( - dim >= nested_dim, - "Cannot apply softmax across nested dimensions ", - std::to_string(dim)); - return autograd_map_nested_tensor( - [dim, nested_dim, dtype](const at::Tensor t) { - return at::softmax(t, dim - nested_dim, dtype); - }, - input); -} - Tensor NestedTensor_layer_norm( const Tensor& input, IntArrayRef normalized_shape, @@ -60,17 +72,28 @@ Tensor NestedTensor_layer_norm( TORCH_CHECK( normalized_shape.size() == 1, "Currently only singleton tuples of integers supported for layer_norm."); - auto input_data = get_nested_tensor_impl(input); + auto input_opt_sizes = get_opt_sizes(input); TORCH_CHECK( - input_data->opt_sizes()[input.dim() - 1], + input_opt_sizes[get_dim(input) - 1], "Cannot normalize across irregular dimension ", - std::to_string(input.dim() - 1)); + std::to_string(get_dim(input) - 1)); + TORCH_CHECK( + *input_opt_sizes[get_dim(input) - 1] == normalized_shape[0], + "Normalized shape [", + normalized_shape[0], + "] does not match the size of the last dimension (", + *input_opt_sizes[get_dim(input) - 1], + ") of input."); + if (weight && bias) { - return autograd_map_nested_tensor( - [normalized_shape, eps]( - const at::Tensor t, - Tensor w, - Tensor b) { +#ifdef WITH_CUDA + if (weight->is_cuda() && bias->is_cuda()) { + return torch::nested_tensor::cuda::NestedTensor_layer_norm( + input, normalized_shape, weight, bias, eps, true); + } +#endif + return map_nested_tensor( + [normalized_shape, eps](const at::Tensor t, Tensor w, Tensor b) { return at::layer_norm(t, normalized_shape, w, b, eps, true); }, input, @@ -78,7 +101,7 @@ Tensor NestedTensor_layer_norm( *bias); } TORCH_CHECK(!weight && !bias, "Either both weight and bias are used or not."); - return autograd_map_nested_tensor( + return map_nested_tensor( [normalized_shape, eps](const at::Tensor t) { return at::layer_norm( t, normalized_shape, c10::nullopt, c10::nullopt, eps, true); @@ -88,7 +111,7 @@ Tensor NestedTensor_layer_norm( Tensor NestedTensor_all(const Tensor& self) { auto self_impl = get_nested_tensor_impl(self); - if (self.numel() == 0) { + if (get_numel(self) == 0) { // XXX: self.options doesn't work here because // we don't want a Tensor backed by a NestedTensor Tensor result = at::empty({0}, at::kBool); //, self.options()); @@ -108,7 +131,7 @@ Tensor NestedTensor_all(const Tensor& self) { Tensor NestedTensor_any(const Tensor& self) { auto self_impl = get_nested_tensor_impl(self); - if (self.numel() == 0) { + if (get_numel(self) == 0) { // XXX: self.options doesn't work here because // we don't want a Tensor backed by a NestedTensor Tensor result = at::empty({0}, at::kBool); //, self.options()); @@ -130,13 +153,13 @@ Tensor NestedTensor__log_softmax( const Tensor& self, const int64_t dim_, const bool half_to_float) { - return autograd_map_nested_tensor( + return map_nested_tensor( [&](Tensor a) { return at::_log_softmax(a, dim_, half_to_float); }, self); } -Tensor NestedTensor_pin_memory(const Tensor& self) { +Tensor NestedTensor_pin_memory(const Tensor& self, c10::optional device) { return map_nested_tensor( - [](Tensor tensor) { return at::native::pin_memory(tensor); }, self); + [&device](Tensor tensor) { return at::native::pin_memory(tensor, device); }, self); } Tensor NestedTensor_flatten( @@ -144,15 +167,15 @@ Tensor NestedTensor_flatten( int64_t start_dim, int64_t end_dim) { auto self_data = get_nested_tensor_impl(self); - start_dim = maybe_wrap_dim(start_dim, self.dim()); - end_dim = maybe_wrap_dim(end_dim, self.dim()); + start_dim = maybe_wrap_dim(start_dim, get_dim(self)); + end_dim = maybe_wrap_dim(end_dim, get_dim(self)); int64_t nested_dim = self_data->nested_dim(); TORCH_CHECK( start_dim >= nested_dim, "Cannot flatten nested dimension ", start_dim); TORCH_CHECK( end_dim >= nested_dim, "Cannot flatten nested dimension ", end_dim); // XXX: Write test that checks for flatten autograd support. - return autograd_map_nested_tensor( + return map_nested_tensor( [start_dim, end_dim, nested_dim](at::Tensor tensor) { return at::flatten( tensor, start_dim - nested_dim, end_dim - nested_dim); @@ -169,21 +192,21 @@ std::vector get_stack_inputs(TensorList tensors, int64_t dim) { } Tensor& NestedTensor_stack_out( - Tensor& result, TensorList tensors, - int64_t dim) { + int64_t dim, + Tensor& result) { TORCH_CHECK(tensors.size() > 0, "stack expects a non-empty TensorList"); - dim = maybe_wrap_dim(dim, tensors[0].dim() + 1); + dim = maybe_wrap_dim(dim, get_dim(tensors[0]) + 1); return at::cat_out(result, get_stack_inputs(tensors, dim), dim); } Tensor NestedTensor_stack(TensorList tensors, int64_t dim) { TORCH_CHECK(tensors.size() > 0, "stack expects a non-empty TensorList"); - dim = maybe_wrap_dim(dim, tensors[0].dim() + 1); + dim = maybe_wrap_dim(dim, get_dim(tensors[0]) + 1); return at::cat(get_stack_inputs(tensors, dim), dim); } -Tensor& NestedTensor_cat_out(Tensor& result, TensorList tensors, int64_t dim) { +Tensor& NestedTensor_cat_out(TensorList tensors, int64_t dim, Tensor& result) { auto tmp = at::cat(tensors, dim); result.copy_(tmp); return result; @@ -192,14 +215,14 @@ Tensor& NestedTensor_cat_out(Tensor& result, TensorList tensors, int64_t dim) { Tensor NestedTensor_cat(TensorList tensors, int64_t dim) { TORCH_CHECK(tensors.size() > 0, "Cannot cat an empty list."); auto nested_dim_0 = get_nested_tensor_impl(tensors[0])->nested_dim(); - auto dim_0 = get_nested_tensor_impl(tensors[0])->dim(); + auto dim_0 = get_dim(tensors[0]); // TORCH_CHECK(dim == 0, "cat currently only supports dim set to 0.") for (size_t i = 1; i < tensors.size(); i++) { TORCH_CHECK( nested_dim_0 == get_nested_tensor_impl(tensors[i])->nested_dim(), "Nested dimension of NestedTensors must match for cat to succeed."); TORCH_CHECK( - dim_0 == get_nested_tensor_impl(tensors[i])->dim(), + dim_0 == get_dim(tensors[i]), "Dimension of NestedTensors must match for cat to succeed."); } if (dim == 0) { @@ -234,12 +257,11 @@ Tensor NestedTensor_cat(TensorList tensors, int64_t dim) { return wrap_tensor_node(TensorNode(std::move(result))); } -TORCH_LIBRARY_IMPL(aten, AutogradPrivateUse1, m) { +TORCH_LIBRARY_IMPL(aten, NestedTensor, m) { nt_impl(m, "embedding", NestedTensor_embedding); nt_impl(m, "any", NestedTensor_any); nt_impl(m, "all", NestedTensor_all); nt_impl(m, "_log_softmax", NestedTensor__log_softmax); - nt_impl(m, "softmax.int", NestedTensor_softmax); nt_impl(m, "layer_norm", NestedTensor_layer_norm); nt_impl(m, "pin_memory", NestedTensor_pin_memory); nt_impl(m, "flatten.using_ints", NestedTensor_flatten); diff --git a/nestedtensor/csrc/masking.cpp b/nestedtensor/csrc/masking.cpp new file mode 100644 index 00000000..13ec62c3 --- /dev/null +++ b/nestedtensor/csrc/masking.cpp @@ -0,0 +1,675 @@ +#include +#include +#ifdef WITH_CUDA +#include +#include +#include +#endif + +using namespace torch::nested_tensor; +using namespace at; + +std::tuple merge_tensor_mask( + Tensor tensor, + Tensor mask, + c10::optional mask_dim) { + if (mask_dim && get_dim(mask) == (*mask_dim)) { + return std::make_tuple(tensor, mask); + } + + if (get_dim(mask) == 0) { + return std::make_tuple(tensor, mask); + } + + int64_t last_size = mask.size(-1); + Tensor collapsed_mask = mask.sum(-1); + Tensor is_last_size = (collapsed_mask == last_size); + Tensor is_zero = (collapsed_mask == 0); + int64_t is_last_size_sum = is_last_size.sum().item(); + int64_t is_zero_sum = is_zero.sum().item(); + if ((is_last_size_sum + is_zero_sum) == get_numel(collapsed_mask)) { + collapsed_mask = collapsed_mask.to(torch::kBool); + return merge_tensor_mask(tensor, collapsed_mask, mask_dim); + } + + if (mask_dim && mask_dim != get_dim(mask)) { + throw std::runtime_error( + "Mask dimension is too small to represent data tensor."); + } + // This is expected to be a no-op, except in rare cases. + tensor = tensor.contiguous(); + mask = mask.contiguous(); + return std::make_tuple(tensor, mask); +} + +Tensor pad_tensor_to_shape(Tensor t, const std::vector& goal_shape, double value = 0) { + std::vector padd; + auto tup = t.sizes(); + if (get_dim(t) != (int64_t)(goal_shape.size())) { + throw std::runtime_error("dimension doesn't match length of goal shape."); + } + for (int64_t i = tup.size() - 1; i >= 0; i--) { + padd.push_back(0); + padd.push_back(goal_shape[i] - tup[i]); + } + Tensor new_tensor = at::constant_pad_nd(t, IntArrayRef(padd), value); + new_tensor = new_tensor.reshape(IntArrayRef(goal_shape)); + return new_tensor; +} + +std::vector _get_max_size(const SizeNode& size_node) { + std::vector result; + if (size_node.is_leaf()) { + for (const auto& size : size_node.payload()) { + result.push_back(size); + } + return result; + } + if (size_node.degree() > 0) { + std::vector first_size = _get_max_size(size_node.children(0)); + for (const auto& size : first_size) { + result.push_back(size); + } + for (size_t i = 1; i < size_node.degree(); i++) { + std::vector ith_size = _get_max_size(size_node.children(i)); + for (size_t j = 0; j < ith_size.size(); j++) { + result[j] = result[j] > ith_size[j] ? result[j] : ith_size[j]; + } + } + } + return result; +} + +std::vector get_max_size_from_efficient_size(EfficientSizeNode esize) { + auto nt_opt_sizes = esize.opt_sizes(); + if (nt_opt_sizes.size() > 0 && *nt_opt_sizes[0] > 0) { + auto sizes = esize.sizes(); + int64_t* sizes_ptr = sizes.data_ptr(); + int64_t sizes_size_0 = sizes.size(0); + int64_t sizes_size_1 = sizes.size(1); + std::vector results(sizes_size_1, 0); + TORCH_CHECK(sizes_size_1 > 0, "Internal error: Expected sizes_size_1 to be greater than 0."); + for (int64_t i = 0; i < sizes_size_0; i++) { + for (int64_t j = 0; j < sizes_size_1; j++) { + int64_t val = sizes_ptr[i * sizes_size_1 + j]; + if (results[j] < val) { + results[j] = val; + } + } + } + return results; + } + return _get_max_size(esize.to_size_node()); +} + +std::vector get_max_size(const Tensor& nt) { + return get_max_size_from_efficient_size(get_efficient_nested_size(nt)); +} + + +Tensor batch_offsets_from_efficient_size(EfficientSizeNode ef) { + Tensor ef_sizes = ef.sizes(); + int64_t* nt_sizes_ptr = ef_sizes.data_ptr(); + Tensor offsets = torch::empty({1 + ef_sizes.size(0)}, torch::kInt64); + int64_t* offsets_ptr = offsets.data_ptr(); + offsets_ptr[0] = 0; + int64_t ef_sizes_size_1 = ef_sizes.size(1); + for (int64_t i = 0; i < ef_sizes.size(0); i++) { + int64_t prod = 1; + for (int64_t j = 0; j < ef_sizes_size_1; j++) { + prod = prod * nt_sizes_ptr[i * ef_sizes_size_1 + j]; + } + offsets_ptr[i + 1] = offsets_ptr[i] + prod; + } + return offsets; +} + +std::vector padded_size_from_efficient_size(EfficientSizeNode ef_size) { + Tensor nt_sizes = ef_size.sizes(); + auto max_size = get_max_size_from_efficient_size(ef_size); + std::vector new_size; + new_size.push_back(nt_sizes.size(0)); + for (int64_t i = 0; i < max_size.size(); i++) { + new_size.push_back(max_size[i]); + } + return new_size; +} + +std::tuple pad_nt(Tensor nt, std::vector shape) { + if (!is_nested_tensor_impl(nt)) { + if (get_numel(nt) == 0) { + TORCH_CHECK(false, "Empty tensors are not yet supported."); + } + // Dont pad in case of a scalar + if (get_dim(nt) == 0) { + return std::make_tuple(nt, torch::tensor(true)); + } + + Tensor tensor = pad_tensor_to_shape(nt, shape); + Tensor mask = pad_tensor_to_shape( + nt.new_full( + nt.sizes(), + true, + torch::kByte, + c10::nullopt, + c10::nullopt, + c10::nullopt), + shape); + return std::make_tuple(tensor, mask); + } + + std::vector res_tensor; + std::vector res_mask; + TensorNode structure = get_nested_tensor_structure(nt); + if (structure.degree() == 0) { + return std::make_tuple( + torch::tensor({0}), torch::tensor({false}, torch::kByte)); + } else { + for (auto child : structure.unbind()) { + Tensor tensor; + Tensor mask; + std::tie(tensor, mask) = + pad_nt(wrap_tensor_node(std::move(child)), shape); + res_tensor.push_back(tensor); + res_mask.push_back(mask); + } + } + + return std::make_tuple(at::stack(res_tensor), at::stack(res_mask)); +} + +c10::optional nt_from_tensor_mask( + Tensor tensor, + Tensor mask, + int64_t nested_dim) { + if (nested_dim == 0) { + if ((get_numel(mask) == 0) || (get_numel(mask) == 1 && mask.item())) { + return tensor; + } + + if (get_dim(mask) == 1) { + std::vector tensors; + for (int64_t i = 0; i < mask.size(0); i++) { + if (mask[i].item()) { + tensors.push_back(tensor[i]); + } + } + if (tensors.size() == 0) { + return torch::tensor({}).to(tensor); + } + return at::stack(tensors); + } + + if (get_dim(mask) > 1) { + std::vector tensors; + bool all_zero = true; + for (int64_t i = 0; i < mask.size(0); i++) { + Tensor tmp = *nt_from_tensor_mask(tensor[i], mask[i], nested_dim); + if (get_numel(tmp) > 0) { + all_zero = false; + tensors.push_back(tmp); + } + } + if (all_zero) { + for (int64_t i = 0; i < mask.size(0); i++) { + Tensor tmp = *nt_from_tensor_mask(tensor[i], mask[i], nested_dim); + tensors.push_back(tmp); + } + } + if (tensors.size() == 0) { + return torch::tensor({}).to(tensor); + } + return at::stack(tensors); + } + return c10::nullopt; + } + TORCH_CHECK(nested_dim == 1, "Only nested_dim of 1 is currently supported."); + std::vector> inner_tensors; + if ((get_numel(mask) == 0) || (get_numel(mask) == 1 && mask.item())) { + for (int64_t i = 0; i < tensor.size(0); i++) { + inner_tensors.push_back( + nt_from_tensor_mask(tensor[i], mask, nested_dim - 1)); + } + } else if (get_numel(mask) == 1 && !mask.item()) { + inner_tensors.push_back(c10::nullopt); + } else { + for (int64_t i = 0; i < tensor.size(0); i++) { + inner_tensors.push_back( + nt_from_tensor_mask(tensor[i], mask[i], nested_dim - 1)); + } + } + std::vector inner_tensor_nodes; + for (size_t i = 0; i < inner_tensors.size(); i++) { + if (inner_tensors[i]) { + TensorNode node = get_nested_tensor_structure(*inner_tensors[i]); + inner_tensor_nodes.push_back(node); + } + } + return wrap_tensor_node(TensorNode(std::move(inner_tensor_nodes))); +} + +std::tuple to_tensor_mask( + Tensor nt, + c10::optional mask_dim) { +#ifdef WITH_CUDA + if (get_dim(nt) == 3 && get_is_contiguous(nt) && mask_dim && *mask_dim == 2) { + auto nt_opt_size = get_opt_sizes(nt); + Tensor nt_buffer = get_buffer(nt); + if (nt_opt_size[2] && nt_buffer.is_cuda()) { + Tensor nt_sizes_ = + get_efficient_nested_size(nt).sizes().to(torch::kInt32); + TORCH_CHECK(nt_sizes_.dim() == 2, "NestedTensor metadata of unexpected dimension.") + Tensor nt_sizes = at::native::narrow(nt_sizes_, 1, 0, 1); + int max_size_1 = nt_sizes.max().item(); + nt_sizes = + at::cumsum(nt_sizes, 0).to(torch::kInt32).reshape({-1}); + nt_sizes = at::cat({torch::tensor({0}, torch::kInt32), nt_sizes}); + Tensor output = torch::zeros( + {*nt_opt_size[0], max_size_1, *nt_opt_size[2]}, nt_buffer.options()); + nt_sizes = nt_sizes.to(torch::kCUDA); + Tensor output_mask = torch::zeros( + {*nt_opt_size[0], max_size_1}, nt_buffer.options()); + output_mask = output_mask.to(torch::kInt32); + at::cuda::CUDAStream defaultStream = at::cuda::getDefaultCUDAStream(); + if (nt.dtype() == torch::kFloat16) { + nt_buffer = nt_buffer.to(torch::kFloat); + output = output.to(torch::kFloat); + } + if (nt_buffer.dtype() == torch::kFloat) { + nested_tensor::cuda::add_padding_mask_kernelLauncher( + nt_buffer.data_ptr(), + output.data_ptr(), + output_mask.data_ptr(), + nt_sizes.data_ptr(), + *nt_opt_size[0], + output_mask.stride(0), + output.stride(0), + *nt_opt_size[2], + defaultStream); + } + if (nt.dtype() == torch::kFloat16) { + output = output.to(torch::kFloat16); + } + return std::make_tuple(output, output_mask.to(torch::kBool)); + } + } +#endif + TORCH_CHECK( + !mask_dim || *mask_dim <= get_dim(nt), + "Requested mask dimension ", + *mask_dim, + " is bigger than dimension ", + get_dim(nt), + " of given NestedTensor."); + + auto opt_sizes = get_opt_sizes(nt); + if (opt_sizes.size() == 1 && *opt_sizes[0] == 1) { + nt = NestedTensor_contiguous(nt); + Tensor nt_buffer = get_buffer(nt); + nt_buffer = nt_buffer.reshape({-1}); + Tensor result_mask = !mask_dim || *mask_dim == 0 ? torch::tensor(true) + : torch::tensor({true}); + return std::make_tuple(nt_buffer, result_mask); + } + + auto max_size = get_max_size(nt); + at::Tensor res_tensor; + at::Tensor res_mask; + std::tie(res_tensor, res_mask) = pad_nt(nt, max_size); + return merge_tensor_mask(res_tensor, res_mask, mask_dim); +} + +Tensor merge_mask( + Tensor mask, + c10::optional mask_dim) { + if (mask_dim && get_dim(mask) == (*mask_dim)) { + return mask; + } + + if (get_dim(mask) == 0) { + return mask; + } + + int64_t last_size = mask.size(-1); + Tensor collapsed_mask = mask.sum(-1); + Tensor is_last_size = (collapsed_mask == last_size); + Tensor is_zero = (collapsed_mask == 0); + int64_t is_last_size_sum = is_last_size.sum().item(); + int64_t is_zero_sum = is_zero.sum().item(); + if ((is_last_size_sum + is_zero_sum) == get_numel(collapsed_mask)) { + collapsed_mask = collapsed_mask.to(torch::kBool); + return merge_mask(collapsed_mask, mask_dim); + } + + if (mask_dim && mask_dim != get_dim(mask)) { + throw std::runtime_error( + "Mask dimension is too small to represent data tensor."); + } + // This is expected to be a no-op, except in rare cases. + mask = mask.contiguous(); + return mask; +} + +Tensor _create_nt_mask(std::vector sizes, std::vector shape) { + int64_t numel = 1; + for (size_t i = 0; i < sizes.size(); i++) { + numel = numel * sizes[i]; + } + TORCH_CHECK(numel > 0, "Empty tensors are not yet supported."); + // Dont pad in case of a scalar + if (sizes.size() == 0) { + return torch::tensor(true); + } + auto options = torch::TensorOptions().dtype(torch::kByte); + Tensor mask = pad_tensor_to_shape( + torch::full( + IntArrayRef(sizes), + true, + options), + shape); + return mask; +} + +Tensor _create_nt_mask(SizeNode nt_size, std::vector shape) { + if (nt_size.degree() == 0) { + return _create_nt_mask(nt_size.payload(), shape); + } + + std::vector res_mask; + if (nt_size.degree() == 0) { + return torch::tensor({false}, torch::kByte); + } else { + for (auto child : nt_size.unbind()) { + Tensor mask = _create_nt_mask(child, shape); + res_mask.push_back(mask); + } + } + + return at::stack(res_mask); +} + +Tensor _create_nt_mask(EfficientSizeNode nt_size, std::vector shape) { + if (nt_size.height() == 1) { + std::vector tmp_masks; + auto esizes = nt_size.sizes(); + int64_t* esizes_ptr = esizes.data_ptr(); + for(int64_t i = 0; i < esizes.size(0); i++) { + std::vector tmp_sizes; + for(size_t j = 0; j < shape.size(); j++) { + tmp_sizes.push_back(esizes_ptr[i * esizes.stride(0) + j]); + } + tmp_masks.push_back(_create_nt_mask(tmp_sizes, shape)); + } + return at::stack(tmp_masks); + } + return _create_nt_mask(nt_size.to_size_node(), shape); +} + +Tensor to_mask( + Tensor nt, + c10::optional mask_dim) { + TORCH_CHECK( + !mask_dim || *mask_dim <= get_dim(nt), + "Requested mask dimension ", + *mask_dim, + " is bigger than dimension ", + get_dim(nt), + " of given NestedTensor."); + + + auto opt_sizes = get_opt_sizes(nt); + if (opt_sizes.size() == 1 && *opt_sizes[0] == 1) { + Tensor result_mask = !mask_dim || *mask_dim == 0 ? torch::tensor(true) + : torch::tensor({true}); + return result_mask; + } + + std::vector max_size; + if (get_nested_dim(nt) == 1 && + get_dim(nt) > 1 && + mask_dim && + *mask_dim > 1) { + auto tmp_max_size = get_max_size(nt); + for (int64_t i = 1; i < *mask_dim; i++) { + max_size.push_back(tmp_max_size[i - 1]); + } + if (*mask_dim == 2 && get_dim(nt) == 3) { + auto nt_size = get_efficient_nested_size(nt); + auto esizes = nt_size.sizes(); + auto options = torch::TensorOptions().dtype(torch::kByte); + auto result = torch::zeros({*opt_sizes[0], tmp_max_size[0]}, + options); + uint8_t* result_data = result.data_ptr(); + int64_t* esizes_ptr = esizes.data_ptr(); + for (int64_t i = 0; i < esizes.size(0); i++) { + int64_t length = esizes_ptr[i * esizes.size(1)]; + for (int64_t j = 0; j < length; j++) { + result_data[i * result.size(1) + j] = 1; + } + } + return result; + } + return _create_nt_mask(get_efficient_nested_size(nt), max_size); + } + max_size = get_max_size(nt); + at::Tensor res_mask = _create_nt_mask(get_efficient_nested_size(nt), max_size); + return merge_mask(res_mask, mask_dim); +} + +Tensor from_padded_tensor(Tensor padded, EfficientSizeNode target_size) { + TORCH_CHECK(padded.dim() == target_size.dim(), + "Target size has different dimension as input padded Tensor."); +#ifdef WITH_CUDA + if (padded.dim() > 1 && padded.dim() < 5 && + get_is_contiguous(padded) && padded.is_cuda()) { + Tensor target_offsets = batch_offsets_from_efficient_size(target_size); + std::vector padded_sizes = padded.sizes().vec(); + Tensor padded_sizes_tensor = torch::tensor(padded_sizes); + Tensor output = torch::empty({target_size.numel()}, padded.options()); + Tensor target_size_sizes = target_size.sizes(); + + at::Tensor metadata = at::cat({target_size_sizes.reshape(-1), padded_sizes_tensor, target_offsets}); + metadata = metadata.to(at::Device(kCUDA), torch::kInt32, true, true); + + std::vector split_sizes; + split_sizes.push_back(target_size_sizes.numel()); + split_sizes.push_back(padded_sizes_tensor.numel()); + split_sizes.push_back(target_offsets.numel()); + + std::vector split = at::split_with_sizes(metadata, IntArrayRef(split_sizes), 0); + + target_size_sizes = split[0]; + padded_sizes_tensor = split[1]; + target_offsets = split[2]; + + at::cuda::CUDAStream defaultStream = at::cuda::getDefaultCUDAStream(); + if (padded.dtype() == torch::kFloat16) { + nested_tensor::cuda::remove_padding_kernelLauncher( + padded.data_ptr(), + output.data_ptr(), + target_offsets.data_ptr(), + padded_sizes_tensor.data_ptr(), + target_size_sizes.data_ptr(), + padded.dim() - 1, + padded.size(0), + defaultStream); + } + if (padded.dtype() == torch::kFloat) { + nested_tensor::cuda::remove_padding_kernelLauncher( + padded.data_ptr(), + output.data_ptr(), + target_offsets.data_ptr(), + padded_sizes_tensor.data_ptr(), + target_size_sizes.data_ptr(), + padded.dim() - 1, + padded.size(0), + defaultStream); + } + return wrap_buffer(std::move(output), target_size); + } +#endif + at::Tensor target_size_tensor = std::get<0>(at::max(target_size.sizes(), 0)); + std::vector target_size_vec(target_size_tensor.data_ptr(), + target_size_tensor.data_ptr() + target_size_tensor.numel()); + std::vector masks; + std::vector all_sizes = target_size.sizes().unbind(); + for (int64_t i = 0; i < all_sizes.size(); i++) { + std::vector sizes_i( + all_sizes[i].data_ptr(), + all_sizes[i].data_ptr() + all_sizes[i].numel()); + at::Tensor mask_i = padded.new_full( + IntArrayRef(sizes_i), + true, + torch::kByte, + c10::nullopt, + c10::nullopt, + c10::nullopt); + mask_i = pad_tensor_to_shape(mask_i, target_size_vec); + masks.push_back(mask_i); + } + at::Tensor final_mask = at::stack(masks); + at::Tensor new_buffer = padded.masked_select(final_mask); + return wrap_buffer(std::move(new_buffer), target_size); +} + +Tensor _collapse_two_dims_3(Tensor input, int64_t dim1, int64_t dim2) { + TORCH_CHECK(dim1 > 0, "dim1: Cannot collapse dim 0."); + TORCH_CHECK(dim2 > 0, "dim2: Cannot collapse dim 0."); + TORCH_CHECK(dim2 - 1 == dim1, "dim2 must be one more than dim1.") + TORCH_CHECK(dim1 == 1, "dim1 must be 1.") + TORCH_CHECK(get_dim(input) == 3, "Expected input to be 3 dim."); + auto input_esizes = get_efficient_nested_size(input); + Tensor nt_sizes = input_esizes.sizes(); + + Tensor sizes_dim1 = at::native::narrow(nt_sizes, 1, 0, 1); + Tensor sizes_dim2 = at::native::narrow(nt_sizes, 1, 1, 1); + + Tensor new_nt_sizes; + if (dim1 == 1) { + Tensor collapsed_sizes = sizes_dim1 * sizes_dim2; + new_nt_sizes = collapsed_sizes.contiguous(); + } + auto new_esizes = torch::nested_tensor::EfficientSizeNode(input_esizes.structure(), new_nt_sizes); + Tensor result = wrap_buffer(get_buffer(input), new_esizes); + TORCH_CHECK(get_dim(result) == 2, "Expected result to be 2 dimensional."); + return result; +} + +Tensor to_padded_tensor(Tensor nt, double padding) { +#ifdef WITH_CUDA + if ((get_dim(nt) >= 2 && get_dim(nt) <= 4)) { + nt = NestedTensor_contiguous(nt, c10::MemoryFormat::Contiguous); + auto nt_opt_size = get_opt_sizes(nt); + auto orig_nt_dim = get_dim(nt); + Tensor nt_buffer = get_buffer(nt); + if (nt_buffer.is_cuda()) { + if (get_dim(nt) == 3 && nt_opt_size[2]) { + nt = _collapse_two_dims_3(nt, 1, 2); + } + auto esize = get_efficient_nested_size(nt); + at::Tensor nt_sizes = esize.sizes(); + Tensor offsets = batch_offsets_from_efficient_size(esize); + std::vector new_size = padded_size_from_efficient_size(esize); + at::cuda::CUDAStream defaultStream = at::cuda::getDefaultCUDAStream(); + Tensor output = at::empty(IntArrayRef(new_size), nt_buffer.options()); + + int64_t input_dim = nt_sizes.size(1); + int64_t batch_size = nt_sizes.size(0); + at::Tensor metadata = at::cat({offsets, nt_sizes.reshape(-1)}); + metadata = metadata.to(at::Device(kCUDA), torch::kInt32, true, true); + + std::vector split_sizes; + split_sizes.push_back(offsets.numel()); + split_sizes.push_back(nt_sizes.numel()); + + std::vector split = at::split_with_sizes(metadata, IntArrayRef(split_sizes), 0); + + offsets = split[0]; + nt_sizes = split[1]; + + if (nt_buffer.dtype() == torch::kFloat16) { + nested_tensor::cuda::add_padding_kernelLauncher( + nt_buffer.data_ptr(), + output.data_ptr(), + (c10::Half)(padding), + offsets.data_ptr(), + nt_sizes.data_ptr(), + input_dim, + new_size, + batch_size, + defaultStream); + if (orig_nt_dim == 3 && nt_opt_size[2]) { + output = output.reshape({output.size(0), -1, *nt_opt_size[2]}); + } + return output; + } + if (nt_buffer.dtype() == torch::kFloat) { + nested_tensor::cuda::add_padding_kernelLauncher( + nt_buffer.data_ptr(), + output.data_ptr(), + (float)(padding), + offsets.data_ptr(), + nt_sizes.data_ptr(), + input_dim, + new_size, + batch_size, + defaultStream); + if (orig_nt_dim == 3 && nt_opt_size[2]) { + output = output.reshape({output.size(0), -1, *nt_opt_size[2]}); + } + return output; + } + return output; + TORCH_CHECK(false, "Input datatype ", nt_buffer.dtype(), " is not supported."); + } + } +#endif + auto opt_sizes = get_opt_sizes(nt); + if (opt_sizes.size() == 1 && *opt_sizes[0] == 1) { + nt = NestedTensor_contiguous(nt); + return get_buffer(nt); + } + auto max_size = get_max_size(nt); + TensorNode structure = get_nested_tensor_structure(nt); + if (structure.degree() == 0) { + return torch::tensor({padding}); + } + std::vector res_tensor; + for (auto child : structure.unbind()) { + at::Tensor tensor = child.payload(); + if (get_numel(tensor) == 0) { + TORCH_CHECK(false, "Empty tensors are not yet supported."); + } + // Dont pad in case of a scalar + if (get_dim(tensor) == 0) { + res_tensor.push_back(tensor); + } + res_tensor.push_back(pad_tensor_to_shape(tensor, max_size, padding)); + } + return at::stack(res_tensor); +} + +TORCH_LIBRARY_FRAGMENT(nestedtensor, m) { + m.def( + "merge_tensor_mask(Tensor tensor, Tensor mask, int? mask_dim=None) -> (Tensor, Tensor)"); + m.impl("merge_tensor_mask", TORCH_FN(merge_tensor_mask)); + + m.def("pad_nt(Tensor nt, int[] shape) -> (Tensor, Tensor)"); + m.impl("pad_nt", NestedTensorKey, TORCH_FN(pad_nt)); + + m.def( + "nt_from_tensor_mask(Tensor tensor, Tensor mask, int nested_dim) -> Tensor?"); + m.impl("nt_from_tensor_mask", TORCH_FN(nt_from_tensor_mask)); + + m.def("get_max_size(Tensor nt) -> int[]"); + m.impl("get_max_size", NestedTensorKey, TORCH_FN(get_max_size)); + + m.def("to_tensor_mask(Tensor nt, int? mask_dim) -> (Tensor, Tensor)"); + m.impl("to_tensor_mask", NestedTensorKey, to_tensor_mask); + + m.def("to_mask(Tensor nt, int? mask_dim) -> Tensor"); + m.impl("to_mask", NestedTensorKey, to_mask); + + m.def("to_padded_tensor(Tensor nt, float padding) -> Tensor"); + m.impl("to_padded_tensor", NestedTensorKey, to_padded_tensor); +} diff --git a/nestedtensor/csrc/masking.h b/nestedtensor/csrc/masking.h new file mode 100644 index 00000000..e851b393 --- /dev/null +++ b/nestedtensor/csrc/masking.h @@ -0,0 +1,36 @@ +#pragma once +#include +#include +#include +#include +#include +#include +#include +#include +#include + +std::tuple to_tensor_mask( + at::Tensor nt, + c10::optional mask_dim); + +at::Tensor to_mask( + at::Tensor nt, + c10::optional mask_dim); + +at::Tensor to_padded_tensor( + at::Tensor nt, + double padding); + +at::Tensor from_padded_tensor( + at::Tensor nt, + torch::nested_tensor::EfficientSizeNode target_size, + torch::nested_tensor::EfficientSizeNode target_stride); + +at::Tensor from_padded_tensor( + at::Tensor nt, + torch::nested_tensor::EfficientSizeNode target_size); + +c10::optional nt_from_tensor_mask( + at::Tensor tensor, + at::Tensor mask, + int64_t nested_dim); diff --git a/nestedtensor/csrc/matmul.cpp b/nestedtensor/csrc/matmul.cpp index 9b572f23..ed1ada9a 100644 --- a/nestedtensor/csrc/matmul.cpp +++ b/nestedtensor/csrc/matmul.cpp @@ -7,258 +7,49 @@ using namespace torch::nn; namespace F = torch::nn::functional; namespace at { -struct NestedTensorFunction_matmul - : torch::autograd::Function { - static Tensor forward( - torch::autograd::AutogradContext* ctx, - const Tensor& self, - const Tensor& other) { - ctx->save_for_backward({self, other}); - auto impl_self = get_nested_tensor_impl(self); - auto structure_self = get_nested_tensor_structure(self); - if (is_nested_tensor_impl(other)) { - auto impl_other = get_nested_tensor_impl(other); - auto structure_other = get_nested_tensor_structure(other); - if (structure_self.buffer() && structure_other.buffer() && - self.dim() == 4 && other.dim() == 4 && impl_self->opt_sizes()[0] && - impl_other->opt_sizes()[0] && impl_self->opt_sizes()[1] && - impl_other->opt_sizes()[1] && impl_self->opt_sizes()[3] && - impl_other->opt_sizes()[2] && - (*impl_self->opt_sizes()[0] == *impl_other->opt_sizes()[0]) && - (*impl_self->opt_sizes()[1] == *impl_other->opt_sizes()[1]) && - (*impl_self->opt_sizes()[3] == *impl_other->opt_sizes()[2])) { -#ifdef TRACEPACKED - std::cout << "calling packed NT x NT matmul" << std::endl; -#endif - SizeNode new_nested_size = map( - [&](c10::List self_size, c10::List other_size) { - c10::List new_size{ - self_size[0], self_size[1], other_size[2]}; - return std::move(new_size); - }, - impl_self->nested_size(), - impl_other->nested_size()); - auto fn = [](c10::List leaf, int64_t input) { - return input + leaf[0] * leaf[1] * leaf[2]; - }; - int64_t new_numel = reduce>( - new_nested_size, fn, 0); - Tensor new_buffer = at::empty({new_numel}, self.options()); - Tensor result = - wrap_tensor_node(torch::nested_tensor::impl::build_structure( - std::move(new_buffer), new_nested_size)); - apply_nested_tensor( - [](at::Tensor& result, at::Tensor self, at::Tensor other) { - at::matmul_out(result, self, other); - }, - result, - self, - other); - return result; - } - return map_nested_tensor( - [](Tensor s, Tensor o) { return at::matmul(s, o); }, self, other); - } - if (structure_self.buffer()) { - if (self.dim() == 3 && other.dim() == 2 && impl_self->opt_sizes()[0] && - impl_self->opt_sizes()[2] && - impl_self->opt_sizes()[self.dim() - 1] == - other.size(self.dim() - 2)) { -#ifdef TRACEPACKED - std::cout << "calling packed NT x T matmul" << std::endl; -#endif - SizeNode new_nested_size = map( - [&](c10::List self_size) { - c10::List new_size{self_size[0], other.size(1)}; - return std::move(new_size); - }, - impl_self->nested_size()); - return wrap_tensor_node(torch::nested_tensor::impl::build_structure( - at::matmul( - (*structure_self.buffer()).reshape({-1, other.size(0)}), other) - .reshape(-1), - new_nested_size)); - } - } - return map_nested_tensor( - [&other](Tensor tensor) { return at::matmul(tensor, other); }, self); - } - static torch::autograd::variable_list backward( - torch::autograd::AutogradContext* ctx, - // TODO: To prevent double backward (for now) check that grad_output - // doesn't require gradients. - torch::autograd::variable_list grad_output) { - TORCH_CHECK( - grad_output.size() == 1, "Expected grad_output of size 1 for addmm."); - auto grad = grad_output[0]; - TORCH_CHECK( - !grad.requires_grad(), "addmm does not support double backward."); - auto saved_data = ctx->get_saved_variables(); - auto self = saved_data[0]; - auto other = saved_data[1]; - TORCH_CHECK(self.dim() >= 3, "NT self must be at least 3-dim."); - TORCH_CHECK(is_nested_tensor_impl(self), "self must be NestedTensor"); - if (!is_nested_tensor_impl(other)) { - TORCH_CHECK(other.dim() >= 2, "T other must be at least 2-dim."); - // auto grad_other_nt = - // at::matmul(self.transpose(self.dim() - 2, self.dim() - 1), grad); - // TODO: Implement sum over nested dimensions - auto grad_other = torch::zeros_like(other); - // apply_nested_tensor( - // [&grad_other](at::Tensor& t) { grad_other.add_(t); - // }, - // grad_other_nt); - apply_nested_tensor( - [&grad_other](at::Tensor& s, at::Tensor& g) { - grad_other.add_( - at::matmul(s.transpose(s.dim() - 2, s.dim() - 1), g)); - }, - self, - grad); - auto grad_self = at::matmul(grad, other.transpose(0, 1)); - return {grad_self, grad_other}; - } - TORCH_CHECK(other.dim() >= 3, "NT other must be at least 3-dim."); - return {at::matmul(grad, other.transpose(other.dim() - 2, other.dim() - 1)), - at::matmul(self.transpose(self.dim() - 2, self.dim() - 1), grad)}; - } -}; Tensor NestedTensor_matmul(const Tensor& self, const Tensor& other) { -#ifdef USEPACKED - return NestedTensorFunction_matmul::apply(self, other); -#else - return autograd_map_nested_tensor( - [](at::Tensor self, at::Tensor other) { return at::matmul(self, other); }, - self, - other); -#endif -} - -Tensor& NestedTensor_matmul_out( - Tensor& result, - const Tensor& self, - const Tensor& other) { - apply_nested_tensor( - [](Tensor& result, Tensor& tensor, Tensor& other) { - at::matmul_out(result, tensor, other); - }, - result, - self, - other); - return result; -} - -at::Tensor mm_mat1_backward( - at::Tensor grad, - at::Tensor other, - c10::Scalar alpha) { - return maybe_multiply(at::matmul(grad, other.transpose(0, 1)), alpha); -} - -// TODO: Technically this has the wrong semantics and shouldn't accept NTs of -// 3dim, but there's not addmatml -struct NestedTensorFunction_addmm - : torch::autograd::Function { - static Tensor forward( - torch::autograd::AutogradContext* ctx, - const Tensor& input, - const Tensor& self, - const Tensor& other, - c10::Scalar alpha, - c10::Scalar beta) { - TORCH_CHECK(!is_nested_tensor_impl(input), "input must be Tensor"); - TORCH_CHECK(is_nested_tensor_impl(self), "self must be NestedTensor"); - TORCH_CHECK(!is_nested_tensor_impl(other), "other must be Tensor"); - // TORCH_CHECK(alpha == 1, "alpha must be 1."); - // TORCH_CHECK(beta == 1, "beta must be 1."); - auto impl_self = get_nested_tensor_impl(self); - auto structure_self = get_nested_tensor_structure(self); - ctx->save_for_backward({input, self, other}); - ctx->saved_data["3"] = alpha; - ctx->saved_data["4"] = beta; - if (structure_self.buffer()) { - if (self.dim() == 3 && other.dim() == 2 && impl_self->opt_sizes()[0] && - impl_self->opt_sizes()[2] && - impl_self->opt_sizes()[self.dim() - 1] == - other.size(self.dim() - 2)) { -#ifdef TRACEPACKED - std::cout << "calling packed T x NT x T addmm" << std::endl; -#endif - SizeNode new_nested_size = map( - [&](c10::List self_size) { - c10::List new_size{self_size[0], other.size(1)}; - return std::move(new_size); - }, - impl_self->nested_size()); - return wrap_tensor_node(torch::nested_tensor::impl::build_structure( - at::addmm( - input, - (*structure_self.buffer()).reshape({-1, other.size(0)}), - other, - alpha, - beta) - .reshape(-1), - new_nested_size)); + if (is_nested_tensor_impl(self) && !is_nested_tensor_impl(other)) { + if (get_is_contiguous(self)) { + if (get_dim(self) == 3 && get_dim(other) == 2) { + auto self_opt_sizes = get_opt_sizes(self); + if (self_opt_sizes[2]) { + if (*self_opt_sizes[2] == other.size(0)) { + Tensor self_buffer = get_buffer(self); + Tensor result_buffer = + at::matmul(self_buffer.reshape({-1, other.size(0)}), other); + result_buffer = result_buffer.reshape({-1}); + int64_t other_size_1 = other.size(1); + EfficientSizeNode new_nested_size = + get_efficient_nested_size(self).clone(); + EfficientSizeNode new_nested_stride = + get_efficient_nested_stride(self).clone(); + apply_efficient_size( + [other_size_1]( + int64_t* size_ptr, + int64_t size_size, + int64_t* stride_ptr, + int64_t stride_size) { + size_ptr[1] = other_size_1; + stride_ptr[1] = 1; + stride_ptr[0] = other_size_1; + }, + new_nested_size, + new_nested_stride); + return wrap_buffer( + std::move(result_buffer), new_nested_size, new_nested_stride); + } + } } } - return map_nested_tensor( - [&](Tensor tensor) { - return at::addmm(input, tensor, other, alpha, beta); - }, - self); - } - static torch::autograd::variable_list backward( - torch::autograd::AutogradContext* ctx, - // TODO: To prevent double backward (for now) check that grad_output - // doesn't require gradients. - torch::autograd::variable_list grad_output) { - TORCH_CHECK( - grad_output.size() == 1, "Expected grad_output of size 1 for addmm."); - auto grad = grad_output[0]; - TORCH_CHECK( - !grad.requires_grad(), "addmm does not support double backward."); - auto saved_data = ctx->get_saved_variables(); - auto input = saved_data[0]; - auto self = saved_data[1]; - auto other = saved_data[2]; - auto alpha = ctx->saved_data["3"].toScalar(); - auto beta = ctx->saved_data["4"].toScalar(); - auto grad_other_nt = at::mul(at::matmul(self.transpose(1, 2), grad), alpha); - auto grad_other = torch::zeros_like(other); - apply_nested_tensor( - [&grad_other](at::Tensor& t) { grad_other.add_(t); }, grad_other_nt); - at::Tensor undef; - return {at::mul(input, beta), - mm_mat1_backward(grad, other, alpha), - grad_other, - undef, - undef}; } -}; - -Tensor NestedTensor_addmm( - const Tensor& input, - const Tensor& self, - const Tensor& other, - c10::Scalar alpha, - c10::Scalar beta) { -#ifdef USEPACKED - return NestedTensorFunction_addmm::apply(input, self, other, alpha, beta); -#else - return autograd_map_nested_tensor( - [&alpha, &beta](at::Tensor input, at::Tensor self, at::Tensor other) { - return at::addmm(input, self, other, alpha, beta); - }, - input, + return map_nested_tensor( + [](at::Tensor self, at::Tensor other) { return at::matmul(self, other); }, self, other); -#endif } -TORCH_LIBRARY_IMPL(aten, AutogradPrivateUse1, m) { - nt_impl(m, "addmm", NestedTensor_addmm); +TORCH_LIBRARY_IMPL(aten, NestedTensor, m) { nt_impl(m, "matmul", NestedTensor_matmul); - nt_impl(m, "matmul.out", NestedTensor_matmul_out); } } // namespace at diff --git a/nestedtensor/csrc/mha.cpp b/nestedtensor/csrc/mha.cpp index 5aee0afb..9275244d 100644 --- a/nestedtensor/csrc/mha.cpp +++ b/nestedtensor/csrc/mha.cpp @@ -28,42 +28,50 @@ at::Tensor min_mha( double scaling, at::Tensor out_proj_weight, at::Tensor out_proj_bias) { - TORCH_CHECK(query.dim() == 3, "query needs to be 3 dim."); - TORCH_CHECK(key.dim() == 3, "key needs to be 3 dim."); - TORCH_CHECK(value.dim() == 3, "value needs to be 3 dim."); + TORCH_CHECK(get_dim(query) == 3, "query needs to be 3 dim."); + TORCH_CHECK(get_dim(key) == 3, "key needs to be 3 dim."); + TORCH_CHECK(get_dim(value) == 3, "value needs to be 3 dim."); TORCH_CHECK(in_proj_bias, "Input projection bias needs to be defined."); - int64_t edim = query.size(2); + auto opt_sizes = get_opt_sizes(query); + if (!opt_sizes[2]) { + throw std::runtime_error("query's third dimension must be regular."); + } + int64_t edim = *(opt_sizes[2]); at::Tensor q, k, v; - q = at::addmm( - at::slice(*in_proj_bias, 0, 0, edim), + q = at::matmul( query, - at::slice(in_proj_weight, 0, 0, edim).t(), - scaling, - scaling); - k = at::addmm( - at::slice(*in_proj_bias, 0, edim, 2 * edim), + at::slice(in_proj_weight, 0, 0, edim).t().contiguous()); + k = at::matmul( key, - at::slice(in_proj_weight, 0, edim, 2 * edim).t()); - v = at::addmm( - at::slice(*in_proj_bias, 0, 2 * edim), + at::slice(in_proj_weight, 0, edim, 2 * edim).t().contiguous()); + v = at::matmul( value, - at::slice(in_proj_weight, 0, 2 * edim).t()); + at::slice(in_proj_weight, 0, 2 * edim).t().contiguous()); - q = q.reshape({-1, -1, num_heads, head_dim}).transpose(1, 2); - k = k.reshape({-1, -1, num_heads, head_dim}).transpose(1, 2); - v = v.reshape({-1, -1, num_heads, head_dim}).transpose(1, 2); + q = q + at::slice(*in_proj_bias, 0, 0, edim).contiguous(); + k = k + at::slice(*in_proj_bias, 0, edim, 2 * edim).contiguous(); + v = v + at::slice(*in_proj_bias, 0, 2 * edim).contiguous(); + + q = q * torch::tensor(scaling); + + q = q.reshape({*opt_sizes[0], -1, num_heads, head_dim}).transpose(1, 2); + k = k.reshape({*opt_sizes[0], -1, num_heads, head_dim}).transpose(1, 2); + v = v.reshape({*opt_sizes[0], -1, num_heads, head_dim}).transpose(1, 2); auto attn_output_weights = at::matmul(q, k.transpose(2, 3)); attn_output_weights = at::softmax(attn_output_weights, -1); attn_output_weights = at::dropout(attn_output_weights, dropout_p, training); auto attn_output = at::matmul(attn_output_weights, v); - attn_output = attn_output.transpose(1, 2).reshape({-1, -1, edim}); - attn_output = at::addmm(out_proj_bias, attn_output, out_proj_weight.t()); + attn_output = attn_output.transpose(1, 2).reshape({*opt_sizes[0], -1, edim}); + attn_output = at::matmul(attn_output, out_proj_weight.t()); + attn_output = attn_output + out_proj_bias; return attn_output; } -static auto registry = - torch::RegisterOperators().op("nestedtensor::min_mha", &min_mha); +TORCH_LIBRARY_FRAGMENT(nestedtensor, m) { + m.def("min_mha(int num_heads, int head_dim, float dropout_p, bool training, Tensor query, Tensor key, Tensor value, Tensor in_proje_weight, Tensor? in_proj_bias, float scaling, Tensor out_proj_weight, Tensor out_proj_bias) -> Tensor", &min_mha); + m.impl("min_mha", NestedTensorKey, &min_mha); +} } // namespace nested_tensor } // namespace torch diff --git a/nestedtensor/csrc/nested_tensor_impl.cpp b/nestedtensor/csrc/nested_tensor_impl.cpp index 39e82be8..5bbcef11 100644 --- a/nestedtensor/csrc/nested_tensor_impl.cpp +++ b/nestedtensor/csrc/nested_tensor_impl.cpp @@ -6,97 +6,14 @@ #include #include #include +#include +#include namespace at { using namespace torch::nested_tensor; using namespace c10; -int64_t num_memory(c10::List size, c10::List stride) { - // 0-dim Tensors have torch.Size of .size() 0, but carry 1 memory. - // Empty 1-dim Tensors (torch.tensor([])) have torch.Size of .size() 1, - // but carry 0 memory. - if (size.size() == 0) { - return 1; - } - return size[0] * stride[0]; -} - -std::vector> construct_size(const SizeNode& size_node) { - if (size_node.is_leaf()) { - std::vector> result; - for (const auto& size : size_node.payload()) { - result.push_back(size); - } - return result; - } - std::vector> result; - result.push_back(size_node.degree()); - - if (size_node.degree() > 0) { - for (const auto& size : construct_size(size_node.children(0))) { - result.push_back(size); - } - for (size_t i = 1; i < size_node.degree(); i++) { - auto size_node_i = construct_size(size_node.children(i)); - for (size_t j = 1; j < result.size(); j++) { - if (result[j] && ((*result[j]) != size_node_i[j - 1])) { - result[j] = c10::nullopt; - } - } - } - } - - return result; -} - -c10::intrusive_ptr NestedTensorImpl::shallow_copy_and_detach( - const c10::VariableVersion& version_counter, - bool allow_tensor_metadata_change) const { - auto impl = c10::make_intrusive(_structure); - copy_tensor_metadata( - /*src_impl=*/this, - /*dest_impl=*/impl.get(), - /*version_counter=*/version_counter, - /*allow_tensor_metadata_change=*/allow_tensor_metadata_change); - return impl; -} - -void NestedTensorImpl::shallow_copy_from( - const c10::intrusive_ptr& impl) { - NestedTensorImpl* nested_impl = dynamic_cast(impl.get()); - copy_tensor_metadata( - /*src_impl=*/nested_impl, - /*dest_impl=*/this, - /*version_counter=*/version_counter(), - /*allow_tensor_metadata_change=*/allow_tensor_metadata_change()); - nested_impl->_structure = _structure; -} - -std::vector> NestedTensorImpl::opt_sizes() const { - return construct_size( - map([](at::Tensor tensor) { return c10::List(tensor.sizes()); }, - get_structure())); -} - -c10::List _cont_stride(c10::List size) { - std::vector stride(size.size()); - int64_t p = 1; - size_t p_i = size.size(); - for (size_t i = 0; i < size.size(); i++) { - p_i--; - stride[p_i] = p; - p *= size[p_i]; - } - return c10::List(stride); -} - -SizeNode infer_nested_size(const TensorNode& _structure) { - return map( - [](at::Tensor tensor) { return c10::List(tensor.sizes()); }, - _structure); -} - TensorNode _unbind_tensors(TensorNode structure) { std::vector result_nodes; if (structure.is_leaf()) { @@ -111,45 +28,62 @@ TensorNode _unbind_tensors(TensorNode structure) { return TensorNode(std::move(result_nodes)); } -NestedTensorImpl::NestedTensorImpl(TensorNode structure) +NestedTensorImpl::NestedTensorImpl(at::Tensor&& buffer, + EfficientSizeNode nested_size, + EfficientSizeNode nested_stride) : TensorImpl( - c10::DispatchKeySet({NestedTensorKey_PreAutograd, NestedTensorKey}), - get_first_leaf(structure) ? get_first_leaf(structure)->dtype() - : at::ones({}).dtype(), - get_first_leaf(structure) ? get_first_leaf(structure)->device() - : at::ones({}).device()), - _structure(structure), - _first_variable( - get_first_leaf(_structure) ? *get_first_leaf(_structure) - : at::ones({})), - _nested_size(map( - [](at::Tensor tensor) { return c10::List(tensor.sizes()); }, - _structure)) { - TORCH_CHECK( - !_structure.is_leaf(), - "NestedTensorImpl must be given structure of at least height 1.") - for (auto opt_int : construct_size(_nested_size)) { - if (opt_int) { - _sizes.push_back(*opt_int); - } else { - // TODO: Should we prefer this over opt_sizes? - // TODO: Using -1 here is of of a similar thought as using -1 in reshape - // as a placeholder. Unfortunatly using -1 here interacts very badly with - // the rest of the functions that consume size. - _sizes.push_back(0); - } - } + c10::DispatchKeySet({NestedTensorKey}), + buffer.dtype(), + buffer.device()), + _buffer(buffer), + _nested_size(nested_size), + _nested_stride(nested_stride), + _is_pinned(_buffer.is_pinned()), + _is_contiguous(torch::nested_tensor::impl::storage_is_contiguous( + _buffer, + _nested_size, + _nested_stride)), + _is_contiguous_channels_last(torch::nested_tensor::impl::storage_is_contiguous_channels_last( + _buffer, + _nested_size, + _nested_stride)) { + remove_autograd_key(); + key_set_ = key_set_ - c10::DispatchKeySet({c10::DispatchKey::ADInplaceOrView}); } +NestedTensorImpl::NestedTensorImpl(at::Tensor&& buffer, + EfficientSizeNode nested_size) + : NestedTensorImpl(std::move(buffer), + nested_size, + torch::nested_tensor::impl::_cont_stride(nested_size)) {} + +NestedTensorImpl::NestedTensorImpl(at::Tensor&& buffer, + SizeNode nested_size, + SizeNode nested_stride) + : NestedTensorImpl(std::move(buffer), + EfficientSizeNode(nested_size), + EfficientSizeNode(nested_stride)) {} + +NestedTensorImpl::NestedTensorImpl(at::Tensor&& buffer, + SizeNode nested_size) + : NestedTensorImpl(std::move(buffer), + EfficientSizeNode(nested_size)) {} + +NestedTensorImpl::NestedTensorImpl(TensorNode structure) + : NestedTensorImpl( + torch::nested_tensor::impl::pack(structure), + EfficientSizeNode( + map([](at::Tensor tensor) { return tensor.sizes().vec(); }, + structure))) {} + + inline TensorNode _squeeze_nested_dim(TensorNode structure, int64_t dim) { - if (dim == 0) { - return structure.children(0); - } - return TensorNode(_squeeze_nested_dim(structure, dim - 1)); + return squeeze(structure, dim, false); } -int64_t NestedTensorImpl::size(int64_t dim) const { - std::vector> size = opt_sizes(); +int64_t NestedTensor_size_int(const Tensor& self, int64_t dim) { + std::vector> size = + get_nested_tensor_impl(self)->opt_sizes(); if (size[dim]) { return *(size[dim]); } @@ -157,8 +91,14 @@ int64_t NestedTensorImpl::size(int64_t dim) const { "NestedTensor size at dim is not Tensor shape compliant."); } -IntArrayRef NestedTensorImpl::strides() const { - return _sizes; +int64_t nt_size(Tensor tensor, int64_t dim) { + auto impl = get_nested_tensor_impl(tensor); + std::vector> size = impl->opt_sizes(); + if (size[dim]) { + return *(size[dim]); + } + throw std::runtime_error( + "NestedTensor size at dim is not Tensor shape compliant."); } at::Tensor wrap_tensor_node(TensorNode&& result) { @@ -176,33 +116,91 @@ std::vector wrap_tensor_node(std::vector input) { return result; } -struct NestedTensorFunction_contiguous - : public torch::autograd::Function { - static Tensor forward( - torch::autograd::AutogradContext* ctx, - const Tensor& input) { - return wrap_tensor_node(pack(get_nested_tensor_structure(input))); +at::Tensor wrap_buffer(at::Tensor&& buffer, SizeNode nested_size) { + TORCH_CHECK(buffer.is_contiguous(), "Given buffer must be contiguous."); + if (nested_size.is_leaf()) { + return buffer.reshape(IntArrayRef(nested_size.payload())); } - static torch::autograd::variable_list backward( - torch::autograd::AutogradContext* ctx, - torch::autograd::variable_list grad_output_) { - TORCH_CHECK(grad_output_.size() == 1, "grad_output must be of size 1."); - at::Tensor grad_output = grad_output_[0]; - return {grad_output}; - } -}; + return at::detail::make_tensor( + std::move(buffer), nested_size); +} + +at::Tensor wrap_buffer( + at::Tensor&& buffer, + EfficientSizeNode efficient_nested_size, + EfficientSizeNode efficient_nested_stride) { + TORCH_CHECK(buffer.is_contiguous(), "Given buffer must be contiguous."); + TORCH_CHECK( + efficient_nested_size.height() > 0, + "Internal error: expected nested_size of non-zero height."); + TORCH_CHECK( + efficient_nested_stride.height() > 0, + "Internal error: expected nested_size of non-zero height."); + return at::detail::make_tensor( + std::move(buffer), + efficient_nested_size, + efficient_nested_stride); +} + +at::Tensor wrap_buffer( + at::Tensor&& buffer, + EfficientSizeNode efficient_nested_size) { + TORCH_CHECK(buffer.is_contiguous(), "Given buffer must be contiguous."); + TORCH_CHECK( + efficient_nested_size.height() > 0, + "Internal error: expected nested_size of non-zero height."); + return at::detail::make_tensor( + std::move(buffer), + efficient_nested_size); +} Tensor NestedTensor_contiguous(const Tensor& self, MemoryFormat memory_format) { - if (self.is_contiguous(memory_format)) { + if (get_is_contiguous(self, memory_format)) { return self; } TORCH_CHECK( memory_format != MemoryFormat::Preserve, "preserve memory format is unsupported by the contiguous operator"); - return NestedTensorFunction_contiguous::apply(self); + if (memory_format == at::MemoryFormat::Contiguous) { + if (get_is_contiguous(self, c10::MemoryFormat::ChannelsLast)) { + auto transposed_sizes = map_efficient_size([](int64_t* size_ptr, int64_t size) { + // nchw + int64_t tmp = size_ptr[0]; + size_ptr[0] = size_ptr[2]; + size_ptr[2] = tmp; + // nwhc + tmp = size_ptr[0]; + size_ptr[0] = size_ptr[1]; + size_ptr[1] = tmp; + // nhwc + }, get_efficient_nested_size(self)); + Tensor self_transposed = wrap_buffer(get_buffer(self), transposed_sizes); + return transpose_nhwc_nchw(self_transposed); + } + return at::detail::make_tensor(get_nested_tensor_structure(self)); + } + if (memory_format == at::MemoryFormat::ChannelsLast) { + Tensor self_cont = self; + if (!get_is_contiguous(self, c10::MemoryFormat::Contiguous)) { + self_cont = NestedTensor_contiguous(self, at::MemoryFormat::Contiguous); + } + TORCH_CHECK(get_dim(self_cont) == 4, "ChannelsLast memory format requires 4 dim input."); + auto new_strides = map_efficient_size([](int64_t* stride_ptr, int64_t* size_ptr, int64_t size) { + stride_ptr[2] = size_ptr[0]; + stride_ptr[1] = stride_ptr[2] * size_ptr[2]; + stride_ptr[0] = 1; + }, get_efficient_nested_stride(self_cont), get_efficient_nested_size(self_cont)); + self_cont = transpose_nchw_nhwc(self_cont); + return wrap_buffer(get_buffer(self_cont), get_efficient_nested_size(self), new_strides); + } + TORCH_CHECK(false, "Given memory format ", memory_format, " not supported by NestedTensor_contiguous."); + return self; } -bool NestedTensor_is_pinned(const Tensor& self) { +bool NestedTensor_is_pinned(const Tensor& self, c10::optional device) { + TORCH_CHECK( + !device.has_value() || device->is_cuda(), + "NestedTensor doesn't support non-CUDA pinned memory"); return get_nested_tensor_impl(self)->is_pinned(); } @@ -210,7 +208,7 @@ std::vector NestedTensor_unbind( const at::Tensor& self, int64_t dim) { auto _data = get_nested_tensor_impl(self); - dim = at::maybe_wrap_dim(dim, _data->dim()); + dim = at::maybe_wrap_dim(dim, get_dim(self)); auto node = _data->get_structure(); if (dim == 0) { return wrap_tensor_node(node.unbind()); @@ -234,7 +232,7 @@ std::vector NestedTensor_unbind( } Tensor NestedTensor_select(const Tensor& self, int64_t dim, int64_t index) { - int64_t ndim = self.dim(); + int64_t ndim = get_dim(self); dim = maybe_wrap_dim(dim, ndim); if (dim != 0) { TORCH_CHECK_INDEX(false, "select() only supports dim == 0 for now."); @@ -243,22 +241,38 @@ Tensor NestedTensor_select(const Tensor& self, int64_t dim, int64_t index) { return wrap_tensor_node(std::move(tmp)); } -Tensor NestedTensorImpl::to_nested_tensor(c10::optional dim__) { - int64_t dim_ = 0; - if (dim__) { - dim_ = *dim__; +Tensor NestedTensor_to_nested_tensor( + at::Tensor input, + c10::optional dim_) { + int64_t dim = 0; + if (dim_) { + dim = *dim_; + dim = maybe_wrap_dim(*dim_, get_dim(input) + 1); } - int64_t dim = at::maybe_wrap_dim(dim_, this->dim()); + TORCH_CHECK( + dim <= get_dim(input), + "target nested dimension needs to be equal or less than to input dimension"); // if dim < nested_dim() the NestedTensor is already nested // up to the given dimension. - if (dim >= this->nested_dim()) { - TensorNode unbound = _unbind_tensors(this->get_structure()); - for (int64_t i = 0; i < (dim - nested_dim()); i++) { + if (is_nested_tensor_impl(input) && dim >= get_nested_dim(input)) { + TensorNode unbound = _unbind_tensors(get_nested_tensor_structure(input)); + for (int64_t i = 0; i < (dim - get_nested_dim(input)); i++) { unbound = _unbind_tensors(unbound); } return wrap_tensor_node(std::move(unbound)); } - return wrap_tensor_node(std::move(_structure)); + if (!is_nested_tensor_impl(input) && dim > 0) { + std::vector unbound_nodes; + for (at::Tensor t : input.unbind()) { + unbound_nodes.push_back(TensorNode(std::move(t))); + } + TensorNode unbound(std::move(unbound_nodes)); + for (int64_t i = 1; i < dim; i++) { + unbound = _unbind_tensors(unbound); + } + return wrap_tensor_node(std::move(unbound)); + } + return input; } // TODO: There are unanswered questions @@ -267,10 +281,22 @@ Tensor NestedTensorImpl::to_nested_tensor(c10::optional dim__) { Tensor NestedTensor_slice( const Tensor& self, int64_t dim, - int64_t start, - int64_t end, + c10::optional start_, + c10::optional end_, int64_t step) { - int64_t ndim = self.dim(); + int64_t start; + if (start_) { + start = *start_; + } else { + start = 0; + } + int64_t end; + if (end_) { + end = *end_; + } else { + end = 9223372036854775807; + } + int64_t ndim = get_dim(self); if (ndim == 0) { TORCH_CHECK_INDEX(false, "slice() cannot be applied to a 0-dim tensor."); } @@ -280,7 +306,7 @@ Tensor NestedTensor_slice( } // TODO: support negative strides TORCH_CHECK(step >= 1, "slice step must be positive for now."); - int64_t sizes_0 = self.size(0); + int64_t sizes_0 = nt_size(self, 0); if (start < 0) { start += sizes_0; } @@ -312,11 +338,6 @@ Tensor NestedTensor_slice( } Tensor& NestedTensor_copy_(Tensor& self, const Tensor& src, bool non_blocking) { - // auto self_data = get_nested_tensor_impl(self); - // auto src_data = get_nested_tensor_impl(src); - // TORCH_CHECK( - // shape_matches(self_data->nested_size(), src_data->nested_size()), - // "self and source don't match in shape"); apply_nested_tensor( [](at::Tensor& self, at::Tensor& source) { return self.copy_(source); }, self, @@ -340,7 +361,7 @@ Tensor _NestedTensor_squeeze_(Tensor self, c10::optional dim_) { } return self; } - int64_t dim = at::maybe_wrap_dim(*dim_, self.dim()); + int64_t dim = at::maybe_wrap_dim(*dim_, get_dim(self)); TORCH_CHECK(dim > 0, "Cannot squeeze first dimension."); TORCH_CHECK( ((get_nested_tensor_impl(self)->opt_sizes()[dim]) && @@ -367,7 +388,7 @@ Tensor& NestedTensor_squeeze__dim(Tensor& self, int64_t dim) { } Tensor NestedTensor_squeeze_dim(const Tensor& self, int64_t dim) { - dim = at::maybe_wrap_dim(dim, self.dim()); + dim = at::maybe_wrap_dim(dim, get_dim(self)); auto self_impl = get_nested_tensor_impl(self); int64_t nested_dim = self_impl->nested_dim(); TORCH_CHECK(dim > 0, "Cannot squeeze first dimension."); @@ -376,7 +397,7 @@ Tensor NestedTensor_squeeze_dim(const Tensor& self, int64_t dim) { ((self_impl->opt_sizes()[dim]) && ((*(self_impl->opt_sizes()[dim])) == 1)), "Given dimension is either undefined or not a singleton."); - return autograd_map_nested_tensor( + return map_nested_tensor( [dim, nested_dim](at::Tensor tensor) { return tensor.squeeze(dim - nested_dim); }, @@ -388,7 +409,7 @@ Tensor NestedTensor_squeeze(const Tensor& self) { } Tensor NestedTensor_unsqueeze(const Tensor& self, int64_t dim) { - dim = maybe_wrap_dim(dim, self.dim() + 1); + dim = maybe_wrap_dim(dim, get_dim(self) + 1); if (dim == 0) { std::vector one_node; one_node.push_back(get_nested_tensor_structure(self)); @@ -403,32 +424,39 @@ Tensor NestedTensor_unsqueeze(const Tensor& self, int64_t dim) { return wrap_tensor_node(TensorNode(std::move(result_nodes))); } -void traceFallbackPre(const c10::OperatorHandle& op, Stack* stack) { - std::cerr << "Calling autograd fallback for " << op.schema() << std::endl; - c10::impl::ExcludeDispatchKeyGuard guard( - c10::DispatchKey::AutogradPrivateUse1); - op.callBoxed(stack); -} - -TORCH_LIBRARY_IMPL(_, AutogradPrivateUse1, m) { - // m.fallback(torch::CppFunction::makeFromBoxedFunction<&traceFallbackPre>()); - m.fallback(torch::CppFunction::makeFallthrough()); +Tensor NestedTensor_to_dtype_layout( + const Tensor& self, + c10::optional dtype, + c10::optional layout, + c10::optional device, + c10::optional pin_memory, + bool non_blocking, + bool copy, + c10::optional optional_memory_format) { + auto input_buffer = get_buffer(self); + auto result_nt = wrap_buffer(input_buffer.to(dtype, layout, device, pin_memory, + non_blocking, copy, c10::nullopt), + get_efficient_nested_size(self), + get_efficient_nested_stride(self)); + if (optional_memory_format) { + return NestedTensor_contiguous(result_nt, *optional_memory_format); + } + return result_nt; } -TORCH_LIBRARY_IMPL(aten, AutogradPrivateUse1, m) { - nt_impl(m, "copy_", NestedTensor_copy_); - nt_impl(m, "squeeze_", NestedTensor_squeeze_); - nt_impl(m, "squeeze_.dim", NestedTensor_squeeze__dim); - nt_impl(m, "squeeze", NestedTensor_squeeze); - nt_impl(m, "squeeze.dim", NestedTensor_squeeze_dim); +TORCH_LIBRARY_IMPL(aten, NestedTensor, m) { nt_impl(m, "contiguous", NestedTensor_contiguous); + nt_impl(m, "copy_", NestedTensor_copy_); nt_impl(m, "is_pinned", NestedTensor_is_pinned); - // nt_impl("unbind.int", no_bw(TORCH_FN(NestedTensor_unbind))); -} -TORCH_LIBRARY_IMPL(aten, PrivateUse1, m) { - nt_impl(m, "unbind.int", NestedTensor_unbind); nt_impl(m, "select.int", NestedTensor_select); + nt_impl(m, "size.int", NestedTensor_size_int); nt_impl(m, "slice.Tensor", NestedTensor_slice); + nt_impl(m, "squeeze", NestedTensor_squeeze); + nt_impl(m, "squeeze.dim", NestedTensor_squeeze_dim); + nt_impl(m, "squeeze_", NestedTensor_squeeze_); + nt_impl(m, "squeeze_.dim", NestedTensor_squeeze__dim); + nt_impl(m, "unbind.int", NestedTensor_unbind); nt_impl(m, "unsqueeze", NestedTensor_unsqueeze); + nt_impl(m, "to.dtype_layout", NestedTensor_to_dtype_layout); } } // namespace at diff --git a/nestedtensor/csrc/nested_tensor_impl.h b/nestedtensor/csrc/nested_tensor_impl.h index 87cb81b2..004afbed 100644 --- a/nestedtensor/csrc/nested_tensor_impl.h +++ b/nestedtensor/csrc/nested_tensor_impl.h @@ -2,6 +2,7 @@ #include #include #include +#include #include #include #include @@ -9,33 +10,19 @@ #include // #define TRACEPACKED 1 -#define USEPACKED 1 - -namespace torch { -namespace nested_tensor { - -using TensorNode = NestedNode; -using IValueNode = NestedNode; -using SizeNode = NestedNode>; -using IntegerNode = NestedNode; - -} // namespace nested_tensor -} // namespace torch +// #define USEPACKED 1 namespace at { using namespace torch::nested_tensor; -constexpr auto NestedTensorKey_PreAutograd = DispatchKey::AutogradPrivateUse1; -constexpr auto NestedTensorKey = DispatchKey::PrivateUse1; +constexpr auto NestedTensorKey = DispatchKey::NestedTensor; struct NestedTensorImpl; template bool is_nested_tensor_impl(A tensor) { - return tensor.unsafeGetTensorImpl()->key_set().has(at::NestedTensorKey) || - tensor.unsafeGetTensorImpl()->key_set().has( - at::NestedTensorKey_PreAutograd); + return tensor.unsafeGetTensorImpl()->key_set().has(at::NestedTensorKey); } template @@ -49,151 +36,56 @@ bool is_nested_tensor_impl(A first, B second, C... other) { is_nested_tensor_impl(other...); } -template -void torch_check_is_nested_tensor(A tensor) { - TORCH_CHECK(is_nested_tensor_impl(tensor), "Argument is not NestedTensor."); -} - -template -void torch_check_is_nested_tensor(A first, B other) { - torch_check_is_nested_tensor(first); - torch_check_is_nested_tensor(other); -} - -template -void torch_check_is_nested_tensor(A first, B second, C... other) { - torch_check_is_nested_tensor(first, second); - torch_check_is_nested_tensor(other...); -} - -template -inline bool tensor_shape_matches(A a) { - return true; -} - -template -inline bool tensor_shape_matches(A a, B b) { - if (is_nested_tensor_impl(a, b)) { - return shape_matches( - get_nested_tensor_structure(a), get_nested_tensor_structure(b)); - } - return true; -} - -template -inline bool tensor_shape_matches(A a, B b, C... c) { - TORCH_CHECK( - is_nested_tensor_impl(a, b, c...), - "Can only compare shapes of NestedTensors."); - if (is_nested_tensor_impl(a, b)) { - return shape_matches( - get_nested_tensor_structure(a), - get_nested_tensor_structure(b)) && - tensor_shape_matches(b, c...); - } - if (is_nested_tensor_impl(a)) { - return tensor_shape_matches(a, c...); - } - if (is_nested_tensor_impl(b)) { - return tensor_shape_matches(b, c...); - } - return tensor_shape_matches(c...); -} - -template -inline bool nested_size_matches(A a) { - TORCH_CHECK( - is_nested_tensor_impl(a), "Can only compare shapes of NestedTensors."); - return true; -} - -template -inline bool nested_size_matches(A a, B b) { - TORCH_CHECK( - is_nested_tensor_impl(a, b), "Can only compare shapes of NestedTensors."); - auto nested_size_a = get_nested_tensor_impl(a)->nested_size(); - auto nested_size_b = get_nested_tensor_impl(b)->nested_size(); - if (!shape_matches(nested_size_a, nested_size_b)) { - return false; - } - std::vector bools = flatten(map( - [](c10::List a, c10::List b) -> bool { - if (a.size() != b.size()) { - return false; - } - for (size_t i = 0; i < a.size(); i++) { - if (a[i] != b[i]) { - return false; - } - } - return true; - }, - nested_size_a, - nested_size_b)); - bool all = true; - for (size_t i = 0; i < bools.size(); i++) { - all = all && bools[i]; - } - return all; -} - -template -inline bool nested_size_matches(A a, B b, C... c) { - return nested_size_matches(a, b) && nested_size_matches(b, c...); -} - -template -inline void torch_check_tensor_shape_matches(A... a) { - TORCH_CHECK(tensor_shape_matches(a...), "NestedTensor shapes don't match."); -} - template -static inline void apply_nested_tensor(F&& fn, A... a) { +inline void apply_nested_tensor(F&& fn, A... a) { // torch_check_tensor_shape_matches(a...); // torch_check_is_nested_tensor(a...); - apply(std::move(fn), get_nested_tensor_structure(a)...); + apply(std::forward(fn), get_nested_tensor_structure(a)...); } struct NestedTensorImpl : public c10::TensorImpl { + explicit NestedTensorImpl(at::Tensor&& buffer, EfficientSizeNode nested_size, EfficientSizeNode nested_stride); + explicit NestedTensorImpl(at::Tensor&& buffer, EfficientSizeNode nested_size); + explicit NestedTensorImpl(at::Tensor&& buffer, SizeNode nested_size, SizeNode nested_stride); + explicit NestedTensorImpl(at::Tensor&& buffer, SizeNode nested_size); explicit NestedTensorImpl(TensorNode structure); +#ifndef C10_DISABLE_TENSORIMPL_EXTENSIBILITY int64_t dim() const override { - return _first_variable.dim() + nested_dim(); + TORCH_CHECK( + false, "dim is disabled. These methods are not virtual in fbcode."); } +#endif +#ifndef C10_DISABLE_TENSORIMPL_EXTENSIBILITY int64_t numel() const override { - auto fn = [](at::Tensor leaf, int64_t input) { - return input + leaf.numel(); - }; - return reduce(get_structure(), fn, 0); + TORCH_CHECK( + false, "numel is disabled. These methods are not virtual in fbcode."); } +#endif +#ifndef C10_DISABLE_TENSORIMPL_EXTENSIBILITY bool is_contiguous(at::MemoryFormat memory_format) const override { - // NOTE: The Tensors themselves might not be contiguous even if there is a - // buffer. For this to be contiguous not only the individuals Tensors have - // to be but also the buffer. - auto fn = [](at::Tensor leaf, bool input) { - return input && leaf.is_contiguous(); - }; - return reduce(get_structure(), fn, true) && - get_structure().buffer().has_value(); + TORCH_CHECK( + false, + "is_contiguous is disabled. These methods are not virtual in fbcode."); } - TensorNode& get_structure() { - return _structure; +#endif + TensorNode get_structure() const { + return std::get<0>(torch::nested_tensor::impl::build_structure( + _buffer.reshape({-1}), + _nested_size, + _nested_stride)); } - const TensorNode& get_structure() const { - return _structure; + EfficientSizeNode get_nested_size() { + return _nested_size; + } + EfficientSizeNode get_nested_stride() { + return _nested_stride; } - c10::intrusive_ptr shallow_copy_and_detach( - const c10::VariableVersion& version_counter, - bool allow_tensor_metadata_change) const override; - - // TODO: - void shallow_copy_from(const c10::intrusive_ptr& impl) override; int64_t nested_dim() const { - return get_structure().height(); + return _nested_size.height(); } - Tensor to_nested_tensor(c10::optional dim); bool is_pinned() const { - return _first_variable.is_pinned(); + return _buffer.is_pinned(); } // This is a C++ representation of a nested list of torch.Sizes // @@ -217,30 +109,75 @@ struct NestedTensorImpl : public c10::TensorImpl { // That means, if the list is not empty it is either a list of // lists of numbers or a list of empty lists. SizeNode nested_size() const { - return map( - [](at::Tensor tensor) { return c10::List(tensor.sizes()); }, - get_structure()); + return _nested_size.to_size_node(); } SizeNode nested_stride() const { - return map( - [](at::Tensor tensor) { return c10::List(tensor.strides()); }, - get_structure()); + return _nested_stride.to_size_node(); } - - std::vector> opt_sizes() const; + const std::vector> opt_sizes() const { + return _nested_size.opt_sizes(); + } +#ifndef C10_DISABLE_TENSORIMPL_EXTENSIBILITY IntArrayRef sizes() const override { - return IntArrayRef(_sizes); + TORCH_CHECK( + false, + "Internal error: NestedTensorImpl doesn't support sizes. Please file an issue on https://github.com/pytorch/nestedtensor"); + std::vector sizes; + return IntArrayRef(sizes); + } +#endif +#ifndef C10_DISABLE_TENSORIMPL_EXTENSIBILITY + IntArrayRef strides() const override { + TORCH_CHECK( + false, + "Internal error: NestedTensorImpl doesn't support strides. Please file an issue on https://github.com/pytorch/nestedtensor"); + std::vector strides; + return IntArrayRef(strides); + } +#endif + + const at::Tensor& get_buffer() const { + return _buffer; + } + + at::Tensor& get_buffer() { + return _buffer; + } + + bool get_is_cuda() const { + return _buffer.is_cuda(); + } + + bool get_is_contiguous(at::MemoryFormat memory_format) const { + if (memory_format == at::MemoryFormat::Contiguous) { + return _is_contiguous; + } + if (memory_format == at::MemoryFormat::ChannelsLast) { + return _is_contiguous_channels_last; + } + TORCH_CHECK(false, "is_contiguous does not support memory format ", memory_format); + return false; + } + + bool get_is_pinned() const { + return _is_pinned; } - int64_t size(int64_t dim) const override; - IntArrayRef strides() const override; private: - TensorNode _structure; - at::Tensor _first_variable; - SizeNode _nested_size; - std::vector _sizes; + at::Tensor _buffer; + const EfficientSizeNode _nested_size; + const EfficientSizeNode _nested_stride; + bool _is_pinned; + const bool _is_contiguous; + const bool _is_contiguous_channels_last; }; +int64_t nt_size(Tensor tensor, int64_t dim); + +Tensor NestedTensor_to_nested_tensor( + at::Tensor input, + c10::optional dim__); + inline at::NestedTensorImpl* get_nested_tensor_impl(const at::Tensor tensor) { if (!is_nested_tensor_impl(tensor)) { throw std::runtime_error("Function requires NestedTensorImpl"); @@ -261,37 +198,117 @@ inline TensorNode get_nested_tensor_structure(at::Tensor tensor) { return get_nested_tensor_impl(tensor)->get_structure(); } -template -static inline bool is_packed(A tensor) { - return is_nested_tensor_impl(tensor) && - get_nested_tensor_structure(tensor).buffer().has_value(); +inline at::Tensor get_buffer(const at::Tensor& tensor) { + return get_nested_tensor_impl(tensor)->get_buffer(); } -template -static inline bool is_packed(A first, B other) { - return is_packed(first) && is_packed(other); +inline const std::vector> get_opt_sizes( + const at::Tensor& tensor) { + TORCH_CHECK( + is_nested_tensor_impl(tensor), "Given tensor must be NestedTensor."); + return get_nested_tensor_impl(tensor)->opt_sizes(); } -template -static inline bool is_packed(A first, B second, C... other) { - return is_packed(first, second) && is_packed(other...); +inline const EfficientSizeNode get_efficient_nested_size(const at::Tensor& tensor) { + TORCH_CHECK( + is_nested_tensor_impl(tensor), "Given tensor must be NestedTensor."); + return get_nested_tensor_impl(tensor)->get_nested_size(); +} + +inline const EfficientSizeNode get_efficient_nested_stride(const at::Tensor& tensor) { + TORCH_CHECK( + is_nested_tensor_impl(tensor), "Given tensor must be NestedTensor."); + return get_nested_tensor_impl(tensor)->get_nested_stride(); +} + +inline SizeNode get_nested_size(at::Tensor tensor) { + TORCH_CHECK( + is_nested_tensor_impl(tensor), "Given tensor must be NestedTensor."); + return get_nested_tensor_impl(tensor)->get_nested_size().to_size_node(); } -static inline at::Tensor get_buffer(at::Tensor tensor) { - TORCH_CHECK(is_packed(tensor), "Given Tensor doesn't have buffer."); - return *(get_nested_tensor_structure(tensor).buffer()); +inline SizeNode get_nested_stride(at::Tensor tensor) { + TORCH_CHECK( + is_nested_tensor_impl(tensor), "Given tensor must be NestedTensor."); + return get_nested_tensor_impl(tensor)->get_nested_stride().to_size_node(); +} + +inline int64_t get_dim(const at::Tensor& tensor) { + if (is_nested_tensor_impl(tensor)) { + return get_nested_tensor_impl(tensor)->get_nested_size().dim(); + } + return tensor.dim(); +} + +inline const caffe2::TypeMeta get_dtype(const at::Tensor& tensor) { + return tensor.dtype(); +} + +inline int64_t get_numel(const at::Tensor& tensor) { + if (is_nested_tensor_impl(tensor)) { + return get_nested_tensor_impl(tensor)->get_nested_size().numel(); + } + return tensor.numel(); +} + +Tensor NestedTensor_contiguous( + const Tensor& self, + MemoryFormat memory_format = MemoryFormat::Contiguous); + +inline bool get_is_contiguous( + const at::Tensor& tensor, + at::MemoryFormat memory_format = MemoryFormat::Contiguous) { + if (is_nested_tensor_impl(tensor)) { + return get_nested_tensor_impl(tensor)->get_is_contiguous(memory_format); + } + return tensor.is_contiguous(memory_format); +} + +inline bool get_is_cuda( + const at::Tensor& tensor, + at::MemoryFormat memory_format = MemoryFormat::Contiguous) { + if (is_nested_tensor_impl(tensor)) { + return get_nested_tensor_impl(tensor)->get_is_cuda(); + } + return tensor.is_cuda(); +} + +inline int64_t get_nested_dim(const at::Tensor& tensor) { + TORCH_CHECK( + is_nested_tensor_impl(tensor), "Given tensor must be NestedTensor."); + return get_nested_tensor_impl(tensor)->nested_dim(); } at::Tensor wrap_tensor_node(NestedTensorImpl); at::Tensor wrap_tensor_node(TensorNode&&); std::vector wrap_tensor_node(std::vector); +at::Tensor wrap_buffer(at::Tensor&&, SizeNode nested_size); +at::Tensor wrap_buffer( + at::Tensor&&, + EfficientSizeNode efficient_nested_size, + EfficientSizeNode efficient_nested_stride); +at::Tensor wrap_buffer( + at::Tensor&&, + EfficientSizeNode efficient_nested_size); template -static inline at::Tensor map_nested_tensor(F&& fn, A... a) { +inline at::Tensor map_nested_tensor(F&& fn, A... a) { // torch_check_tensor_shape_matches(a...); // torch_check_is_nested_tensor(a...); return wrap_tensor_node( - map(std::move(fn), get_nested_tensor_structure(a)...)); + map(std::forward(fn), get_nested_tensor_structure(a)...)); +} + +template +inline typename c10::guts::infer_function_traits::type::return_type +reduce_nested_tensor(F&& fn, I init, A... a) { + // torch_check_tensor_shape_matches(a...); + // torch_check_is_nested_tensor(a...); + return reduce(std::forward(fn), init, get_nested_tensor_structure(a)...); +} + +inline std::vector flatten_nested_tensor(at::Tensor tensor) { + return flatten(get_nested_tensor_structure(tensor)); } inline bool is_tensor_shape(const at::Tensor tensor) { @@ -306,6 +323,31 @@ inline bool is_tensor_shape(const at::Tensor tensor) { Tensor NestedTensor_to_tensor(Tensor tensor, c10::optional dim_); +inline Tensor NestedTensor_to_sparse_csr(Tensor tensor) { + TORCH_CHECK( + get_dim(tensor) == 2, + "Given tensor must be of dimension 2, got dimension ", + get_dim(tensor)); + Tensor values; + if (get_is_contiguous(tensor)) { + values = get_buffer(tensor).reshape({-1}); + } else { + values = at::cat(flatten(get_nested_tensor_structure(tensor))); + } + auto tensor_sizes = get_efficient_nested_size(tensor).sizes(); + tensor_sizes = tensor_sizes.reshape({-1}); + int64_t* tensor_sizes_ptr = tensor_sizes.data_ptr(); + at::Tensor crow_indices = + at::cat({torch::tensor({0}), at::cumsum(tensor_sizes, 0)}); + std::vector col_indices_; + for (int64_t i = 0; i < tensor_sizes.size(0); i++) { + col_indices_.push_back(torch::arange({tensor_sizes_ptr[i]})); + } + at::Tensor col_indices = at::cat(col_indices_); + return at::native::sparse_csr_tensor( + crow_indices, col_indices, values, c10::nullopt, torch::kSparseCsr); +} + inline std::ostream& operator<<( std::ostream& out, const NestedTensorImpl& batch_tensor) { @@ -316,73 +358,6 @@ inline std::ostream& operator<<( return out; } -template -struct _Function_no_bw {}; - -template -struct _Function_no_bw> - : public torch::autograd::Function<_Function_no_bw< - FuncPtr, - c10::guts::typelist::typelist>> { - using ReturnType = typename c10::guts::infer_function_traits_t< - typename FuncPtr::FuncType>::return_type; - static ReturnType forward( - torch::autograd::AutogradContext* ctx, - Parameters... args) { - return (*FuncPtr::func_ptr())(std::forward(args)...); - } - static torch::autograd::variable_list backward( - torch::autograd::AutogradContext* ctx, - torch::autograd::variable_list grad_output_) { - TORCH_CHECK(false, "Backward not implemented for ", typeid(FuncPtr).name()); - return {}; - } -}; - -template < - class Tuple, - class T = std::decay_t>>> -// TODO: Return an array instead. -std::vector to_vector(Tuple&& tuple) { - return c10::guts::apply( - [](auto&&... elems) { - return std::vector{std::forward(elems)...}; - }, - std::forward(tuple)); -} - -template -struct _Function_no_bw_wrapper {}; - -// you have to create a wrapper struct to create a version of apply that only -// accepts the arguments defined in forward. torch::autograd::Function::apply -// accepts any arguments regardless of what signature -// torch::autograd::Function::forward has and therefore you can't resolve it's -// signature. Instead you'd expect apply to have the exact same signature as -// forward -template -struct _Function_no_bw_wrapper< - FuncPtr, - c10::guts::typelist::typelist> { - using AutogradFunction = - _Function_no_bw>; - using ReturnType = typename c10::guts::infer_function_traits_t< - typename FuncPtr::FuncType>::return_type; - static ReturnType apply(Parameters... args) { - return AutogradFunction::apply(args...); - } -}; - -template -constexpr auto no_bw(FuncPtr /*func_ptr*/) { - using function_traits = - c10::guts::infer_function_traits_t; - using parameter_types = typename function_traits::parameter_types; - using AutogradFunctionWrapper = - _Function_no_bw_wrapper; - return &AutogradFunctionWrapper::apply; -} - template struct _Function_trace_wrapper {}; @@ -406,285 +381,11 @@ constexpr auto trace(FuncPtr /*func_ptr*/) { return &_Function_trace_wrapper::apply; } -namespace detail { -// Describe the type of a tuple with element I from each input tuple. -// Needed to preserve the exact types from the input tuples. -template -using zip_tuple_at_index_t = - std::tuple>...>; - -// Collect all elements at index I from all input tuples as a new tuple. -template -zip_tuple_at_index_t zip_tuple_at_index(Tuples&&... tuples) { - return {std::get(std::forward(tuples))...}; -} - -// Create a tuple with the result of zip_tuple_at_index for each index. -// The explicit return type prevents flattening into a single tuple -// when sizeof...(Tuples) == 1 or sizeof...(I) == 1 . -template -std::tuple...> tuple_zip_impl( - Tuples&&... tuples, - std::index_sequence) { - return {zip_tuple_at_index(std::forward(tuples)...)...}; -} - -} // namespace detail - -// Zip a number of tuples together into a tuple of tuples. -// Take the first tuple separately so we can easily get its size. -template -auto tuple_zip(Head&& head, Tail&&... tail) { - constexpr std::size_t size = std::tuple_size>::value; - return detail::tuple_zip_impl( - std::forward(head), - std::forward(tail)..., - std::make_index_sequence()); -} - -// The approach here is quite "simple". There are six different stages to this. -// 1. We take the input NestedTensor whose constituents are, by design, required -// to not track gradients. Only the NestedTensor as a whole is allowed to track -// that information. -// 2. We take that NestedTensor and create a copy, i.e. a new NestedTensor, -// where the gradients do track gradients. This is not a valid NestedTensor -// outside the context of this function and in the future we might decide to -// pick a different container, maybe even a flat list, for this purpose. -// 3. We set these constiuents of the new NestedTensor to track gradients. A -// very important point here is that within a custom autograd Function -// AutoGradMode is *disabled*, because we're defining a new elementary operation -// within the Autograd graph and aren't appending to it. We're effectively -// creating a subgraph for the purpose of this operation here that isn't connect -// to the overall graph that corresponds to NestedTensor operations. -// 4. We apply the differentiable function that was passed as an argument to -// each constiuents of the NestedTensor from step 3 again while enabling -// AutoGradMode. We will again get a NestedTensor where the constituents track -// gradients. To make sure we actually return a valid NestedTensor we detach -// this information for our return value and save the NestedTensor from this -// step only for the backward pass. -// 5. This step does the actual detach of the constituents -// 6. This step then returns the NestedTensor from step 5. -// -// NOTE: This doesn't account for propagating gradients to gradient carrying -// functions caught in the closure of func. For example, batchnorm will want -// to get gradients for its weight and bias. If they are regular Tensors -// they won't be given as inputs and their gradients won't be propagated -// by this mapper. -template -struct NestedTensorFunction_mapper - : public torch::autograd::Function< - NestedTensorFunction_mapper> { - static Tensor forward( - torch::autograd::AutogradContext* ctx, - F&& fn, - B input, - // 1. Original NestedTensors - Args... a) { - auto autograd_input_tuple_ = c10::guts::tuple_map( - tuple_zip(input, std::make_tuple(a...)), - [](std::tuple&& tup) { - bool rg = std::get<0>(tup); - at::Tensor t = std::get<1>(tup); - if (is_nested_tensor_impl(t)) { - apply_nested_tensor( - [](at::Tensor& ti) { - TORCH_CHECK( - !ti.requires_grad(), - "autograd_mapper input's constituents shouldn't require gradients."); - }, - t); - } - if (rg) { - if (is_nested_tensor_impl(t)) { - return map_nested_tensor( - // 2. Constituents of NestedTensors - [](at::Tensor ti) { - AutoGradMode autogradmode(true); - // TODO: Don't apply this if the corresponding NestedTensor - // doesn't require a gradient. - // TODO: This fails if the input is not of differentiable - // dtype. - auto alias = ti.alias(); - if (torch::autograd::isDifferentiableType( - alias.scalar_type())) { - alias.requires_grad_(); - } - // 3. Alias to constituents that do requires gradients - return alias; - }, - t); - } - AutoGradMode autogradmode(true); - auto alias = t.alias(); - if (torch::autograd::isDifferentiableType(alias.scalar_type())) { - alias.requires_grad_(); - } - return alias; - } - return t; - }); - auto autograd_input_tuple = autograd_input_tuple_; - std::vector requires_grad_vector = to_vector(input); - bool expect_diff_function = true; - for (bool requires_grad : requires_grad_vector) { - expect_diff_function = expect_diff_function && requires_grad; - } - // 4. Output of differentiable function given Tensor from step 3. - at::Tensor autograd_output = c10::guts::apply( - [&fn, &expect_diff_function](auto... a) { - return map_nested_tensor( - [&](Args... t) { - AutoGradMode autogradmode(true); - at::Tensor result = fn(t...); - if (expect_diff_function) { - TORCH_CHECK( - result.requires_grad(), - "fn ", - typeid(F).name(), - " output expected to required gradient."); - } - return result; - }, - a...); - }, - std::move(autograd_input_tuple_)); - - auto tensor_vector = to_vector(std::move(autograd_input_tuple)); - tensor_vector.push_back(autograd_output); - ctx->save_for_backward(tensor_vector); - ctx->saved_data["0"] = requires_grad_vector; - // 5. Constituents of output NestedTensor - auto output = map_nested_tensor( - [](at::Tensor t) { return t.alias().detach(); }, autograd_output); - - // 6. Output NestedTensor - return output; - } - static torch::autograd::variable_list backward( - torch::autograd::AutogradContext* ctx, - // TODO: To prevent double backward (for now) check that grad_output - // doesn't require gradients. - torch::autograd::variable_list grad_output_) { - std::vector saved_data = ctx->get_saved_variables(); - constexpr int64_t saved_data_size = sizeof...(Args) + 1; - TORCH_CHECK( - saved_data.size() == saved_data_size, - "saved_data not of expected size."); - std::vector requires_grad_vector_ = - ctx->saved_data["0"].toBoolList().vec(); - TORCH_CHECK( - requires_grad_vector_.size() == saved_data_size - 1, - "requires_grad_vector.size() should match number of inputs."); - std::array requires_grad_vector; - for (size_t i = 0; i < saved_data_size - 1; i++) { - requires_grad_vector[i] = requires_grad_vector_[i]; - } - TORCH_CHECK( - grad_output_.size() == 1, - "Only one incoming gradient supported for now."); - // TORCH_CHECK( - // saved_data_size <= 3, - // "Only one input and at most two outputs supported for now."); - std::vector input_nodes; - for (size_t i = 0; i < saved_data_size - 1; i++) { - if (requires_grad_vector[i]) { - input_nodes.push_back(get_nested_tensor_structure(saved_data[i])); - } - } - at::Tensor undef; - // NOTE: First entry needs to return undef for function value input. - // NOTE: Second entry corresponds to the requires_grad_vector - std::array grad_input; - grad_input.fill(undef); - std::vector wrapped_grad_input = unzip(map( - [&grad_input, &saved_data, &requires_grad_vector]( - at::Tensor r, std::vector is, at::Tensor g) { - return torch::autograd::grad({r}, is, {g}); - }, - get_nested_tensor_structure(saved_data[saved_data_size - 1]), - zip(input_nodes), - get_nested_tensor_structure(grad_output_[0]))); - size_t index = 0; - for (size_t i = 0; i < saved_data_size - 1; i++) { - if (requires_grad_vector[i]) { - if (is_nested_tensor_impl(saved_data[i])) { - grad_input[2 + i] = - wrap_tensor_node(std::move(wrapped_grad_input[index])); - } else { - std::vector flat = flatten(wrapped_grad_input[index]); - std::vector first_flat; - std::vector second_flat; - while (flat.size() > 1) { - first_flat.clear(); - second_flat.clear(); - size_t flat_size = flat.size() / 2; - for (size_t j = 0; j < flat_size; j++) { - first_flat.push_back(flat[0]); - flat.pop_back(); - second_flat.push_back(flat[0]); - flat.pop_back(); - } - TORCH_CHECK( - first_flat.size() == second_flat.size(), - "Both first and second list should be of the same size."); - first_flat = _foreach_add(first_flat, second_flat); - for (size_t j = 0; j < flat.size(); j++) { - first_flat.push_back(flat[j]); - } - flat = first_flat; - } - if (flat.size() > 0) { - at::Tensor tmp_grad = flat[0].contiguous(); - for (size_t j = 1; j < flat.size(); j++) { - tmp_grad.add_(flat[j]); - } - grad_input[2 + i] = tmp_grad; - } - } - index++; - } - } - TORCH_CHECK( - grad_input.size() == saved_data_size + 1, - "grad input should match number of inputs."); - TORCH_CHECK( - index == wrapped_grad_input.size(), "Not all grad inputs distributed."); - return std::vector{grad_input.begin(), grad_input.end()}; - } -}; - -template -static inline at::Tensor autograd_map_nested_tensor(F&& fn, A... a) { - auto b = - c10::guts::tuple_map(std::tuple(a...), [](at::Tensor t) -> bool { - if (t.defined()) { - return t.requires_grad(); - } - return false; - }); - return NestedTensorFunction_mapper::apply( - std::move(fn), b, a...); -} - -static inline Tensor maybe_multiply(const Tensor& t, const Scalar& s) { - bool is_one = false; - if (s.isFloatingPoint()) { - is_one = s.toDouble() == 1; - } else if (s.isIntegral(true)) { - is_one = s.toLong() == 1; - } - - if (is_one) { - return t; - } else { - return at::mul(t, s); - } -} - #ifdef TRACEPACKED -#define nt_impl(M, NAME, FUNC) M.impl_UNBOXED(NAME, trace(TORCH_FN(FUNC))) +// #define nt_impl(M, NAME, FUNC) M.impl(NAME, trace(TORCH_FN(FUNC))) #else -#define nt_impl(M, NAME, FUNC) M.impl_UNBOXED(NAME, FUNC) +// #define nt_impl(M, NAME, FUNC) M.impl(NAME, trace(TORCH_FN(FUNC))) +#define nt_impl(M, NAME, FUNC) M.impl(NAME, TORCH_FN(FUNC)) #endif } // namespace at diff --git a/nestedtensor/csrc/norm.cpp b/nestedtensor/csrc/norm.cpp deleted file mode 100644 index bca28cfd..00000000 --- a/nestedtensor/csrc/norm.cpp +++ /dev/null @@ -1,161 +0,0 @@ - -#include -#include -#include -#include - -using namespace torch::nn; -namespace F = torch::nn::functional; - -namespace at { -// TODO: Cover all the cases! -struct NestedTensorFunction_batch_norm - : torch::autograd::Function { - static Tensor forward( - torch::autograd::AutogradContext* ctx, - const Tensor& input_, - const c10::optional& weight_, - const c10::optional& bias_, - const c10::optional& running_mean, - const c10::optional& running_var, - bool training, - double momentum, - double eps, - bool cudnn_enabled) { - // TORCH_CHECK(weight_, "asdf0"); - // TORCH_CHECK(bias_, "asdf1"); - auto autograd_input = map_nested_tensor( - [](at::Tensor ti) { - AutoGradMode autogradmode(true); - auto alias = ti.alias(); - alias.requires_grad_(); - return alias; - }, - input_); - c10::optional weight; - c10::optional bias; - { - AutoGradMode autogradmode(true); - if (weight_) { - weight = (*weight_).alias().detach().requires_grad_(); - } - if (bias_) { - bias = (*bias_).alias().detach().requires_grad_(); - } - } - auto autograd_output = map_nested_tensor( - [&](at::Tensor t) { - AutoGradMode autogradmode(true); - return at::native::batch_norm( - t.unsqueeze(0), - *weight, - *bias, - *running_mean, - *running_var, - training, - momentum, - eps, - cudnn_enabled) - .squeeze(0); - }, - autograd_input); - at::Tensor undef; - ctx->save_for_backward({weight ? *weight : undef, - bias ? *bias : undef, - autograd_output, - autograd_input}); - return map_nested_tensor( - [](at::Tensor t) { return t.detach(); }, autograd_output); - } - static torch::autograd::variable_list backward( - torch::autograd::AutogradContext* ctx, - // TODO: To prevent double backward (for now) check that grad_output - // doesn't require gradients. - torch::autograd::variable_list grad_output) { - auto saved_data = ctx->get_saved_variables(); - - c10::optional weight; - c10::optional bias; - if (saved_data[0].defined()) { - weight = saved_data[0]; - } - if (saved_data[1].defined()) { - bias = saved_data[1]; - } - auto autograd_output = saved_data[2]; - auto autograd_input = saved_data[3]; - c10::optional weight_grad; - if (weight) { - weight_grad = torch::zeros_like(*weight); - } - c10::optional bias_grad; - if (bias) { - bias_grad = torch::zeros_like(*bias); - } - - TORCH_CHECK(grad_output.size() == 1, "not supported 0"); - at::Tensor grad = map_nested_tensor( - [&](at::Tensor r, at::Tensor i, at::Tensor g) { - // TODO: Might have to retain graph in many to one settings. - std::vector inputs; - inputs.push_back(i); - if (weight) { - inputs.push_back(*weight); - } - if (bias) { - inputs.push_back(*bias); - } - auto result = torch::autograd::grad( - {r}, inputs, {g}, c10::nullopt, false, true); - if (result[1].defined()) { - (*weight_grad).add_(result[1]); - } - if (result[2].defined()) { - (*bias_grad).add_(result[2]); - } - return result[0]; - }, - autograd_output, - autograd_input, - grad_output[0]); - - at::Tensor undef; - return {grad, - weight_grad ? *weight_grad : undef, - bias_grad ? *bias_grad : undef, - undef, - undef, - undef, - undef, - undef, - undef}; - } -}; - -Tensor NestedTensor_batch_norm( - const Tensor& input, - const c10::optional& weight, - const c10::optional& bias, - const c10::optional& running_mean, - const c10::optional& running_var, - bool training, - double momentum, - double eps, - bool cudnn_enabled) { - return NestedTensorFunction_batch_norm::apply( - input, - weight, - bias, - running_mean, - running_var, - training, - momentum, - eps, - cudnn_enabled); -} - -TORCH_LIBRARY_IMPL(aten, AutogradPrivateUse1, m) { - nt_impl(m, "batch_norm", NestedTensor_batch_norm); -} - -} // namespace at diff --git a/nestedtensor/csrc/packedbinaryops.cpp b/nestedtensor/csrc/packedbinaryops.cpp deleted file mode 100644 index 4c87346d..00000000 --- a/nestedtensor/csrc/packedbinaryops.cpp +++ /dev/null @@ -1,169 +0,0 @@ -#include - -namespace at { - -using namespace torch::nested_tensor; - -template -Tensor& NestedTensor_binary_(Tensor& self_, const Tensor& other_) { - at::Tensor self; - at::Tensor other; - std::tie(self, other) = _expand_other_as(self_, other_); - apply_nested_tensor( - [](Tensor& tensor, const Tensor other) { func(tensor, other); }, - self, - other); - return self_; -} - -template -Tensor NestedTensor_binary_scalar(const Tensor& self, Scalar other) { - return autograd_map_nested_tensor( - [&other](Tensor self) { return func(self, other); }, self); -} - -template -Tensor NestedTensor_binary(const Tensor& self_, const Tensor& other_) { - at::Tensor self; - at::Tensor other; - std::tie(self, other) = _expand_other_as(self_, other_); - return autograd_map_nested_tensor( - [](Tensor s, Tensor o) { return func(s, o); }, self, other); -} - -template -Tensor NestedTensor_binary( - const Tensor& self_, - const Tensor& other_, - S scalar) { - at::Tensor self; - at::Tensor other; - std::tie(self, other) = _expand_other_as(self_, other_); - return autograd_map_nested_tensor( - [&scalar](Tensor self, Tensor other) { - return func(self, other, scalar); - }, - self, - other); -} - -template -Tensor& NestedTensor_binary_out( - Tensor& result, - const Tensor& self, - const Tensor& other) { - // at::Tensor self; - // at::Tensor other; - // std::tie(self, other) = _expand_other_as(self_, other_); - TORCH_CHECK( - is_nested_tensor_impl(result), - "NT binary out variant requires NT as result argument."); - TORCH_CHECK( - is_nested_tensor_impl(result, self, other), - "binary_out doesn't support non-NT arguments.") - apply_nested_tensor( - [](Tensor& result, Tensor& tensor, Tensor& other) { - return func(result, tensor, other); - }, - result, - self, - other); - return result; -} - -struct NestedTensorFunction_packed_add - : torch::autograd::Function { - static Tensor forward( - torch::autograd::AutogradContext* ctx, - const Tensor& self, - const Tensor& other, - Scalar alpha) { - ctx->saved_data["0"] = alpha; - return wrap_tensor_node(torch::nested_tensor::impl::build_structure( - at::add(get_buffer(self), get_buffer(other)), - get_nested_tensor_impl(self)->nested_size())); - } - static torch::autograd::variable_list backward( - torch::autograd::AutogradContext* ctx, - // TODO: To prevent double backward (for now) check that grad_output - // doesn't require gradients. - torch::autograd::variable_list grad_output) { - auto alpha = ctx->saved_data["0"].toScalar(); - TORCH_CHECK( - grad_output.size() == 1, - "Expected grad_output of size 1 for packed binary op."); - auto grad = grad_output[0]; - TORCH_CHECK( - !grad.requires_grad(), "addmm does not support double backward."); - at::Tensor undef; - return {grad, maybe_multiply(grad, alpha), undef}; - } -}; - -Tensor NestedTensor_add( - const Tensor& self_, - const Tensor& other_, - Scalar alpha) { - at::Tensor self; - at::Tensor other; - std::tie(self, other) = _expand_other_as(self_, other_); - if (is_packed(self, other) && nested_size_matches(self, other)) { -#ifdef TRACEPACKED - std::cout << "calling packed add" << std::endl; -#endif - return NestedTensorFunction_packed_add::apply(self, other, alpha); - } - return autograd_map_nested_tensor( - [&alpha](at::Tensor s, at::Tensor o) { return at::add(s, o, alpha); }, - self, - other); -} - -Tensor& NestedTensor_add_(Tensor& self, const Tensor& other, Scalar alpha) { - // at::Tensor self; - // at::Tensor other; - // std::tie(self, other) = _expand_other_as(self_, other_); - apply_nested_tensor( - [&](at::Tensor& s, at::Tensor o) { at::native::add_(s, o, alpha); }, - self, - other); - return self; -} - -#define BINARY_OP(NAME) \ - nt_impl(m, #NAME ".Tensor", NestedTensor_binary); \ - nt_impl(m, #NAME ".Scalar", NestedTensor_binary_scalar); \ - nt_impl(m, #NAME "_.Tensor", NestedTensor_binary_); \ - nt_impl(m, #NAME ".out", NestedTensor_binary_out); - -// XXX: We need to disable binary ops below autograd between NT and T, because -// in the backwards pass autograd/engine.cpp uses .sizes() which -// doesn't compare between NTs and Ts. -TORCH_LIBRARY_IMPL(aten, PrivateUse1_PreAutograd, m) { - nt_impl(m, "add.Tensor", NestedTensor_add); - nt_impl(m, "add_.Tensor", NestedTensor_add_); - BINARY_OP(div) - BINARY_OP(mul) - BINARY_OP(remainder) - - // floor_divide has an inconsistent signature - nt_impl(m, "floor_divide", NestedTensor_binary); - nt_impl( - m, - "floor_divide_.Tensor", - NestedTensor_binary_); - nt_impl(m, "floor_divide.out", NestedTensor_binary_out); - - nt_impl(m, "eq.Tensor", NestedTensor_binary); - nt_impl(m, "ne.Tensor", NestedTensor_binary); - nt_impl(m, "eq.Scalar", NestedTensor_binary_scalar); - nt_impl(m, "ne.Scalar", NestedTensor_binary_scalar); - - nt_impl(m, "atan2", NestedTensor_binary); - nt_impl(m, "atan2_", NestedTensor_binary_); - nt_impl(m, "atan2.out", NestedTensor_binary_out); - - nt_impl(m, "sub.Tensor", (NestedTensor_binary)); - nt_impl(m, "pow.Tensor_Tensor", NestedTensor_binary); -} -} // namespace at diff --git a/nestedtensor/csrc/pooling.cpp b/nestedtensor/csrc/pooling.cpp index 809bca6c..f7be11ea 100644 --- a/nestedtensor/csrc/pooling.cpp +++ b/nestedtensor/csrc/pooling.cpp @@ -2,6 +2,7 @@ #include #include #include +#include using namespace torch::nn; namespace F = torch::nn::functional; @@ -11,13 +12,24 @@ namespace at { Tensor NestedTensor_adaptive_avg_pool2d( at::Tensor const& input, IntArrayRef output_size) { - return autograd_map_nested_tensor( + return map_nested_tensor( [&output_size](at::Tensor input) { return at::native::adaptive_avg_pool2d(input, output_size); }, input); } +Tensor NestedTensor_adaptive_avg_pool2d_backward( + const Tensor& gradInput, + const Tensor& input) { + return map_nested_tensor( + [](at::Tensor gradInput, at::Tensor input) { + return at::_adaptive_avg_pool2d_backward(gradInput, input); + }, + gradInput, + input); +} + Tensor NestedTensor_max_pool2d( const Tensor& self, IntArrayRef kernel_size, @@ -25,7 +37,26 @@ Tensor NestedTensor_max_pool2d( IntArrayRef padding, IntArrayRef dilation, bool ceil_mode) { - return autograd_map_nested_tensor( + TORCH_CHECK(get_dim(self) == 4, "Input must be 4 dimensional."); + if (self.dtype() == torch::kFloat16) { + at::Tensor data = to_padded_tensor(self, 0); + at::Tensor result_data = at::max_pool2d(data, + kernel_size, + stride, + padding, + dilation, + ceil_mode); + auto new_sizes = map_efficient_size([&kernel_size, &stride, &padding, &dilation](int64_t* size_ptr, int64_t size) { + size_ptr[1] = ((size_ptr[1] + 2 * padding[0] - dilation[0] * (kernel_size[0] - 1) - 1) / stride[0]) + 1; + size_ptr[2] = ((size_ptr[2] + 2 * padding[1] - dilation[1] * (kernel_size[1] - 1) - 1) / stride[1]) + 1; + }, get_efficient_nested_size(self)); + Tensor result = from_padded_tensor(result_data, new_sizes); + if (get_is_contiguous(self, c10::MemoryFormat::ChannelsLast)) { + return NestedTensor_contiguous(result, c10::MemoryFormat::ChannelsLast); + } + return result; + } + return map_nested_tensor( [&](at::Tensor t) { return at::max_pool2d( t.unsqueeze(0), @@ -39,9 +70,16 @@ Tensor NestedTensor_max_pool2d( self); } -TORCH_LIBRARY_IMPL(aten, AutogradPrivateUse1, m) { - nt_impl(m, "adaptive_avg_pool2d", NestedTensor_adaptive_avg_pool2d); +TORCH_LIBRARY_IMPL(aten, NestedTensor, m) { nt_impl(m, "max_pool2d", NestedTensor_max_pool2d); } +TORCH_LIBRARY_IMPL(aten, NestedTensor, m) { + nt_impl(m, "adaptive_avg_pool2d", NestedTensor_adaptive_avg_pool2d); + nt_impl( + m, + "adaptive_avg_pool2d_backward", + NestedTensor_adaptive_avg_pool2d_backward); +} + } // namespace at diff --git a/nestedtensor/csrc/py_init.cpp b/nestedtensor/csrc/py_init.cpp index da4e6515..3cce0c69 100644 --- a/nestedtensor/csrc/py_init.cpp +++ b/nestedtensor/csrc/py_init.cpp @@ -7,6 +7,7 @@ #include #include #include +#include // NOTE: A NestedTensor without any constituents, i.e. // nested_tensor([]) is of dimension 1 because @@ -37,8 +38,9 @@ at::Tensor get_item(Tensor tensor, int64_t key_) { #if (PYBIND11_VERSION_MAJOR >= 2 && PYBIND11_VERSION_MINOR >= 3) at::Tensor get_item(Tensor tensor, py::slice slice) { size_t start, stop, step, slicelength; - if (!slice.compute(tensor.size(0), &start, &stop, &step, &slicelength)) + if (!slice.compute(nt_size(tensor, 0), &start, &stop, &step, &slicelength)) { throw py::error_already_set(); + } return at::slice(tensor, 0, start, stop, step); } @@ -114,7 +116,7 @@ py::object _nested_helper(c10::optional index, SizeNode&& size_node) { if (s.height() == 1) { std::vector result; for (const auto& child : s.unbind()) { - result.push_back(child.payload().get(dim - 1)); + result.push_back(child.payload()[dim - 1]); } return py::tuple(py::cast(result)); } @@ -127,85 +129,91 @@ py::object _nested_helper(c10::optional index, SizeNode&& size_node) { return fn(fn, size_node, *index); } -namespace torch { -namespace nested_tensor { -namespace { +TORCH_LIBRARY(nestedtensor, m) { + m.def("is_nested_tensor_impl(Tensor tensor) -> bool"); + m.impl("is_nested_tensor_impl", NestedTensorKey, [](Tensor tensor) { + return is_nested_tensor_impl(tensor); + }); + m.impl("is_nested_tensor_impl", c10::DispatchKey::CPU, [](Tensor tensor) { + return is_nested_tensor_impl(tensor); + }); + m.impl("is_nested_tensor_impl", c10::DispatchKey::CUDA, [](Tensor tensor) { + return is_nested_tensor_impl(tensor); + }); -inline std::vector split_str( - std::string s, - std::string delimiter) { - std::vector result; - size_t pos = 0; - std::string token; - while ((pos = s.find(delimiter)) != std::string::npos) { - token = s.substr(0, pos); - result.push_back(token); - s.erase(0, pos + delimiter.length()); - } - result.push_back(s); - return result; -} + m.def("nested_dim(Tensor tensor) -> int"); + m.impl("nested_dim", NestedTensorKey, [](Tensor tensor) { + return get_nested_tensor_impl(tensor)->nested_dim(); + }); -static auto registry = - torch::RegisterOperators() - .op("nestedtensor::is_nested_tensor_impl", - [](Tensor tensor) { return is_nested_tensor_impl(tensor); }) - .op("nestedtensor::nested_dim", - [](Tensor tensor) { - return get_nested_tensor_impl(tensor)->nested_dim(); - }) - .op("nestedtensor::stack", - [](std::vector tensors, int64_t dim) { - return at::stack(TensorList(tensors), dim); - }) - .op("nestedtensor::cat", - [](std::vector tensors, int64_t dim) { - return at::cat(TensorList(tensors), dim); - }) - .op("nestedtensor::to_nested_tensor", - [](Tensor tensor, c10::optional dim) { - return get_nested_tensor_impl(tensor)->to_nested_tensor(dim); - }) - .op("nestedtensor::sizes", - [](Tensor tensor) { - return get_nested_tensor_impl(tensor)->opt_sizes(); - }) - .op("nestedtensor::len", - [](Tensor self) { - return (int64_t)(get_nested_tensor_structure(self).degree()); - }) - .op("nestedtensor::str", [](Tensor tensor) { - auto node = get_nested_tensor_structure(tensor); - return NestedNode___str__( - node, - "nested_tensor", - [](c10::IValue payload, const std::string& tabs) { - std::stringstream ss; - ss << payload; - std::vector tokens = split_str(ss.str(), "\n"); - size_t data_lines = tokens.size() - 1; - std::string result; - size_t max_lines = 3; - size_t i = 0; - for (; i < std::min(max_lines, data_lines); i++) { - result += "\n"; - result += tabs + tokens[i]; - } - if (2 * max_lines < data_lines) { - i = std::max(i, data_lines - max_lines); - result += "\n" + tabs + "..."; - } - for (; i < data_lines; i++) { - result += "\n"; - result += tabs + tokens[i]; - } - result += "\n" + tabs + tokens[data_lines]; - return result; - }); - }); -} // namespace -} // namespace nested_tensor -} // namespace torch + m.def("to_nested_tensor(Tensor tensor, int? dim) -> Tensor"); + m.impl( + "to_nested_tensor", + NestedTensorKey, + [](Tensor tensor, c10::optional dim) { + return NestedTensor_to_nested_tensor(tensor, dim); + }); + m.impl( + "to_nested_tensor", + c10::DispatchKey::CPU, + [](Tensor tensor, c10::optional dim) { + return NestedTensor_to_nested_tensor(tensor, dim); + }); + m.impl( + "to_nested_tensor", + c10::DispatchKey::CUDA, + [](Tensor tensor, c10::optional dim) { + return NestedTensor_to_nested_tensor(tensor, dim); + }); + + m.def("sizes(Tensor tensor) -> int?[]"); + m.impl("sizes", NestedTensorKey, [](Tensor tensor) { + return get_nested_tensor_impl(tensor)->opt_sizes(); + }); + + m.def("len(Tensor self) -> int"); + m.impl("len", NestedTensorKey, [](Tensor self) { + return (int64_t)(get_nested_tensor_structure(self).degree()); + }); + + m.def("get_dim(Tensor self) -> int"); + m.impl("get_dim", NestedTensorKey, [](Tensor self) { return get_dim(self); }); + + m.def("get_numel(Tensor self) -> int"); + m.impl("get_numel", NestedTensorKey, [](Tensor self) { + return get_numel(self); + }); + + m.def("get_is_contiguous(Tensor self, MemoryFormat memory_format) -> bool"); + m.impl("get_is_contiguous", NestedTensorKey, [](Tensor self, c10::MemoryFormat memory_format) { + return get_is_contiguous(self, memory_format); + }); + + m.def("transpose_nhwc_nchw(Tensor self) -> Tensor"); + m.impl("transpose_nhwc_nchw", NestedTensorKey, [](Tensor self) { + return transpose_nhwc_nchw(self); + }); + + m.def("transpose_nchw_nhwc(Tensor self) -> Tensor"); + m.impl("transpose_nchw_nhwc", NestedTensorKey, [](Tensor self) { + return transpose_nchw_nhwc(self); + }); + + m.def("make_contiguous(Tensor self) -> Tensor"); + m.impl("make_contiguous", NestedTensorKey, [](Tensor self) { + return NestedTensor_contiguous(self); + }); + + m.def("to_tensor_list(Tensor tensor) -> Tensor[]"); + m.impl("to_tensor_list", NestedTensorKey, [](Tensor tensor) { + return flatten_nested_tensor(tensor); + }); + + m.def("to_sparse_csr(Tensor tensor) -> Tensor"); + m.impl("to_sparse_csr", NestedTensorKey, [](Tensor tensor) { + return NestedTensor_to_sparse_csr(tensor); + }); +} PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) { register_python_nested_node(m); @@ -238,48 +246,31 @@ PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) { #endif m.def("nested_size", [](Tensor self, c10::optional index_) { - auto nt = get_nested_tensor_impl(self); if (!index_) { return py::cast(THPPythonNode( map( - [](c10::List e) { - std::vector e_vec = e.vec(); + [](std::vector e) { return py::reinterpret_steal( - THPSize_NewFromSizes(e_vec.size(), e_vec.data())); + THPSize_NewFromSizes(e.size(), e.data())); }, - nt->nested_size()), + get_nested_size(self)), "NestedSize")); } - int64_t index = at::maybe_wrap_dim((*index_), nt->dim()); - SizeNode size_node = nt->nested_size(); - return _nested_helper(index, std::move(size_node)); + int64_t index = at::maybe_wrap_dim((*index_), get_dim(self)); + return _nested_helper(index, get_nested_size(self)); }); m.def("nested_stride", [](Tensor self, c10::optional index_) { - auto nt = get_nested_tensor_impl(self); if (!index_) { return py::cast(THPPythonNode( - map([](c10::List e) - -> py::object { return py::tuple(py::cast(e.vec())); }, - nt->nested_stride()), + map([](std::vector e) + -> py::object { return py::tuple(py::cast(e)); }, + get_nested_stride(self)), "NestedStride")); } - int64_t index = at::maybe_wrap_dim((*index_), nt->dim()); - SizeNode size_node = nt->nested_stride(); - return _nested_helper(index, std::move(size_node)); + int64_t index = at::maybe_wrap_dim((*index_), get_dim(self)); + return _nested_helper(index, get_nested_stride(self)); }); - // m.def("_test", []() { - // std::vector ts; - // ts.push_back(torch::rand({1})); - // ts.push_back(torch::rand({2})); - // TensorNode t0_ = TensorNode(ts); - // at::Tensor t0 = wrap_tensor_node(std::move(t0_)); - // at::Tensor t1 = torch::tensor({3}); - // autograd_map_nested_tensor([](at::Tensor s, at::Tensor o) { - // std::cout << "s: " << s << std::endl; - // std::cout << "o: " << o << std::endl;}, t0, t1); - - // }); add_functions(m); } diff --git a/nestedtensor/csrc/py_utils.cpp b/nestedtensor/csrc/py_utils.cpp index c88cbd83..812056f4 100644 --- a/nestedtensor/csrc/py_utils.cpp +++ b/nestedtensor/csrc/py_utils.cpp @@ -6,14 +6,5 @@ namespace nested_tensor { using namespace torch::jit; -c10::optional py_obj_to_ivalue(py::object py_obj) { - auto inferred_type = tryToInferType(py_obj); - if (!inferred_type.success()) { - return c10::nullopt; - } - auto payload = toIValue(py_obj, inferred_type.type()); - return payload; -} - } // namespace nested_tensor } // namespace torch diff --git a/nestedtensor/csrc/py_utils.h b/nestedtensor/csrc/py_utils.h index 6273ed25..3b1e36b0 100644 --- a/nestedtensor/csrc/py_utils.h +++ b/nestedtensor/csrc/py_utils.h @@ -9,8 +9,6 @@ namespace nested_tensor { using TensorNode = NestedNode; using IValueNode = NestedNode; -c10::optional py_obj_to_ivalue(py::object py_obj); - template B wrap_nested_node(NestedNode nested_node) { if (nested_node.is_leaf()) { @@ -27,7 +25,7 @@ B wrap_nested_node(NestedNode nested_node) { template std::string NestedNode___str__( const NestedNode& nested_node, - const std::string name, + const std::string& name, F payload_to_str, const std::string& tabs = "") { std::stringstream result; diff --git a/nestedtensor/csrc/python_functions.cpp b/nestedtensor/csrc/python_functions.cpp index efa1caf7..1033892f 100644 --- a/nestedtensor/csrc/python_functions.cpp +++ b/nestedtensor/csrc/python_functions.cpp @@ -17,7 +17,8 @@ at::Tensor cross_entropy( c10::optional& size_average, // TODO: use c10::optional& ignore_index, c10::optional& reduce, // TODO: use - c10::optional& reduction) { + c10::optional& reduction, + c10::optional label_smoothing) { F::CrossEntropyFuncOptions::reduction_t redct; if (reduction.value() == "mean" || reduction.value() == "none") { redct = torch::kMean; @@ -32,8 +33,11 @@ at::Tensor cross_entropy( if (ignore_index.has_value()) { options = options.ignore_index(ignore_index.value()); } + if (label_smoothing.has_value()) { + options = options.label_smoothing(label_smoothing.value()); + } - return autograd_map_nested_tensor( + return map_nested_tensor( [&, options](at::Tensor input_tensor, at::Tensor target_tensor) { return F::cross_entropy( input_tensor.unsqueeze(0), @@ -77,7 +81,7 @@ at::Tensor interpolate( // Either scale factor or size can be passed if (scale_factor.has_value()) { options = options.scale_factor(scale_factor.value().vec()); - return autograd_map_nested_tensor( + return map_nested_tensor( [&options](at::Tensor input_tensor) { return F::interpolate(input_tensor.unsqueeze(0), options).squeeze(0); }, @@ -85,9 +89,8 @@ at::Tensor interpolate( } // Get input leaves count - auto fn = [](at::Tensor leaf, int64_t input) { return input + 1; }; - auto leaves_count = size_t(reduce( - get_nested_tensor_structure(input), fn, 0)); + auto leaves_count = reduce_nested_tensor( + [](at::Tensor leaf, int64_t input) { return input + 1; }, 0, input); if (size.has_value()) { // There can be either 1 size for all tensor or an individual size value per @@ -98,7 +101,7 @@ at::Tensor interpolate( } if (size.value().size() == 1) { - return autograd_map_nested_tensor( + return map_nested_tensor( [&options, &size](at::Tensor input_tensor) { options = options.size(size.value()[0]); return F::interpolate(input_tensor.unsqueeze(0), options) @@ -107,7 +110,7 @@ at::Tensor interpolate( input); } else { int size_i = 0; - return autograd_map_nested_tensor( + return map_nested_tensor( [&options, &size_i, &size](at::Tensor input_tensor) { options = options.size(size.value()[size_i]); size_i++; @@ -131,11 +134,15 @@ void add_functions(pybind11::module m) { c10::optional> scale_factor, c10::optional mode, c10::optional align_corners, - c10::optional recompute_scale_factor) { + c10::optional recompute_scale_factor, + bool antialias) { if (scale_factor.has_value() && size.has_value()) { throw std::runtime_error( "only one of size or scale_factor should be defined"); } + if (antialias) { + throw std::runtime_error("Antialias is not yet supported"); + } if (size.has_value()) { return interpolate( @@ -151,14 +158,16 @@ void add_functions(pybind11::module m) { align_corners); } - throw "Either size or scale factor have to be passed."; + throw std::runtime_error( + "Either size or scale factor have to be passed."); }, py::arg("input"), py::arg("size") = nullptr, py::arg("scale_factor") = nullptr, py::arg("mode") = "nearest", py::arg("align_corners") = false, - py::arg("recompute_scale_factor") = false); + py::arg("recompute_scale_factor") = false, + py::arg("antialias") = false); m.def( "interpolate", @@ -167,11 +176,15 @@ void add_functions(pybind11::module m) { c10::optional> scale_factor, c10::optional mode, c10::optional align_corners, - c10::optional recompute_scale_factor) { + c10::optional recompute_scale_factor, + bool antialias) { if (scale_factor.has_value() && size.has_value()) { throw std::runtime_error( "only one of size or scale_factor should be defined"); } + if (antialias) { + throw std::runtime_error("Antialias is not yet supported"); + } if (size.has_value()) { std::vector> sizes{size.value()}; @@ -187,14 +200,16 @@ void add_functions(pybind11::module m) { align_corners); } - throw "Either size or scale factor have to be passed."; + throw std::runtime_error( + "Either size or scale factor have to be passed."); }, py::arg("input"), py::arg("size") = nullptr, py::arg("scale_factor") = nullptr, py::arg("mode") = "nearest", py::arg("align_corners") = false, - py::arg("recompute_scale_factor") = false); + py::arg("recompute_scale_factor") = false, + py::arg("antialias") = false); m.def( "interpolate", @@ -203,11 +218,15 @@ void add_functions(pybind11::module m) { c10::optional> scale_factor, c10::optional mode, c10::optional align_corners, - c10::optional recompute_scale_factor) { + c10::optional recompute_scale_factor, + bool antialias) { if (scale_factor.has_value() && size.has_value()) { throw std::runtime_error( "only one of size or scale_factor should be defined"); } + if (antialias) { + throw std::runtime_error("Antialias is not yet supported"); + } if (size.has_value()) { std::vector> sizes{ @@ -225,14 +244,16 @@ void add_functions(pybind11::module m) { align_corners); } - throw "Either size or scale factor have to be passed."; + throw std::runtime_error( + "Either size or scale factor have to be passed."); }, py::arg("input"), py::arg("size") = nullptr, py::arg("scale_factor") = nullptr, py::arg("mode") = "nearest", py::arg("align_corners") = false, - py::arg("recompute_scale_factor") = false); + py::arg("recompute_scale_factor") = false, + py::arg("antialias") = false); m.def( "cross_entropy", @@ -242,7 +263,8 @@ void add_functions(pybind11::module m) { c10::optional size_average, // TODO: use c10::optional ignore_index, c10::optional reduce, // TODO: use - c10::optional reduction) { + c10::optional reduction, + c10::optional label_smoothing) { return cross_entropy( input, target, @@ -250,7 +272,8 @@ void add_functions(pybind11::module m) { size_average, ignore_index, reduce, - reduction); + reduction, + label_smoothing); }, py::arg("input"), py::arg("target"), @@ -258,7 +281,8 @@ void add_functions(pybind11::module m) { py::arg("size_average") = true, py::arg("ignore_index") = -100, py::arg("reduce") = true, - py::arg("reduction") = "mean"); + py::arg("reduction") = "mean", + py::arg("label_smoothing") = 0.0); } } // namespace nested_tensor } // namespace torch diff --git a/nestedtensor/csrc/scripts/binaryops.py b/nestedtensor/csrc/scripts/binaryops.py new file mode 100644 index 00000000..e767eeee --- /dev/null +++ b/nestedtensor/csrc/scripts/binaryops.py @@ -0,0 +1,246 @@ +# NOTES: +# Look at torch/include/ATen/Functions.h for confusing cases (i.e. unexpected argument order) +# TODO: Add pow and scalar other variants. Write templates more compactly. + +HEADER = """# include + +namespace at { + +using namespace torch::nested_tensor; +""" +BINARY_OP_DEFAULT = """ +Tensor NestedTensor_{op}(const Tensor & self_, const Tensor & other_) {{ + Tensor self; + Tensor other; + std::tie(self, other) = _expand_other_as(self_, other_); + return map_nested_tensor( + [](Tensor s, Tensor o) {{ return at::{op}(s, o); }}, self, other); +}} +""" + +BINARY_OP = """ +Tensor NestedTensor_{op}_Tensor(const Tensor & self_, const Tensor & other_) {{ + Tensor self; + Tensor other; + std::tie(self, other) = _expand_other_as(self_, other_); + return map_nested_tensor( + [](Tensor s, Tensor o) {{ return at::{op}(s, o); }}, self, other); +}} +""" +BINARY_OP_SCALAR = """ +Tensor NestedTensor_{op}_Tensor(const Tensor & self_, const Tensor & other_, const Scalar& alpha) {{ + Tensor self; + Tensor other; + std::tie(self, other) = _expand_other_as(self_, other_); + return map_nested_tensor( + [&alpha](Tensor s, Tensor o) {{ return at::{op}(s, o, alpha); }}, self, other); +}} +""" +BINARY_INPLACE_OP = """ +Tensor & NestedTensor_{op}__Tensor(Tensor & self_, const Tensor & other_) {{ + at::Tensor self; + at::Tensor other; + std::tie(self, other) = _expand_other_as(self_, other_); + apply_nested_tensor( + [](Tensor& tensor, const Tensor other) {{ tensor.{op}_(other); return tensor;}}, + self, + other); + return self_; +}} +""" +BINARY_INPLACE_OP_DEFAULT = """ +Tensor & NestedTensor_{op}_(Tensor & self_, const Tensor & other_) {{ + at::Tensor self; + at::Tensor other; + std::tie(self, other) = _expand_other_as(self_, other_); + apply_nested_tensor( + [](Tensor& tensor, const Tensor other) {{ tensor.{op}_(other); return tensor;}}, + self, + other); + return self_; +}} +""" +BINARY_INPLACE_OP_SCALAR = """ +Tensor & NestedTensor_{op}__Tensor(Tensor & self_, const Tensor & other_, const Scalar& alpha) {{ + at::Tensor self; + at::Tensor other; + std::tie(self, other) = _expand_other_as(self_, other_); + apply_nested_tensor( + [&alpha](Tensor& tensor, const Tensor other) {{ tensor.{op}_(other, alpha); return tensor;}}, + self, + other); + return self_; +}} +""" +BINARY_OUT_OP = """ +Tensor & NestedTensor_{op}_out( +const Tensor & self, +const Tensor & other, +Tensor & out) {{ + TORCH_CHECK( + is_nested_tensor_impl(out), + "NT binary out variant requires NT as out argument."); + TORCH_CHECK( + is_nested_tensor_impl(out, self, other), + "binary_out doesn't support non-NT arguments.") + apply_nested_tensor( + [](Tensor& self, Tensor& other, Tensor& out) {{ + return at::{op}_out(self, other, out); + }}, + self, other, out); + return out; +}} +""" +BINARY_OUT_OP_SCALAR = """ +Tensor & NestedTensor_{op}_out( +const Tensor & self, +const Tensor & other, +const Scalar& alpha, +Tensor & out) {{ + TORCH_CHECK( + is_nested_tensor_impl(out), + "NT binary out variant requires NT as out argument."); + TORCH_CHECK( + is_nested_tensor_impl(out, self, other), + "binary_out doesn't support non-NT arguments.") + apply_nested_tensor( + [&alpha](Tensor& self, Tensor& other, Tensor& out) {{ + return at::{op}_out(out, self, other, alpha); + }}, + self, other, out); + return out; +}} +""" +BINARY_SCALAR_OP = """ +Tensor NestedTensor_{op}_Scalar(const Tensor & self, const Scalar & other) {{ +return self; +}} +""" +BINARY_INPLACE_SCALAR_OP = """ +Tensor & NestedTensor_{op}__Scalar(Tensor & self, const Scalar & other) {{ +return self; +}} +""" +BINARY_TEMPLATES = [ + BINARY_OP, + BINARY_INPLACE_OP, + BINARY_OUT_OP, + BINARY_SCALAR_OP, + BINARY_INPLACE_SCALAR_OP +] + +REGISTRATION_HEADER = """ +TORCH_LIBRARY_IMPL(aten, NestedTensor, m) { +""" +REGISTRATION_FOOTER = """ +} +""" + +FOOTER = """ +} // namespace at +""" + + +def print_file(template_map): + print(HEADER, end='') + for k, v in template_map.items(): + print(v) + print(REGISTRATION_HEADER, end='') + for k, v in template_map.items(): + reg = "nt_impl(m, \"" + reg += k + reg += "\", NestedTensor_" + reg += k.replace('.', '_') + reg += ");" + print(reg) + print(REGISTRATION_FOOTER, end='') + print(FOOTER, end='') + + +def parse_registration_declarations(path): + with open(path) as f: + import hashlib + path_hash = hashlib.md5(f.read().encode('utf-8')).hexdigest() + # Based on PT GH master commit hash bd3c63aeeb + if path_hash != "b1200869a8c0b75d7fdb91d6c0f5569b": + raise RuntimeError("RegistrationDeclarations file changed again.") + with open(path) as f: + lines = f.read().split("\n") + ops = [] + for line in lines: + if "//" in line: + declaration, schema_dict = line.split("//") + if declaration.strip() != '': + schema_dict = eval(schema_dict) + schema = schema_dict['schema'] + assert schema[:6] == "aten::" + ops.append((declaration, schema[6:])) + return ops + + +def get_binary_functions(): + return [ + 'add', + 'mul', + 'sub', + 'div', + 'pow', + 'atan2', + 'remainder', + ] + + +TEMPLATE_MAP = { + "mul.Tensor": BINARY_OP, + "mul.Tensor": BINARY_OP, + "mul_.Tensor": BINARY_INPLACE_OP, + "mul.out": BINARY_OUT_OP, + "mul.Scalar": BINARY_SCALAR_OP, + "mul_.Scalar": BINARY_INPLACE_SCALAR_OP +} + + +def create_template_map(ops): + template_map = {} + for op in ops: + op_reg, op_args = op[1].split("(", 1) + op_args = "(" + op_args + variant = None + if "." in op_reg: + op_name, variant = op_reg.split(".", 1) + else: + op_name = op_reg + for b in get_binary_functions(): + if op_name == b: + if variant is None: + template_map[op_reg] = BINARY_OP_DEFAULT.format(op=b) + if variant == "Tensor": + if "Scalar & alpha" in op[0]: + template_map[op_reg] = BINARY_OP_SCALAR.format(op=b) + else: + template_map[op_reg] = BINARY_OP.format(op=b) + if variant == "out": + if "Scalar & alpha" in op[0]: + template_map[op_reg] = BINARY_OUT_OP_SCALAR.format(op=b) + else: + template_map[op_reg] = BINARY_OUT_OP.format(op=b) + if op_name == b + "_": + if variant is None: + template_map[op_reg] = BINARY_INPLACE_OP_DEFAULT.format(op=b) + if variant == "Tensor": + if "Scalar & alpha" in op[0]: + template_map[op_reg] = BINARY_INPLACE_OP_SCALAR.format(op=b) + else: + template_map[op_reg] = BINARY_INPLACE_OP.format(op=b) + return template_map + + +if __name__ == "__main__": + import sys + import os + if not os.path.exists(sys.argv[1]): + raise RuntimeError("Must provide path as argument") + path = os.path.abspath(sys.argv[1]) + ops = parse_registration_declarations(path) + template_map = create_template_map(ops) + print_file(template_map) diff --git a/nestedtensor/csrc/shape.cpp b/nestedtensor/csrc/shape.cpp index 0270403e..d6b42385 100644 --- a/nestedtensor/csrc/shape.cpp +++ b/nestedtensor/csrc/shape.cpp @@ -13,20 +13,15 @@ Tensor NestedTensor_view(const Tensor& self, IntArrayRef size) { TORCH_CHECK( int64_t(size.size()) > self_data->nested_dim(), "view cannot be exclusive to nested dimensions."); - for (int64_t i = 0; i < self_data->nested_dim(); i++) { - if (size[i] >= 0) { - throw std::runtime_error( - "Cannot view explicitly along irregular dimension " + - std::to_string(i) + ". Please use -1 as a placeholder."); - } - } + auto self_opt_sizes = get_opt_sizes(self); + TORCH_CHECK(*self_opt_sizes[0] == size[0], "First dimension must be unchanged."); int64_t nested_dim = self_data->nested_dim(); std::vector target_shape; for (int64_t i = nested_dim; i < int64_t(size.size()); i++) { target_shape.push_back(size[i]); } // TODO: Potential use for packed view, but requires custom backward. - return autograd_map_nested_tensor( + return map_nested_tensor( [target_shape](const at::Tensor t) { return at::native::view(t, IntArrayRef(target_shape)); }, @@ -38,20 +33,15 @@ Tensor NestedTensor_reshape(const Tensor& self, IntArrayRef size) { TORCH_CHECK( int64_t(size.size()) > self_data->nested_dim(), "Reshape cannot be exclusive to nested dimensions."); - for (int64_t i = 0; i < self_data->nested_dim(); i++) { - if (size[i] >= 0) { - throw std::runtime_error( - "Cannot reshape explicitly along irregular dimension " + - std::to_string(i) + ". Please use -1 as a placeholder."); - } - } + auto self_opt_sizes = get_opt_sizes(self); + TORCH_CHECK(*self_opt_sizes[0] == size[0], "First dimension must be unchanged."); int64_t nested_dim = self_data->nested_dim(); std::vector target_shape; for (int64_t i = nested_dim; i < int64_t(size.size()); i++) { target_shape.push_back(size[i]); } // TODO: Potential use for packed reshape, but requires custom backward. - return autograd_map_nested_tensor( + return map_nested_tensor( [target_shape](const at::Tensor t) { return at::reshape(t, IntArrayRef(target_shape)); }, @@ -60,25 +50,39 @@ Tensor NestedTensor_reshape(const Tensor& self, IntArrayRef size) { Tensor NestedTensor_transpose(const Tensor& self, int64_t dim0, int64_t dim1) { auto self_data = get_nested_tensor_impl(self); - auto ndims = self.dim(); + auto ndims = get_dim(self); dim0 = maybe_wrap_dim(dim0, ndims); dim1 = maybe_wrap_dim(dim1, ndims); if (dim0 == dim1) { return self; } - int64_t nested_dim = self_data->nested_dim(); + int64_t nested_dim = get_nested_dim(self); + TORCH_CHECK(nested_dim == 1, "transpose expected nested dim 1."); TORCH_CHECK( dim0 >= nested_dim && dim1 >= nested_dim, "Transposition of nested dimensions is not implemented yet."); - // TODO: Potential use for packed transpose, but requires custom backward. - return autograd_map_nested_tensor( - [dim0, dim1, nested_dim](const at::Tensor t) { - return at::transpose(t, dim0 - nested_dim, dim1 - nested_dim); + EfficientSizeNode ef_sizes = get_efficient_nested_size(self); + EfficientSizeNode ef_strides = get_efficient_nested_stride(self); + auto new_ef_sizes = map_efficient_size( + [dim0, dim1, nested_dim](int64_t* size_ptr, int64_t size) { + int64_t tmp = size_ptr[dim0 - nested_dim]; + size_ptr[dim0 - nested_dim] = size_ptr[dim1 - nested_dim]; + size_ptr[dim1 - nested_dim] = tmp; }, - self); + ef_sizes); + auto new_ef_strides = map_efficient_size( + [dim0, dim1, nested_dim](int64_t* size_ptr, int64_t size) { + int64_t tmp = size_ptr[dim0 - nested_dim]; + size_ptr[dim0 - nested_dim] = size_ptr[dim1 - nested_dim]; + size_ptr[dim1 - nested_dim] = tmp; + }, + ef_strides); + return wrap_buffer(get_buffer(self), + new_ef_sizes, + new_ef_strides); } -TORCH_LIBRARY_IMPL(aten, AutogradPrivateUse1, m) { +TORCH_LIBRARY_IMPL(aten, NestedTensor, m) { nt_impl(m, "reshape", NestedTensor_reshape); nt_impl(m, "view", NestedTensor_view); nt_impl(m, "transpose.int", NestedTensor_transpose); diff --git a/nestedtensor/csrc/storage/EfficientSizeNode.h b/nestedtensor/csrc/storage/EfficientSizeNode.h new file mode 100644 index 00000000..9c5be06f --- /dev/null +++ b/nestedtensor/csrc/storage/EfficientSizeNode.h @@ -0,0 +1,221 @@ +#pragma once +#include + +namespace torch { +namespace nested_tensor { + +namespace impl { +inline at::Tensor stack_sizes(SizeNode size_node) { + TORCH_CHECK(size_node.height() == 1, "stack_sizes: Expected height equals 1."); + if (size_node.degree() == 0) { + return torch::zeros({}, torch::kInt64); + } + std::vector unbound_size_node = size_node.unbind(); + std::vector result_sizes_vector; + for(int64_t i = 0; i < unbound_size_node.size(); i++) { + std::vector sizes = unbound_size_node[i].payload(); + if(i == 0) { + result_sizes_vector.reserve(size_node.degree() * sizes.size()); + } + for (size_t j = 0; j < sizes.size(); j++) { + result_sizes_vector.push_back(sizes[j]); + } + } + return torch::tensor(result_sizes_vector, torch::kInt64).reshape({static_cast(size_node.degree()), -1}); +} + +inline std::vector> construct_efficient_size( + int64_t out, + const at::Tensor& sizes) { + std::vector> result; + result.push_back(out); + size_t nested_dim = result.size(); + if (sizes.dim() > 0) { + int64_t* sizes_ptr = sizes.data_ptr(); + result.resize(nested_dim + sizes.size(1)); + for (int64_t i = 0; i < sizes.size(1); i++) { + result[nested_dim + i] = sizes_ptr[i]; + } + for (int64_t j = 0; j < sizes.size(1); j++) { + for (int64_t i = 0; i < sizes.size(0); i++) { + if (result[nested_dim + j] && + (result[nested_dim + j] != sizes_ptr[i * sizes.size(1) + j])) { + result[nested_dim + j] = c10::nullopt; + } + } + } + } + return result; +} + +} // namespace impl + +struct EfficientSizeNode { + explicit EfficientSizeNode(const SizeNode& size_node) + : _structure(size_node.degree()), + _sizes(impl::stack_sizes(size_node)), + _opt_sizes(impl::construct_efficient_size(_structure, _sizes)) + {} + + explicit EfficientSizeNode( + int64_t structure, + const at::Tensor& sizes) + : _structure(structure), + _sizes(sizes), + _opt_sizes(impl::construct_efficient_size(_structure, _sizes)) + {} + + SizeNode to_size_node() const { + std::vector> _tmp_sizes; + if (_sizes.dim() > 0) { + _tmp_sizes.resize(_sizes.size(0)); + int64_t* _sizes_ptr = _sizes.data_ptr(); + for (int64_t i = 0; i < _sizes.size(0); i++) { + _tmp_sizes[i].resize(_sizes.size(1)); + for (int64_t j = 0; j < _sizes.size(1); j++) { + _tmp_sizes[i][j] = _sizes_ptr[i * _sizes.size(1) + j]; + } + } + } + std::vector _tmp_size_nodes; + for (int64_t i = 0; i < _structure; i++) { + _tmp_size_nodes.push_back(SizeNode(std::move(_tmp_sizes[i]))); + } + return SizeNode(std::move(_tmp_size_nodes)); + } + int64_t height() const { + return 1; + } + int64_t degree() const { + if (_sizes.dim() == 0) { + return 0; + } + return _sizes.size(0); + } + int64_t dim() const { + return _sizes.dim() > 0 ? 1 + _sizes.size(1) : 1; + } + const std::vector>& opt_sizes() const { + return _opt_sizes; + } + void refresh_opt_sizes() { + _opt_sizes = impl::construct_efficient_size(_structure, _sizes); + } + const at::Tensor& sizes() const { + return _sizes; + } + const int64_t structure() const { + return _structure; + } + EfficientSizeNode clone() const { + return EfficientSizeNode(_structure, _sizes.clone()); + } + int64_t numel() const { + if (_sizes.dim() == 0 && _structure > 0) { + return _structure; + } + if (_sizes.dim() > 0) { + if (_sizes.numel() == 0) { + return 0; + } + Tensor nt_sizes = at::native::narrow( + _sizes, 1 /* dim */, 0 /* start */, 1 /* length */); + for (int64_t i = 1; i < _sizes.size(1); i++) { + Tensor tmp = at::native::narrow( + _sizes, 1 /* dim */, i /* start */, 1 /* length */); + nt_sizes = nt_sizes * tmp; + } + return nt_sizes.sum().item(); + } + return 0; + } + + private: + int64_t _structure; + const at::Tensor _sizes; + bool _opt_sizes_set = false; + std::vector> _opt_sizes; +}; + +inline bool efficient_size_structure_matches( + const EfficientSizeNode& size_node0, + const EfficientSizeNode& size_node1) { + return size_node0.structure() == size_node1.structure(); +} + +inline bool efficient_size_matches( + const EfficientSizeNode& size_node0, + const EfficientSizeNode& size_node1) { + if (!efficient_size_structure_matches(size_node0, size_node1)) { + return false; + } + at::Tensor sizes0 = size_node0.sizes(); + at::Tensor sizes1 = size_node1.sizes(); + return at::equal(sizes0, sizes1); +} + +template +inline EfficientSizeNode map_efficient_size( + F&& fn, + const EfficientSizeNode& size_node) { + at::Tensor sizes = size_node.sizes().clone(); + if (sizes.dim() == 0) { + return EfficientSizeNode(size_node.structure(), sizes); + } + int64_t* sizes_ptr = sizes.data_ptr(); + for (int64_t i = 0; i < sizes.size(0); i++) { + fn(sizes_ptr + i * sizes.size(1), sizes.size(1)); + } + return EfficientSizeNode(size_node.structure(), sizes); +} + +template +inline EfficientSizeNode map_efficient_size( + F&& fn, + const EfficientSizeNode& size_node0, + const EfficientSizeNode& size_node1) { + TORCH_CHECK( + efficient_size_structure_matches(size_node0, size_node1), + "map_efficient_size: Length doesn't match."); + at::Tensor sizes0 = size_node0.sizes().clone(); + at::Tensor sizes1 = size_node1.sizes().clone(); + TORCH_CHECK(sizes0.dim() == sizes1.dim(), "Sizes need to match in dim."); + if (sizes0.dim() == 0) { + return EfficientSizeNode(size_node0.structure(), sizes0); + } + TORCH_CHECK(sizes0.size(0) == sizes1.size(0), "Sizes need to match in size(0)."); + TORCH_CHECK(sizes0.size(1) == sizes1.size(1), "Sizes need to match in size(1)."); + int64_t* sizes_ptr0 = sizes0.data_ptr(); + int64_t* sizes_ptr1 = sizes1.data_ptr(); + for (int64_t i = 0; i < sizes0.size(0); i++) { + fn(sizes_ptr0 + i * sizes0.size(1), sizes_ptr1 + i * sizes1.size(1), sizes0.size(1)); + } + return EfficientSizeNode(size_node0.structure(), sizes0); +} + +template +inline void apply_efficient_size( + F&& fn, + EfficientSizeNode& size_node0, + EfficientSizeNode& size_node1) { + at::Tensor sizes0 = size_node0.sizes(); + at::Tensor sizes1 = size_node1.sizes(); + int64_t* sizes0_ptr = sizes0.data_ptr(); + int64_t* sizes1_ptr = sizes1.data_ptr(); + int64_t structure0 = size_node0.structure(); + int64_t structure1 = size_node1.structure(); + TORCH_CHECK( + efficient_size_structure_matches(size_node0, size_node1), + "apply_efficient_size: Length doesn't match."); + for (int64_t i = 0; i < sizes0.size(0); i++) { + fn(sizes0_ptr + i * sizes0.size(1), + sizes0.size(1), + sizes1_ptr + i * sizes1.size(1), + sizes1.size(1)); + } + size_node0.refresh_opt_sizes(); + size_node1.refresh_opt_sizes(); +} + +} // namespace nested_tensor +} // namespace torch diff --git a/nestedtensor/csrc/storage/Packed.h b/nestedtensor/csrc/storage/Packed.h new file mode 100644 index 00000000..04a5b6f6 --- /dev/null +++ b/nestedtensor/csrc/storage/Packed.h @@ -0,0 +1,164 @@ +#pragma once +#include +#include +#include + +namespace torch { +namespace nested_tensor { +namespace impl { + +inline EfficientSizeNode _cont_stride(const EfficientSizeNode& nested_size) { + auto nested_stride = map_efficient_size( + [](int64_t* size_ptr, int64_t size) { + auto cont_stride = _cont_stride(size_ptr, size); + for (int64_t i = 0; i < size; i++) { + size_ptr[i] = cont_stride[i]; + } + }, nested_size); + return nested_stride; +} + +inline std::tuple build_structure( + const at::Tensor& buffer, + const EfficientSizeNode& nested_size_, + const EfficientSizeNode& nested_stride_) { + TORCH_CHECK( + buffer.dim() == 1, "Given buffer must be vector, i.e. dim 1 Tensor."); + std::vector split_sizes; + split_sizes.reserve(nested_size_.degree()); + map_efficient_size([&split_sizes] (int64_t* sizes_ptr0, int64_t* sizes_ptr1, int64_t size) { + split_sizes.push_back(num_memory(sizes_ptr0, sizes_ptr1, size)); + }, nested_size_, nested_stride_); + std::vector nonzero_split_sizes; + for (size_t i = 0; i < split_sizes.size(); i++) { + if (split_sizes[i] > 0) { + nonzero_split_sizes.push_back(split_sizes[i]); + } + } + std::vector buffers_; + if (nonzero_split_sizes.size() > 0) { + buffers_ = + at::split_with_sizes(buffer, c10::IntArrayRef(nonzero_split_sizes), 0); + } + std::vector buffers; + int64_t index = 0; + for (size_t i = 0; i < split_sizes.size(); i++) { + if (split_sizes[i] > 0) { + buffers.push_back(buffers_[index]); + index++; + } else { + buffers.push_back(at::empty({}, buffer.options())); + } + } + std::vector result_tensors; + index = 0; + map_efficient_size([&buffers, &result_tensors, &index]( + int64_t* size_ptr, int64_t* stride_ptr, int64_t size) { + std::vector sizes(size_ptr, size_ptr + size); + std::vector strides(stride_ptr, stride_ptr + size); + result_tensors.push_back(TensorNode(at::as_strided( + buffers[index], c10::IntArrayRef(sizes), c10::IntArrayRef(strides)))); + index++; + }, nested_size_, nested_stride_); + return std::make_tuple(TensorNode(std::move(result_tensors)), buffer); +} + +inline std::tuple build_structure( + const at::Tensor& buffer, + const EfficientSizeNode& nested_size) { + TORCH_CHECK( + buffer.dim() == 1, "Given buffer must be vector, i.e. dim 1 Tensor."); + EfficientSizeNode nested_stride = _cont_stride(nested_size); + return build_structure(buffer, nested_size, nested_stride); +} + +inline at::Tensor pack(const TensorNode& structure) { + TORCH_CHECK(structure.height() == 1, "Expected structure of height 1, got ", structure.height(), " instead."); + if (structure.degree() == 0) { + return at::ones({0}); + } + auto tensor_nodes = structure.unbind(); + std::vector tensors; + tensors.resize(structure.degree()); + int64_t full_numel = 0; + for (size_t i = 0; i < tensors.size(); i++) { + tensors[i] = tensor_nodes[i].payload(); + full_numel = full_numel + tensors[i].numel(); + } + at::Tensor result_buffer = empty({full_numel}, tensors[0].options()); + int64_t index = 0; + for (size_t i = 0; i < tensors.size(); i++) { + at::Tensor narrowed_result_buffer = + result_buffer.narrow(0, index, tensors[i].numel()); + narrowed_result_buffer = narrowed_result_buffer.reshape(tensors[i].sizes()); + narrowed_result_buffer.copy_(tensors[i], true); + index = index + tensors[i].numel(); + } + return result_buffer; +} + +inline bool storage_is_contiguous( + const at::Tensor& buffer, + const EfficientSizeNode& nested_size, + const EfficientSizeNode& nested_stride) { + if (!buffer.is_contiguous()) { + return false; + } + if (buffer.numel() == 0) { + return true; + } + const at::Tensor& sizes_sizes = nested_size.sizes(); + const at::Tensor& strides_sizes = nested_stride.sizes(); + int64_t* sizes_sizes_ptr = sizes_sizes.data_ptr(); + int64_t* strides_sizes_ptr = strides_sizes.data_ptr(); + for (int64_t i = 0; i < sizes_sizes.size(0); i++) { + if (!_is_cont_stride( + sizes_sizes_ptr + i * sizes_sizes.size(1), + strides_sizes_ptr + i * strides_sizes.size(1), + sizes_sizes.size(1))) { + return false; + } + } + return true; +} + +inline bool storage_is_contiguous_channels_last( + const at::Tensor& buffer, + const EfficientSizeNode& nested_size, + const EfficientSizeNode& nested_stride) { + if (!buffer.is_contiguous()) { + return false; + } + if (buffer.numel() == 0) { + return true; + } + if (nested_size.dim() != 4) { + return false; + } + const at::Tensor& sizes_sizes = nested_size.sizes(); + const at::Tensor& strides_sizes = nested_stride.sizes(); + int64_t* sizes_sizes_ptr = sizes_sizes.data_ptr(); + int64_t* strides_sizes_ptr = strides_sizes.data_ptr(); + std::vector sizes(4, 0); + std::vector strides(4, 0); + for (int64_t i = 0; i < sizes_sizes.size(0); i++) { + sizes[0] = 1; + sizes[1] = sizes_sizes_ptr[i * 3 + 0]; + sizes[2] = sizes_sizes_ptr[i * 3 + 1]; + sizes[3] = sizes_sizes_ptr[i * 3 + 2]; + strides[0] = sizes_sizes_ptr[i * 3 + 0] * + sizes_sizes_ptr[i * 3 + 1] * + sizes_sizes_ptr[i * 3 + 2]; + strides[1] = strides_sizes_ptr[i * 3 + 0]; + strides[2] = strides_sizes_ptr[i * 3 + 1]; + strides[3] = strides_sizes_ptr[i * 3 + 2]; + if (!c10::is_channels_last_strides_2d(IntArrayRef(sizes), IntArrayRef(strides))) { + return false; + } + } + return true; +} + +} // namespace impl +} // namespace nested_tensor +} // namespace torch diff --git a/nestedtensor/csrc/storage/common.h b/nestedtensor/csrc/storage/common.h new file mode 100644 index 00000000..8a762217 --- /dev/null +++ b/nestedtensor/csrc/storage/common.h @@ -0,0 +1,39 @@ +#pragma once +#include +#include +#include + +namespace torch { +namespace nested_tensor { + +inline std::vector> construct_size( + const SizeNode& size_node) { + if (size_node.is_leaf()) { + std::vector> result; + for (const auto& size : size_node.payload()) { + result.push_back(size); + } + return result; + } + std::vector> result; + result.push_back(size_node.degree()); + + if (size_node.degree() > 0) { + for (const auto& size : construct_size(size_node.children(0))) { + result.push_back(size); + } + for (size_t i = 1; i < size_node.degree(); i++) { + auto size_node_i = construct_size(size_node.children(i)); + for (size_t j = 1; j < result.size(); j++) { + if (result[j] && ((*result[j]) != size_node_i[j - 1])) { + result[j] = c10::nullopt; + } + } + } + } + + return result; +} + +} // namespace nested_tensor +} // namespace torch diff --git a/nestedtensor/csrc/totensor.cpp b/nestedtensor/csrc/totensor.cpp index 1391de65..1c14109a 100644 --- a/nestedtensor/csrc/totensor.cpp +++ b/nestedtensor/csrc/totensor.cpp @@ -43,48 +43,26 @@ at::Tensor to_tensor(NestedTensorImpl* nt_impl) { return _to_tensor(nt_impl->get_structure()); } -struct NestedTensorFunction_to_tensor - : public torch::autograd::Function { - static Tensor forward( - torch::autograd::AutogradContext* ctx, - const Tensor& input) { - // TODO: Not necessarily a view because of stack and reshape. - std::vector new_size; - auto impl_data = get_nested_tensor_impl(input); - for (const auto& si : impl_data->opt_sizes()) { - if (!si) { - // TODO: This assumes we'll extend to_tensor to also work with int64_t - // at this level. - throw std::out_of_range( - "to_tensor()/to_tensor(0) only works if there is no None in size()."); - } - new_size.push_back(*si); - } - ctx->save_for_backward({input}); - return _to_tensor(impl_data->get_structure()); - } - static torch::autograd::variable_list backward( - torch::autograd::AutogradContext* ctx, - torch::autograd::variable_list grad_output_) { - TORCH_CHECK(grad_output_.size() == 1, "grad_output must be of size 1."); - auto saved = ctx->get_saved_variables(); - at::Tensor input = saved[0]; - at::Tensor grad_output = grad_output_[0]; - return {wrap_tensor_node(torch::nested_tensor::impl::build_structure( - std::move(grad_output.clone().reshape({-1})), - get_nested_tensor_impl(input)->nested_size()))}; - } -}; - Tensor NestedTensor_to_tensor(Tensor tensor, c10::optional dim_) { if (!dim_) { - return NestedTensorFunction_to_tensor::apply(tensor); + return NestedTensor_to_tensor(tensor, 0); + } + int64_t dim = maybe_wrap_dim((*dim_), get_dim(tensor)); + if (dim != 0) { + TORCH_CHECK(false, "Non-zero dimension ", *dim_, " is currently not supported."); } - int64_t dim = maybe_wrap_dim((*dim_), tensor.dim()); - if (dim == 0) { - return NestedTensorFunction_to_tensor::apply(tensor); + std::vector new_size; + auto impl_data = get_nested_tensor_impl(tensor); + for (const auto& si : impl_data->opt_sizes()) { + if (!si) { + // TODO: This assumes we'll extend to_tensor to also work with int64_t + // at this level. + throw std::out_of_range( + "to_tensor()/to_tensor(0) only works if there is no None in size()."); + } + new_size.push_back(*si); } - TORCH_CHECK(false, "Non-zero dimension ", *dim_, " is currently not supported."); + return _to_tensor(impl_data->get_structure()); // // If dim is bigger than nested_dim the NestedTensor is already // // of Tensor for dimensions bigger than the given. // if (impl_data->nested_dim() == 1) { @@ -109,10 +87,16 @@ Tensor NestedTensor_to_tensor(Tensor tensor, c10::optional dim_) { // return wrap_tensor_node(TensorNode(std::move(result))); } -static auto registry = torch::RegisterOperators().op( - "nestedtensor::to_tensor", - [](Tensor tensor, c10::optional dim) { - return NestedTensor_to_tensor(tensor, dim); - }); +TORCH_LIBRARY_FRAGMENT(nestedtensor, m) { + m.def("to_tensor(Tensor tensor, int? dim) -> Tensor"); + m.impl("to_tensor", NestedTensorKey, + [](Tensor tensor, c10::optional dim) { + return NestedTensor_to_tensor(tensor, dim); + }); + m.impl("to_tensor", c10::DispatchKey::CPU, + [](Tensor tensor, c10::optional dim) { + return NestedTensor_to_tensor(tensor, dim); + }); +} } // namespace at diff --git a/nestedtensor/csrc/transpose.cpp b/nestedtensor/csrc/transpose.cpp new file mode 100644 index 00000000..41cc3cf8 --- /dev/null +++ b/nestedtensor/csrc/transpose.cpp @@ -0,0 +1,204 @@ +#include +#include +#include +#include +#ifdef WITH_CUDA +#include +#include +#include +#include +#endif +#include + +using namespace torch::nn; +namespace F = torch::nn::functional; + +namespace at { + +Tensor _collapse_two_dims(Tensor input, int64_t dim1, int64_t dim2) { + TORCH_CHECK(dim1 > 0, "dim1: Cannot collapse dim 0."); + TORCH_CHECK(dim2 > 0, "dim2: Cannot collapse dim 0."); + TORCH_CHECK(dim2 - 1 == dim1, "dim2 must be one more than dim1.") + TORCH_CHECK(dim1 == 1 || dim1 == 2, "dim1 must be 1 or 2.") + TORCH_CHECK(get_dim(input) == 4, "Expected input to be 4 dim."); + auto input_esizes = get_efficient_nested_size(input); + Tensor nt_sizes = input_esizes.sizes(); + + Tensor sizes_dim1 = at::native::narrow(nt_sizes, 1, 0, 1).contiguous(); + Tensor sizes_dim2 = at::native::narrow(nt_sizes, 1, 1, 1).contiguous(); + Tensor sizes_dim3 = at::native::narrow(nt_sizes, 1, 2, 1).contiguous(); + + Tensor new_nt_sizes; + if (dim1 == 1) { + Tensor collapsed_sizes = sizes_dim1 * sizes_dim2; + new_nt_sizes = at::cat({collapsed_sizes, sizes_dim3}, 1); + } else if (dim1 == 2) { + Tensor collapsed_sizes = sizes_dim2 * sizes_dim3; + new_nt_sizes = at::cat({sizes_dim1, collapsed_sizes}, 1); + } + auto new_esizes = torch::nested_tensor::EfficientSizeNode(input_esizes.structure(), new_nt_sizes); + Tensor result = wrap_buffer(get_buffer(input), new_esizes); + TORCH_CHECK(get_dim(result) == 3, "Expected result to be 3 dimensional."); + return result; + +} + +template +std::tuple _create_offsets(Tensor input) { + TORCH_CHECK(get_dim(input) == 3, "Expected input to be 3 dimensional."); + Tensor nt_sizes = get_efficient_nested_size(input).sizes(); + int64_t* nt_sizes_ptr = nt_sizes.data_ptr(); + int64_t batch_size = nt_sizes.size(0); + at::Tensor offsets = torch::empty({1 + batch_size}, torch::kInt32); + at::Tensor block_offsets = torch::empty({1 + batch_size}, torch::kInt32); + int* offsets_ptr = offsets.data_ptr(); + int* block_offsets_ptr = block_offsets.data_ptr(); + offsets_ptr[0] = 0; + block_offsets_ptr[0] = 0; + int64_t index = 1; + for (int64_t i = 0; i < batch_size; i++) { + int64_t size1 = nt_sizes_ptr[i * 2 + 0]; + int64_t size2 = nt_sizes_ptr[i * 2 + 1]; + const int num_chunks_1 = (size1 + grain_size - 1) / grain_size; + const int num_chunks_2 = (size2 + grain_size - 1) / grain_size; + offsets_ptr[index] = offsets_ptr[index - 1] + (int)(size1 * size2); + block_offsets_ptr[index] = block_offsets_ptr[index - 1] + num_chunks_1 * num_chunks_2; + index++; + } + return std::make_tuple(offsets, block_offsets); +} + +std::vector _transfer_metadata(std::vector meta_tensors) { + for (size_t i = 0; i < meta_tensors.size(); i++) { + meta_tensors[i] = meta_tensors[i].view(-1); + } + at::Tensor all_meta = at::cat(meta_tensors); + all_meta = all_meta.to(at::Device(kCUDA), torch::kInt32, true, true); + std::vector result_meta_tensors; + int64_t index = 0; + for (size_t i = 0; i < meta_tensors.size(); i++) { + Tensor result_slice = all_meta.narrow(0, index, meta_tensors[i].numel()); + index += meta_tensors[i].numel(); + result_meta_tensors.push_back(result_slice); + } + return result_meta_tensors; +} + +template +Tensor _transpose_nchw_nhwc(Tensor input, Tensor output) { +#ifdef WITH_CUDA + Tensor collapsed_input = _collapse_two_dims(input, 2, 3); + Tensor nt_sizes = get_efficient_nested_size(collapsed_input).sizes(); + Tensor sizes_dim2 = at::native::narrow(nt_sizes, 1, 0, 1).contiguous(); + Tensor sizes_dim3 = at::native::narrow(nt_sizes, 1, 1, 1).contiguous(); + Tensor offsets; + Tensor block_offsets; + std::tie(offsets, block_offsets) = _create_offsets<32>(collapsed_input); + at::cuda::CUDAStream defaultStream = at::cuda::getDefaultCUDAStream(); + Tensor input_buffer = get_buffer(input); + Tensor output_buffer = get_buffer(output); + TORCH_CHECK(input_buffer.is_cuda(), "Expected input_buffer to be CUDA."); + TORCH_CHECK(output_buffer.is_cuda(), "Expected output_buffer to be CUDA."); + int* block_offsets_ptr = block_offsets.data_ptr(); + int batch_size = sizes_dim2.numel(); + int block_numel = block_offsets_ptr[batch_size]; + auto result_meta_tensors = _transfer_metadata({offsets, + block_offsets}); + nested_tensor::cuda::transpose_nchw_nhwc_kernelLauncher( + input_buffer.data_ptr(), + output_buffer.data_ptr(), + result_meta_tensors[1].data_ptr(), // block_offsets + result_meta_tensors[0].data_ptr(), // offsets + batch_size, + block_numel, + sizes_dim2[0].item(), + defaultStream + ); +#endif + return output; +} + +Tensor transpose_nchw_nhwc(Tensor input) { + TORCH_CHECK(get_dim(input) == 4, "transpose_nchw_nhwc needs 4d input."); + TORCH_CHECK(get_is_contiguous(input), "transpose_nchw_nhwc input needs to be contiguous."); + auto input_opt_sizes = get_opt_sizes(input); + TORCH_CHECK(input_opt_sizes[1], "Expected first dimension to be regular."); + Tensor input_buffer = get_buffer(input); + auto new_sizes = map_efficient_size([](int64_t* size_ptr, int64_t size) { + int64_t tmp = size_ptr[0]; + size_ptr[0] = size_ptr[2]; + size_ptr[2] = tmp; + tmp = size_ptr[0]; + size_ptr[0] = size_ptr[1]; + size_ptr[1] = tmp; + }, get_efficient_nested_size(input)); + Tensor output = wrap_buffer(at::empty_like(input_buffer), new_sizes); + if (get_dtype(input) == torch::kFloat16) { + return _transpose_nchw_nhwc(input, output); + } + if (get_dtype(input) == torch::kFloat) { + return _transpose_nchw_nhwc(input, output); + } + TORCH_CHECK(false, "Given dtype ", get_dtype(input), " not supported."); +} + +template +Tensor _transpose_nhwc_nchw(Tensor input, Tensor output) { +#ifdef WITH_CUDA + Tensor collapsed_input = _collapse_two_dims(input, 1, 2); + Tensor nt_sizes = get_efficient_nested_size(collapsed_input).sizes(); + Tensor sizes_dim2 = at::native::narrow(nt_sizes, 1, 0, 1).contiguous(); + Tensor sizes_dim3 = at::native::narrow(nt_sizes, 1, 1, 1).contiguous(); + Tensor offsets; + Tensor block_offsets; + std::tie(offsets, block_offsets) = _create_offsets<32>(collapsed_input); + at::cuda::CUDAStream defaultStream = at::cuda::getDefaultCUDAStream(); + Tensor input_buffer = get_buffer(input); + Tensor output_buffer = get_buffer(output); + int* block_offsets_ptr = block_offsets.data_ptr(); + int batch_size = sizes_dim3.numel(); + int block_numel = block_offsets_ptr[batch_size]; + auto result_meta_tensors = _transfer_metadata({offsets, + block_offsets}); + nested_tensor::cuda::transpose_nhwc_nchw_kernelLauncher( + input_buffer.data_ptr(), + output_buffer.data_ptr(), + result_meta_tensors[1].data_ptr(), // block_offsets + result_meta_tensors[0].data_ptr(), // offsets + batch_size, + block_numel, + sizes_dim3[0].item(), + defaultStream + ); +#endif + return output; +} + +Tensor transpose_nhwc_nchw(Tensor input) { + TORCH_CHECK(get_dim(input) == 4, "transpose_nhwc_nchw needs 4d input."); + TORCH_CHECK(get_is_contiguous(input), "transpose_nhwc_nchw input needs to be contiguous."); + auto input_opt_sizes = get_opt_sizes(input); + TORCH_CHECK(input_opt_sizes[3], "Expected last dimension to be regular."); + Tensor input_buffer = get_buffer(input); + auto new_sizes = map_efficient_size([](int64_t* size_ptr, int64_t size) { + // nhwc + int64_t tmp = size_ptr[0]; + size_ptr[0] = size_ptr[2]; + size_ptr[2] = tmp; + // ncwh + tmp = size_ptr[1]; + size_ptr[1] = size_ptr[2]; + size_ptr[2] = tmp; + // nchw + }, get_efficient_nested_size(input)); + Tensor output = wrap_buffer(at::empty_like(input_buffer), new_sizes); + if (get_dtype(input) == torch::kFloat16) { + return _transpose_nhwc_nchw(input, output); + } + if (get_dtype(input) == torch::kFloat) { + return _transpose_nhwc_nchw(input, output); + } + TORCH_CHECK(false, "Given dtype ", get_dtype(input), " not supported."); +} + +} diff --git a/nestedtensor/csrc/transpose.h b/nestedtensor/csrc/transpose.h new file mode 100644 index 00000000..4be7c52c --- /dev/null +++ b/nestedtensor/csrc/transpose.h @@ -0,0 +1,16 @@ +#include +#include +#include + +namespace at { + +Tensor transpose_buffer( + Tensor nt_sizes_, + Tensor input_buffer, + Tensor output_buffer); + +Tensor transpose_nhwc_nchw(Tensor input); + +Tensor transpose_nchw_nhwc(Tensor input); + +} diff --git a/nestedtensor/csrc/utils/nested_node.h b/nestedtensor/csrc/utils/nested_node.h index b0fb4f14..89c47375 100644 --- a/nestedtensor/csrc/utils/nested_node.h +++ b/nestedtensor/csrc/utils/nested_node.h @@ -16,18 +16,23 @@ template struct NestedNode { // NestedNode() : _is_leaf(false), _height(1) {} NestedNode() = delete; - NestedNode(std::vector>&& children) + explicit NestedNode(std::vector>&& children) : _is_leaf(false), _children(children), _height(1) { for (const auto& child : children) { if (child.height() + 1 > _height) { _height = child.height() + 1; } } + // for (const auto& child : children) { + // TORCH_CHECK( + // child.height() == _height - 1, + // "internal error: expected a full tree."); + // } } // NestedNode(NestedNode&) = delete; // NestedNode(const NestedNode&) = delete; // NestedNode& operator=(NestedNode) = delete; - NestedNode(T&& payload) : _is_leaf(true), _payload(payload), _height(0) {} + explicit NestedNode(T&& payload) : _is_leaf(true), _payload(payload), _height(0) {} inline bool is_leaf() const { return _is_leaf; } @@ -59,74 +64,9 @@ struct NestedNode { int64_t _height; }; -template <> -struct NestedNode { - // NestedNode() : _is_leaf(false), _height(1) {} - NestedNode() = delete; - NestedNode(std::vector>&& children) - : _is_leaf(false), _children(children), _height(1) { - for (const auto& child : children) { - if (child.height() + 1 > _height) { - _height = child.height() + 1; - } - } - } - // NestedNode(NestedNode&) = delete; - // NestedNode(const NestedNode&) = delete; - // NestedNode& operator=(NestedNode) = delete; - NestedNode(at::Tensor&& payload) - : _is_leaf(true), _payload(payload), _height(0) {} - NestedNode( - NestedNode&& structure, - at::Tensor&& buffer) - : _is_leaf(structure._is_leaf), - _children(structure._children), - _payload(structure._payload), - _height(structure._height), - _buffer(buffer) { - TORCH_CHECK( - buffer.dim() == 1, - "Buffer needs to be a flat vector, i.e. Tensor of dim 1.") - } - inline bool is_leaf() const { - return _is_leaf; - } - inline size_t degree() const { - return _children.size(); - } - inline int64_t height() const { - return _height; - } - inline const std::vector> unbind() const { - return _children; - } - inline NestedNode children(size_t i) const { - return _children[i]; - } - inline const at::Tensor& payload() const { - return _payload; - } - inline at::Tensor& payload() { - return _payload; - } - inline const c10::optional& buffer() const { - return _buffer; - } - inline c10::optional& buffer() { - return _buffer; - } - - private: - bool _is_leaf; - std::vector> _children; - // TODO: Make this const? - // _VariableNode _variable_node; - at::Tensor _payload; - int64_t _height; - c10::optional _buffer; -}; - -using SizeNode = NestedNode>; +// TODO: Should have specialized construction check that all payloads are of +// same size for SizeNode +using SizeNode = NestedNode>; using IntegerNode = NestedNode; using TensorNode = NestedNode; using IValueNode = NestedNode; @@ -163,12 +103,12 @@ class _map> { c10::guts::tuple_map( std::forward_as_tuple(nested_node...), [&all_leaf, °ree](auto n) { all_leaf = all_leaf && (n.is_leaf()); - if (degree == 0 && n.degree() > 0) { - degree = n.degree(); - } - if (degree > 0 && n.degree() > 0) { + if (degree > 1 && n.degree() > 1) { TORCH_CHECK(degree == n.degree(), "NestedNodes don't broadcast."); } + if (n.degree() > degree) { + degree = n.degree(); + } return nullptr; }); if (all_leaf) { @@ -200,7 +140,7 @@ class _map> { std::move(children)); } return NestedNode(std::move(result)); - }; + } }; // NOTE: Assuming all NestedNodes have same shape. @@ -215,7 +155,7 @@ map(F&& fn, const NestedNode&... nested_node) { F, typename c10::guts::infer_function_traits::type::return_type, typename c10::guts::infer_function_traits::type::parameter_types>:: - function(std::move(fn), nested_node...); + function(std::forward(fn), nested_node...); } template @@ -241,7 +181,7 @@ inline std::pair> _unflatten( const std::vector& content, int64_t index) { if (structure.is_leaf()) { - at::Tensor tmp = content[index]; + R tmp = content[index]; return std::pair>( index + 1, NestedNode(std::move(tmp))); @@ -341,15 +281,17 @@ inline NestedNode> zip( // TODO: Assuming all NestedNodes have same shape. template -inline A reduce(NestedNode... nested_node, F fn, A ident) { - A result = ident; +inline typename c10::guts::infer_function_traits::type::return_type reduce( + F fn, + A ident, + NestedNode... nested_node) { auto first_node = std::get<0>(std::forward_as_tuple(nested_node...)); if (first_node.is_leaf()) { - result = fn(nested_node.payload()..., result); - } else { - for (size_t i = 0; i < first_node.degree(); i++) { - result = reduce(nested_node.children(i)..., fn, result); - } + return fn(nested_node.payload()..., ident); + } + A result = ident; + for (size_t i = 0; i < first_node.degree(); i++) { + result = reduce(fn, result, nested_node.children(i)...); } return result; } @@ -402,7 +344,7 @@ class _apply> { std::move(children)); } } - }; + } }; // NOTE: Assuming all NestedNodes have same shape. @@ -417,12 +359,12 @@ static inline void apply(F&& fn, NestedNode... nested_node) { c10::guts::typelist::map_t< std::remove_reference_t, typename c10::guts::infer_function_traits::type:: - parameter_types>>::function(std::move(fn), nested_node...); + parameter_types>>::function(std::forward(fn), nested_node...); } namespace impl { -inline c10::List _cont_stride(c10::List size) { +inline std::vector _cont_stride(std::vector size) { std::vector stride(size.size()); int64_t p = 1; size_t p_i = size.size(); @@ -431,87 +373,70 @@ inline c10::List _cont_stride(c10::List size) { stride[p_i] = p; p *= size[p_i]; } - return c10::List(stride); + return std::vector(stride); } -inline int64_t num_memory(c10::List size, c10::List stride) { - // 0-dim Tensors have torch.Size of .size() 0, but carry 1 memory. - // Empty 1-dim Tensors (torch.tensor([])) have torch.Size of .size() 1, - // but carry 0 memory. - if (size.size() == 0) { - return 1; - } - return size[0] * stride[0]; +inline std::vector _cont_stride(int64_t* size_ptr, int64_t size) { + std::vector size_vector(size_ptr, size_ptr + size); + return _cont_stride(size_vector); } -inline TensorNode build_structure( - at::Tensor&& buffer, - const SizeNode& nested_size, - const SizeNode& nested_stride) { - std::vector split_sizes = flatten( - map([](c10::List a, - c10::List b) { return num_memory(a, b); }, - nested_size, - nested_stride)); - std::vector nonzero_split_sizes; - for (size_t i = 0; i < split_sizes.size(); i++) { - if (split_sizes[i] > 0) { - nonzero_split_sizes.push_back(split_sizes[i]); +inline bool _is_cont_stride(int64_t* size, int64_t* stride, size_t length) { + int64_t p = 1; + size_t p_i = length; + for (size_t i = 0; i < length; i++) { + p_i--; + if (p != stride[p_i]) { + return false; } + p *= size[p_i]; } - std::vector buffers_; - if (nonzero_split_sizes.size() > 0) { - buffers_ = - at::split_with_sizes(buffer, c10::IntArrayRef(nonzero_split_sizes), 0); - } - std::vector buffers; - int64_t index = 0; - for (size_t i = 0; i < split_sizes.size(); i++) { - if (split_sizes[i] > 0) { - buffers.push_back(buffers_[index]); - index++; - } else { - buffers.push_back(at::empty({}, buffer.options())); - } + return true; +} + +inline int64_t num_memory( + const std::vector& size, + const std::vector& stride) { + // 0-dim Tensors have torch.Size of .size() 0, but carry 1 memory. + // Empty 1-dim Tensors (torch.tensor([])) have torch.Size of .size() 1, + // but carry 0 memory. + int64_t result = 1; + for (size_t i = 0; i < size.size(); i++) { + result = result + ((size[i] - 1) * stride[i]); } - TensorNode tmp = unflatten(nested_size, std::move(buffers)); - TensorNode result = map( - [](at::Tensor buffer, - c10::List size, - c10::List stride) { - return at::as_strided( - buffer, - c10::IntArrayRef(size.vec()), - c10::IntArrayRef(stride.vec())); - }, - tmp, - nested_size, - nested_stride); - return TensorNode(std::move(result), std::move(buffer)); + return result; } -inline TensorNode build_structure( - at::Tensor&& buffer, - const SizeNode& nested_size) { - TORCH_CHECK( - buffer.dim() == 1, "Given buffer must be vector, i.e. dim 1 Tensor."); - SizeNode nested_stride = map( - [](c10::List size) { return _cont_stride(size); }, nested_size); - return build_structure(std::move(buffer), nested_size, nested_stride); +inline int64_t num_memory( + int64_t* size_ptr, + int64_t* stride_ptr, + int64_t size) { + // 0-dim Tensors have torch.Size of .size() 0, but carry 1 memory. + // Empty 1-dim Tensors (torch.tensor([])) have torch.Size of .size() 1, + // but carry 0 memory. + int64_t result = 1; + for (size_t i = 0; i < size; i++) { + result = result + ((size_ptr[i] - 1) * stride_ptr[i]); + } + return result; } } // namespace impl -inline TensorNode pack(TensorNode&& structure) { - TensorNode flat_structure = - map([](at::Tensor tensor) { return tensor.reshape({-1}); }, structure); - auto nested_size = - map([](at::Tensor tensor) { return c10::List(tensor.sizes()); }, - structure); - auto tensors = flatten(flat_structure); - if (tensors.size() == 0) { - return impl::build_structure(at::ones({0}), nested_size); +// Remove singleton nodes across given level. +template +inline NestedNode squeeze( + NestedNode structure, + int64_t level, + bool keep_dim) { + if (level <= 0) { + if (keep_dim) { + std::vector> children; + children.push_back(structure.children(0)); + return NestedNode(std::move(children)); + } + return structure.children(0); } - return impl::build_structure(at::cat(tensors, 0), nested_size); + return NestedNode(squeeze(structure, level - 1, keep_dim)); } } // namespace nested_tensor diff --git a/nestedtensor/csrc/utils/python_nested_node.cpp b/nestedtensor/csrc/utils/python_nested_node.cpp index 515c2a96..dea701f7 100644 --- a/nestedtensor/csrc/utils/python_nested_node.cpp +++ b/nestedtensor/csrc/utils/python_nested_node.cpp @@ -58,8 +58,9 @@ void register_python_nested_node(py::module m) { auto fn = [](py::object a, py::object b) -> bool { // return a.equal(b); int rv = PyObject_RichCompareBool(a.ptr(), b.ptr(), Py_EQ); - if (rv == -1) + if (rv == -1) { throw py::error_already_set(); + } return rv == 1; }; return all(std::move(fn), a, b); @@ -72,7 +73,7 @@ void register_python_nested_node(py::module m) { if (!shape_matches(a, b)) { return false; } - auto fn = [](c10::List a, c10::List b) { + auto fn = [](std::vector a, std::vector b) { for (size_t i = 0; i < a.size(); i++) { if (a[i] != b[i]) { return false; diff --git a/nestedtensor/csrc/utils/python_nested_node.h b/nestedtensor/csrc/utils/python_nested_node.h index b253fbb0..8ddd0a11 100644 --- a/nestedtensor/csrc/utils/python_nested_node.h +++ b/nestedtensor/csrc/utils/python_nested_node.h @@ -91,7 +91,7 @@ struct THPNestedNode { std::string _name; }; -using THPSizeNode = THPNestedNode>; +using THPSizeNode = THPNestedNode>; using THPIntegerNode = THPNestedNode; using THPTensorNode = THPNestedNode; using THPIValueNode = THPNestedNode; diff --git a/nestedtensor/nested/creation.py b/nestedtensor/nested/creation.py index 572bdf5e..0a86b901 100644 --- a/nestedtensor/nested/creation.py +++ b/nestedtensor/nested/creation.py @@ -3,10 +3,10 @@ import warnings from . import nested -from nestedtensor import _C +import nestedtensor -def nested_tensor(data, dtype=None, device=None, requires_grad=False, pin_memory=False): +def nested_tensor(data, dtype=None, device=None, requires_grad=False, pin_memory=False, channels_last=False): """ Arguments match torch.tensor """ @@ -14,18 +14,13 @@ def nested_tensor(data, dtype=None, device=None, requires_grad=False, pin_memory dtype = torch.get_default_dtype() if device is None: device = torch.device('cpu') - return nested.NestedTensor(_C.nested_tensor_impl(data, dtype, device, requires_grad, pin_memory)) + if channels_last is None: + channels_last = False + return nested.NestedTensor(nestedtensor._C.nested_tensor_impl(data, dtype, device, requires_grad, pin_memory, channels_last)) def as_nested_tensor(data, dtype=None, device=None, requires_grad=False, pin_memory=False): # TODO: Needs tests to check failure cases if not isinstance(data, nested.NestedTensor): - data = nested_tensor(data, dtype, device, requires_grad, pin_memory) - if not(dtype is None and device is None and requires_grad is None and pin_memory is None): - if dtype is not None or device is not None: - data = data.to(dtype=dtype, device=device) - if requires_grad: - data = data.requires_grad_(requires_grad) - if pin_memory: - data = data.pin_memory() + return nested_tensor(data, dtype, device, requires_grad, pin_memory) return data diff --git a/nestedtensor/nested/fuser.py b/nestedtensor/nested/fuser.py new file mode 100644 index 00000000..15d53ece --- /dev/null +++ b/nestedtensor/nested/fuser.py @@ -0,0 +1,277 @@ +import torch.fx as fx +from typing import Type, Dict, Any, Tuple, Iterable +import torch +import copy +from torch.fx import symbolic_trace +import time + +def my_add_relu(x: torch.Tensor, y: torch.Tensor): + assert x.is_cuda and y.is_cuda + return y.add_(x).relu_() + +def _parent_name(target : str) -> Tuple[str, str]: + """ + Splits a qualname into parent path and last atom. + For example, `foo.bar.baz` -> (`foo.bar`, `baz`) + """ + *parent, name = target.rsplit('.', 1) + return parent[0] if parent else '', name + +# Works for length 2 patterns with 2 modules +def matches_module_pattern(pattern: Iterable[Type], node: fx.Node, modules: Dict[str, Any]): + if len(node.args) == 0: + return False + nodes: Tuple[Any, fx.Node] = (node.args[0], node) + for expected_type, current_node in zip(pattern, nodes): + if not isinstance(current_node, fx.Node): + return False + if current_node.op != 'call_module': + return False + if not isinstance(current_node.target, str): + return False + if current_node.target not in modules: + return False + if type(modules[current_node.target]) is not expected_type: + return False + return True + + +def replace_node_module(node: fx.Node, modules: Dict[str, Any], new_module: torch.nn.Module): + assert(isinstance(node.target, str)) + parent_name, name = _parent_name(node.target) + setattr(modules[parent_name], name, new_module) + + +def computeUpdatedConvWeightAndBias( + bn_rv, + bn_eps, + bn_w, + bn_b, + bn_rm, + conv_w, + conv_b=None): + orig_dtype = bn_rv.dtype + bn_var_rsqrt = (bn_w / torch.sqrt(bn_rv.to(torch.double) + bn_eps)) + new_w = (conv_w * (bn_var_rsqrt).reshape(-1, 1, 1, 1)).to(orig_dtype) + if conv_b is None: + return new_w + new_b = (conv_b - bn_rm) * bn_var_rsqrt * bn_w + bn_b + return new_w, new_b + + +def fuse_conv_bn_eval(conv, bn): + assert(not (conv.training or bn.training)), "Fusion only for eval!" + fused_conv = copy.deepcopy(conv) + fused_conv.bias = None + + fused_conv.weight = \ + torch.nn.Parameter(computeUpdatedConvWeightAndBias(bn.running_var, bn.eps, bn.weight, bn.bias, bn.running_mean, fused_conv.weight)) + + return fused_conv + + +def fuse_conv_bn(model: torch.nn.Module, inplace=False) -> torch.nn.Module: + """ + Fuses convolution/BN layers for inference purposes. Will deepcopy your + model by default, but can modify the model inplace as well. + """ + patterns = [(torch.nn.Conv2d, torch.nn.BatchNorm2d)] + if not inplace: + model = copy.deepcopy(model) + fx_model = fx.symbolic_trace(model) + modules = dict(fx_model.named_modules()) + new_graph = copy.deepcopy(fx_model.graph) + + for pattern in patterns: + for node in new_graph.nodes: + if matches_module_pattern(pattern, node, modules): + if len(node.args[0].users) > 1: # Output of conv is used by other nodes + continue + conv = modules[node.args[0].target] + bn = modules[node.target] + fused_conv = fuse_conv_bn_eval(conv, bn) + replace_node_module(node.args[0], modules, fused_conv) + node.replace_all_uses_with(node.args[0]) + new_graph.erase_node(node) + return fx.GraphModule(fx_model, new_graph) + + +class Conv2dReLU(torch.nn.Module): + def __init__(self, + weight, + bias, + stride, + padding, + dilation, + groups): + super(Conv2dReLU, self).__init__() + self.weight = weight + self.weight_is_channels_last = False + self.bias = bias + self.stride = stride + self.padding = padding + self.dilation = dilation + self.groups = groups + self.slow_fusion = False + if self.weight.size(2) == 7 and self.weight.size(3) == 7: + self.slow_fusion = True + + def forward(self, inp): + # NOTE: This will be faster once https://github.com/pytorch/pytorch/pull/62482 lands + if not self.slow_fusion and inp.is_contiguous(memory_format=torch.contiguous_format): + inp = inp.to(memory_format=torch.channels_last) + if self.slow_fusion and inp.is_contiguous(memory_format=torch.channels_last): + inp = inp.to(memory_format=torch.contiguous_format) + if not self.slow_fusion and not self.weight_is_channels_last: + self.weight.data = self.weight.to(memory_format=torch.channels_last) + inp = inp.to(memory_format=torch.channels_last) + self.weight_is_channels_last = True + # NOTE: Very hacky way of dealing with cudnn_convolution_relu's inability + # to support contiguous weight but channels last input. We also + # can't just set all weights to channels last in this model, because + # the first layer is very slow under channels last. + try: + return torch.cudnn_convolution_relu(inp, + self.weight, + self.bias, + self.stride, + self.padding, + self.dilation, + self.groups) + except RuntimeError: + if self.weight.is_contiguous(memory_format=torch.channels_last): + self.weight.data = self.weight.to(memory_format=torch.contiguous_format) + else: + self.weight.data = self.weight.to(memory_format=torch.channels_last) + + return torch.cudnn_convolution_relu(inp, + self.weight, + self.bias, + self.stride, + self.padding, + self.dilation, + self.groups) + + +class Conv2dAddReLU(torch.nn.Module): + def __init__(self, + weight, + bias, + stride, + padding, + dilation, + groups): + super(Conv2dAddReLU, self).__init__() + self.weight = weight + self.weight_is_channels_last = False + self.bias = bias + self.stride = stride + self.padding = padding + self.dilation = dilation + self.groups = groups + self.slow_fusion = False + if self.weight.size(2) == 7 and self.weight.size(3) == 7: + self.slow_fusion = True + + def forward(self, inp, add_input): + # TODO: Reactivate this once cudnn_convolution_add_relu is fixed. + # weight = self.weight.to(memory_format=torch.contiguous_format) + # if not self.slow_fusion and inp.is_contiguous(memory_format=torch.contiguous_format): + # inp = inp.to(memory_format=torch.channels_last) + # add_input = add_input.to(memory_format=torch.channels_last) + # if self.slow_fusion and inp.is_contiguous(memory_format=torch.channels_last): + # inp = inp.to(memory_format=torch.contiguous_format) + # add_input = add_input.to(memory_format=torch.contiguous_format) + # if not self.slow_fusion and not self.weight_is_channels_last: + # self.weight.data = self.weight.to(memory_format=torch.channels_last) + # inp = inp.to(memory_format=torch.channels_last) + # add_input = add_input.to(memory_format=torch.channels_last) + # self.weight_is_channels_last = True + # return torch.cudnn_convolution_add_relu(inp, + # self.weight, + # add_input, + # 1.0, + # self.bias, + # self.stride, + # self.padding, + # self.dilation, + # self.groups) + out = torch.conv2d(inp, + self.weight, + self.bias, + self.stride, + self.padding, + self.dilation, + self.groups) + my_add_relu(add_input, out) + # out.add_(add_input) + # out.relu_() + return out + +def fuse_conv_relu(model: torch.nn.Module, inplace=False) -> torch.nn.Module: + """ + Fuses convolution/BN layers for inference purposes. Will deepcopy your + model by default, but can modify the model inplace as well. + """ + patterns = [(torch.nn.Conv2d, torch.nn.ReLU)] + if not inplace: + model = copy.deepcopy(model) + fx_model = fx.symbolic_trace(model) + modules = dict(fx_model.named_modules()) + new_graph = copy.deepcopy(fx_model.graph) + + for pattern in patterns: + for node in new_graph.nodes: + if matches_module_pattern(pattern, node, modules): + if len(node.args[0].users) > 1: # Output of conv is used by other nodes + continue + conv = modules[node.args[0].target] + relu = modules[node.target] + fused_conv = Conv2dReLU(conv.weight, conv.bias, conv.stride, conv.padding, conv.dilation, conv.groups) + replace_node_module(node.args[0], modules, fused_conv) + node.replace_all_uses_with(node.args[0]) + new_graph.erase_node(node) + + + last_nodes = [] + count = 0 + for node in new_graph.nodes: + if count == 31: + break + if (node.op == "call_function" or node.op == "call_module"): + last_nodes.append(node) + if len(last_nodes) == 4: + last_nodes = last_nodes[1:] + if len(last_nodes) < 3: + continue + is_match = True + is_match = is_match and (last_nodes[0].op == "call_module") + is_match = is_match and (last_nodes[1].op == "call_function") + is_match = is_match and (last_nodes[2].op == "call_module") + is_match = is_match and isinstance(modules[last_nodes[0].target], torch.nn.Conv2d) + is_match = is_match and (str(last_nodes[1]).split("_")[0] == "add") + is_match = is_match and isinstance(modules[last_nodes[2].target], torch.nn.ReLU) + if (is_match): + conv = modules[last_nodes[1].args[0].target] + fused_conv = Conv2dAddReLU(conv.weight, conv.bias, conv.stride, conv.padding, conv.dilation, conv.groups) + replace_node_module(last_nodes[2], modules, fused_conv) + last_nodes[2].args = (last_nodes[0].args[0], last_nodes[1].args[1]) + new_graph.erase_node(last_nodes[1]) + new_graph.erase_node(last_nodes[0]) + count += 1 + return fx.GraphModule(fx_model, new_graph) + + +def fuse_conv_add_relu(model: torch.nn.Module, inplace=False) -> torch.nn.Module: + """ + Fuses convolution/BN layers for inference purposes. Will deepcopy your + model by default, but can modify the model inplace as well. + """ + if not inplace: + model = copy.deepcopy(model) + fx_model = fx.symbolic_trace(model) + modules = dict(fx_model.named_modules()) + new_graph = copy.deepcopy(fx_model.graph) + + new_graph.lint() + return fx.GraphModule(fx_model, new_graph) diff --git a/nestedtensor/nested/masking.py b/nestedtensor/nested/masking.py index 54fc9200..5f5801cd 100644 --- a/nestedtensor/nested/masking.py +++ b/nestedtensor/nested/masking.py @@ -8,7 +8,8 @@ TensorMask = collections.namedtuple('TensorMask', 'tensor mask') -def nested_tensor_from_padded_tensor(tensor, nested_dim=None, padding=-1): + +def nested_tensor_from_padded_tensor(tensor, nested_dim=1, padding=-1): mask = (tensor != padding) return nested_tensor_from_tensor_mask(tensor, mask, nested_dim) @@ -29,165 +30,21 @@ def nested_tensor_from_tensor_mask(tensor, mask, nested_dim=1): raise RuntimeError("Nested dimension can't be 0.") if nested_dim is not None and nested_dim > tensor.dim(): - raise RuntimeError("Nested dimension ({0}) can't be bigger than data tensor dimension ({1}).".format(nested_dim, tensor.dim())) + raise RuntimeError("Nested dimension ({0}) can't be bigger than data tensor dimension ({1}).".format( + nested_dim, tensor.dim())) if tensor.numel() == 0 and mask.numel() != 0: raise RuntimeError("Data tensor can't be emtpy if a mask has values.") if tensor.numel() != 0 and mask.numel() == 0: - raise RuntimeError("Mask tensor can't be emtpy if a data tensor has values.") + raise RuntimeError( + "Mask tensor can't be emtpy if a data tensor has values.") return nt_from_tensor_mask(tensor, mask, nested_dim) def nt_from_tensor_mask(tensor, mask, nested_dim): - def _merge(tensors, nested_dim): - if len(tensors) == 0: - return torch.tensor([]).to(tensor) - return torch.stack(tensors) - - if nested_dim == 0: - if (mask.numel() == 0) or (mask.numel() == 1 and mask.item() == True): - return tensor - - if mask.dim() == 1: - tensors = [tensor[i] if mask[i] else None for i in range(len(mask))] - tensors = list(filter(lambda x: x is not None, tensors)) - return _merge(tensors, nested_dim) - - if mask.dim() > 1: - tensors = [nt_from_tensor_mask(t, m, nested_dim) for (t, m) in zip(tensor, mask)] - if not all(t.numel() == 0 for t in tensors): - tensors = list(filter(lambda x: x.numel() > 0, tensors)) - return _merge(tensors, nested_dim) - - return None - - inner_tensors = [] - if (mask.numel() == 0) or (mask.numel() == 1 and mask == True): - for i in range(len(tensor)): - inner_tensors.append(nt_from_tensor_mask(tensor[i], mask, nested_dim - 1)) - elif (mask.numel() == 1 and mask == False): - inner_tensors.append(None) - else: - inner_tensors = [nt_from_tensor_mask(t, m, nested_dim - 1) for (t, m) in zip(tensor, mask)] - - # Filtering out None values which were ignored by mask - inner_tensors = list(filter(lambda x: x is not None, inner_tensors)) - return creation.nested_tensor(inner_tensors, requires_grad=tensor.requires_grad) - -# Get max size per each dimension from all the passed tensors. -def get_max_size(obj, res=None): - if res is None: - res = [1] - if isinstance(obj, list) or isinstance(obj, tuple): - for o in obj: - res = get_max_size(o, res) - - if isinstance(obj, nestedtensor.nested.nested.NestedTensor): - tres = get_max_size(obj.unbind()) - while len(tres) > len(res): - res.append(0) - - res = [max(i, j) for (i, j) in zip(res, tres)] - - if isinstance(obj, torch.Tensor): - # scalar - if obj.dim() == 0 and obj.numel() == 1: - res = [1] - else: - while len(obj.size()) > len(res): - res.append(0) - - res = [max(i, j) for (i, j) in zip(res, obj.size())] - - return res - -def get_tensor_mask(nt, shape): - def pad_nt(nt, shape): - - if isinstance(nt, torch.Tensor): - if nt.numel() == 0: - raise RuntimeError("Empty tensors are not yet supported.") - - # Dont pad in case of a scalar - if nt.dim() == 0: - return nt, torch.tensor(True) - - tensor = pad_tensor_to_shape(nt, shape) - mask = pad_tensor_to_shape(nt.new_full(nt.size(), True, dtype=torch.bool), shape) - return tensor, mask - - res_tensor = [] - res_mask = [] - if len(nt) == 0: - return torch.tensor([0]), torch.tensor([False], dtype=torch.bool) - else: - for entry in nt: - tensor, mask = pad_nt(entry, shape) - res_tensor.append(tensor) - res_mask.append(mask) - - return torch.stack(res_tensor), torch.stack(res_mask) - - t, m = pad_nt(nt, shape) - return t, m - - -# Return a tuple of a tensor and a mask that represent the given tensor list -# Returned tensor is always the same no matter what mask_dim was passed. -# If mask_dim was not passed, a mask with the smallest dimensionality would be returned. -# if passed mask_dim is lower than the minimal dimensionality of the mask that can represent -# the data tensor, an error is thrown. -def to_tensor_mask(nt, mask_dim): - if mask_dim is not None and mask_dim > nt.dim(): - raise RuntimeError("Mask dimension is bigger than nested dimension of a nested tensor.") - - # Check if scalar was passed - if not isinstance(nt, list) and nt.size() == (1,): - res_scalar = torch.tensor([nt[0].item()], dtype=nt.dtype, device=nt.device, requires_grad=nt.requires_grad) - mask = torch.tensor(True) if mask_dim == 0 or mask_dim == None else torch.tensor([True]) - return res_scalar, mask - - max_size = get_max_size(nt) - res_tensor, res_mask = get_tensor_mask(nt, max_size) - tensor_mask_tuple = merge_tensor_mask(TensorMask(res_tensor, res_mask), mask_dim) - - return tensor_mask_tuple.tensor, tensor_mask_tuple.mask - - -# Merge mask to a given dimension if possible. -def merge_tensor_mask(tensor_mask, mask_dim): - tensor = tensor_mask.tensor - mask = tensor_mask.mask - if mask_dim is not None and mask.dim() == mask_dim: - return tensor_mask - - if mask.dim() == 0: - return tensor_mask - - last_size = mask.size(-1) - collapsed_mask = mask.sum(-1) - is_last_size = (collapsed_mask == last_size) - is_zero = (collapsed_mask == 0) - if (is_last_size.sum() + is_zero.sum()) == collapsed_mask.numel(): - collapsed_mask = collapsed_mask.to(torch.bool) - return merge_tensor_mask(TensorMask(tensor=tensor, mask=collapsed_mask), mask_dim) - - if mask_dim is not None and mask_dim != mask.dim(): - raise RuntimeError("Mask dimension is too small to represent data tensor.") - # This is expected to be a no-op, except in rare cases. - tensor = tensor.contiguous() - mask = mask.contiguous() - return TensorMask(tensor=tensor, mask=mask) - - -def pad_tensor_to_shape(t, goal_shape): - padd = () - tup = tuple(t.size()) - assert(t.dim() == len(goal_shape)) - for i in range(len(tup)): - padd = (0, goal_shape[i] - tup[i]) + padd - new_tensor = F.pad(t, padd) - new_tensor = new_tensor.reshape(goal_shape) - return new_tensor + result = torch.ops.nestedtensor.nt_from_tensor_mask( + tensor, mask, nested_dim) + assert result is not None + return nestedtensor.NestedTensor(result).contiguous() diff --git a/nestedtensor/nested/nested.py b/nestedtensor/nested/nested.py index 75ce1679..c9bbbb2d 100644 --- a/nestedtensor/nested/nested.py +++ b/nestedtensor/nested/nested.py @@ -5,25 +5,13 @@ from . import creation import nestedtensor -from torch._C import _disabled_torch_function_impl +import warnings -def _new_torch_stack(tensors, dim=0, out=None): - result = torch.ops.nestedtensor.stack(list( - t._impl if isinstance(t, NestedTensor) else t for t in tensors), dim) - result = _wrap_result(result) - if out is None: - return result - out.copy_(result) - - -def _new_torch_cat(tensors, dim=0, out=None): - result = torch.ops.nestedtensor.cat(list( - t._impl if isinstance(t, NestedTensor) else t for t in tensors), dim) - result = _wrap_result(result) - if out is None: - return result - out.copy_(result) +def _not_impl_raise(cond, msg): + if (isinstance(cond, bool) and cond) or (not isinstance(cond, bool) and cond is not None): + raise NotImplementedError( + msg + " is not supported yet. Please file an issue on https://github.com/pytorch/nestedtensor") def _nn_functional_linear(input, weight, bias=None): @@ -32,7 +20,7 @@ def _nn_functional_linear(input, weight, bias=None): # we need to disable the addition of NTs and Ts below autograd, but we still need # it for linear (hence add lives above autograd). Also linear insists on using the # in-place version, for which we don't have an op above autograd, since the custom - # function wrapper autograd_map_nested_tensor doesn't suport it. + # function wrapper autograd_map_nested_tensor doesn't support it. # And that's why we're writing our own version of linear here. output = input.matmul(weight.t()) if bias is not None: @@ -40,6 +28,96 @@ def _nn_functional_linear(input, weight, bias=None): return output +def _nn_functional_batch_norm(input, running_mean, running_var, weight=None, bias=None, + training=False, momentum=0.1, eps=1e-5): + return torch.batch_norm( + input, weight, bias, running_mean, running_var, + training, momentum, eps, torch.backends.cudnn.enabled + ) + + +def _nn_functional_adaptive_avg_pool2d(input, output_size): + return torch._C._nn.adaptive_avg_pool2d(input, output_size) + + +def _nn_functional_embedding_bag(input, weight, offsets=None, max_norm=None, norm_type=2, + scale_grad_by_freq=False, mode='mean', sparse=False, + per_sample_weights=None, include_last_offset=False, + padding_idx=None): + # Check for backward compatibility. + # Used to be embedding_bag(weight, input, ...) + # Now is embedding_bag(input, weight, ...) + if weight.dtype == torch.long and input.is_floating_point(): + warnings.warn("Argument order of nn.functional.embedding_bag was changed. " + "Usage `embedding_bag(weight, input, ...)` is deprecated, " + "and should now be `embedding_bag(input, weight, ...)`.") + weight, input = input, weight + + if per_sample_weights is not None and input.size() != per_sample_weights.size(): + raise ValueError("embedding_bag: If per_sample_weights ({}) is not None, " + "then it must have the same shape as the input ({})" + .format(per_sample_weights.shape, input.shape)) + + _not_impl_raise(max_norm, "max_norm") + _not_impl_raise(per_sample_weights, "per_sample_weights") + + input_dim = torch.ops.nestedtensor.get_dim(input) + if input_dim == 2: + if offsets is not None: + type_str = "" + # TODO: Remove this once script supports type() calls + if not torch.jit.is_scripting(): + type_str = str(type(offsets)) + raise ValueError("if input is 2D, then offsets has to be None" + ", as input is treated is a mini-batch of" + " fixed length sequences. However, found " + "offsets of type {}".format(type_str)) + offsets_ = NestedTensor(input).nested_size() + offsets = torch.zeros(len(offsets_), dtype=torch.int64) + for i in range(1, len(offsets)): + offsets[i] = offsets[i - 1] + offsets_[i - 1][0] + offsets = offsets.to(input.device) + elif input_dim == 1: + raise ValueError("input has to be 2D NestedTensor," + " but got NestedTensor of dimension {}".format(input_dim)) + if mode == 'sum': + mode_enum = 0 + elif mode == 'mean': + mode_enum = 1 + elif mode == 'max': + mode_enum = 2 + + if scale_grad_by_freq: + raise ValueError( + "max mode does not support scaling the gradient by the frequency") + + if sparse: + raise ValueError("max mode does not support sparse weights") + + else: + raise ValueError("mode has to be one of sum, mean or max") + + if per_sample_weights is not None and mode != 'sum': + raise NotImplementedError("embedding_bag: per_sample_weights was not None. " + "per_sample_weights is only supported for mode='sum' " + "(got mode='{}'). Please open a feature request on GitHub." + .format(mode)) + if padding_idx is not None: + raise NotImplementedError( + "padding_idx is not supported for NestedTensor embedding_bag") + + ret, _, _, _ = torch.embedding_bag( + weight, + input, + offsets, + scale_grad_by_freq, + mode_enum, + sparse, + per_sample_weights, + include_last_offset) + return ret + + def _wrap_result(result): if isinstance(result, list): return list(_wrap_result(r) for r in result) @@ -55,13 +133,56 @@ def _wrap_result(result): def _filter_impl(args, kwargs): if kwargs is None: kwargs = {} - impl_args = [a._impl if isinstance(a, NestedTensor) else a for a in args] + impl_args = [] + for a in args: + if isinstance(a, NestedTensor): + impl_args.append(a._impl) + elif torch.is_tensor(a): + impl_args.append(a) + elif isinstance(a, list): + a_impl, _ = _filter_impl(a, {}) + impl_args.append(a_impl) + elif isinstance(a, tuple): + a_impl, _ = _filter_impl(a, {}) + impl_args.append(tuple(a_impl)) + else: + impl_args.append(a) impl_kwargs = { k: v._impl if isinstance(v, NestedTensor) else v for (k, v) in kwargs.items() } return impl_args, impl_kwargs +def sum_to_size(tensor, shape): + impl_args, _ = _filter_impl([tensor, shape], {}) + return _wrap_result(nestedtensor._C.sum_to_size(*impl_args)) + + +def sizes_equal(tensor, shape): + impl_args, _ = _filter_impl([tensor, shape], {}) + return _wrap_result(nestedtensor._C.sizes_equal(*impl_args)) + + +def native_is_expandable_to(tensor, shape): + impl_args, _ = _filter_impl([tensor, shape], {}) + return _wrap_result(nestedtensor._C.native_is_expandable_to(*impl_args)) + + +def to_nested_tensor(tensor, dim=0): + return _wrap_result( + torch.ops.nestedtensor.to_nested_tensor(tensor._impl if isinstance(tensor, NestedTensor) else tensor, dim)) + + +def transpose_nchw_nhwc(tensor): + return _wrap_result( + torch.ops.nestedtensor.transpose_nchw_nhwc(tensor._impl)) + + +def transpose_nhwc_nchw(tensor): + return _wrap_result( + torch.ops.nestedtensor.transpose_nhwc_nchw(tensor._impl)) + + class NestedTensorMeta(type): def __getattr__(cls, name): if getattr(torch.Tensor, name): @@ -71,13 +192,12 @@ def _wrapped_fn(*args, **kwargs): *(impl_args[1:]), **impl_kwargs) return _wrap_result(result) return _wrapped_fn - return self.__dict__[name] + return cls.__dict__[name] # -------------------------NestedTensor core--------------------------- class NestedTensor(metaclass=NestedTensorMeta): - __torch_function__ = _disabled_torch_function_impl # The attributes must match across all constiuents # # The NestedTensor's attributes then become that of its @@ -101,7 +221,7 @@ def __init__(self, impl): self._impl = impl def __getattr__(self, name): - if getattr(self._impl, name): + if hasattr(self._impl, name): def _wrapped_fn(*args, **kwargs): impl_args, impl_kwargs = _filter_impl(args, kwargs) result = getattr(self._impl, name)(*impl_args, **impl_kwargs) @@ -211,6 +331,14 @@ def grad(self): """ return _wrap_result(self._impl.grad) + @property + def data(self): + return _wrap_result(self._impl.data) + + @property + def is_sparse(self): + return self._impl.is_sparse + def requires_grad_(self, requires_grad=True): """ Is ```True``` if gradients need to be computed for this Tensor. @@ -218,7 +346,31 @@ def requires_grad_(self, requires_grad=True): return _wrap_result(self._impl.requires_grad_(requires_grad)) def backward(self, gradient=None, retain_graph=None, create_graph=False): - self._impl.backward(gradient._impl, retain_graph, create_graph) + impl = None + if gradient is not None: + if torch.is_tensor(gradient): + impl = gradient + else: + impl = gradient._impl + self._impl.backward(impl, retain_graph, create_graph) + + def numel(self): + return torch.ops.nestedtensor.get_numel(self._impl) + + def dim(self): + return torch.ops.nestedtensor.get_dim(self._impl) + + def contiguous(self): + if self.is_contiguous(): + return self + return _wrap_result(torch.ops.nestedtensor.make_contiguous(self._impl)) + + def is_contiguous(self, memory_format=torch.contiguous_format): + if (memory_format == torch.contiguous_format): + return torch.ops.nestedtensor.get_is_contiguous(self._impl, 0) + if (memory_format == torch.channels_last): + return torch.ops.nestedtensor.get_is_contiguous(self._impl, 2) + raise RuntimeError("Given memory format " + str(memory_format) + " not supported.") def nested_dim(self): """ @@ -247,15 +399,24 @@ def size(self, dim=None): return tuple(torch.ops.nestedtensor.sizes(self._impl)) def to(self, *args, **kwargs): - raise NotImplementedError( - "NestedTensor.to is currently not implemented.") - return nestedtensor.as_nested_tensor(new_tensors) + return _wrap_result(self._impl.to(*args, **kwargs)) def __str__(self): - return torch.ops.nestedtensor.str(self._impl) - - def __repr__(self): - return torch.ops.nestedtensor.str(self._impl) + def _str(x, indent=0, tab=" "): + if x.nested_dim() == 0: + return "" + s = indent*tab + "[\n" + if x.nested_dim() == 1: + strs = list(map(str, x.unbind())) + strs = list(map(lambda xi: "\n".join( + map(lambda xij: (indent + 1)*tab + xij, xi.split("\n"))), strs)) + s += ",\n".join(strs) + else: + s += ",\n".join(list(map( + lambda xi: _str(xi, indent + 1), x.unbind()))) + s += "\n" + indent * tab + "]" + return s + return "nested_tensor(" + _str(self) + ")" # --- impl forward ends --- @@ -286,8 +447,14 @@ def __torch_function__(self, func, types, args=(), kwargs=None): # TODO:This was disabled for now to focus on DETR if func is torch.nn.functional.linear: return _wrap_result(_nn_functional_linear(*impl_args, **impl_kwargs)) + if func is torch.nn.functional.embedding_bag: + return _wrap_result(_nn_functional_embedding_bag(*impl_args, **impl_kwargs)) + if func is torch.nn.functional.batch_norm: + return _wrap_result(_nn_functional_batch_norm(*impl_args, **impl_kwargs)) + if func is torch.nn.functional.adaptive_avg_pool2d: + return _wrap_result(_nn_functional_adaptive_avg_pool2d(*impl_args, **impl_kwargs)) if func is torch.nn.functional.multi_head_attention_forward: - return _wrap_result(nestedtensor.nn.mha.multi_head_attention_forward(*args, **kwargs)) + return _wrap_result(nestedtensor.nn.multi_head_attention_forward(*args, **kwargs)) if func is torch.nn.functional.interpolate: return _wrap_result(nestedtensor._C.interpolate(*impl_args, **impl_kwargs)) # Need a specialized implementation to dodge call to view in nll_loss @@ -311,11 +478,14 @@ def __iter__(self): def to_nested_tensor(self, dim=0): return _wrap_result(torch.ops.nestedtensor.to_nested_tensor(self._impl, dim)) - def to_list(self): - return self._impl.to_list() + def to_tensor_list(self): + return torch.ops.nestedtensor.to_tensor_list(self._impl) - def to_tuple(self): - return self._impl.to_tuple() + def to_packed_sequence(self): + if not self.dim() == 3 and self.nested_dim() == 1: + raise RuntimeError( + "NestedTensor should consistent of 2d Tensors of size L x *") + return torch.nn.utils.rnn.pack_sequence(self.to_tensor_list(), enforce_sorted=False) def to_tensor_mask(self, mask_dim=None): """Returns a named tuple TensorMask with two tensors (tensor, mask) @@ -329,8 +499,16 @@ def to_tensor_mask(self, mask_dim=None): element. These two tensors can be used to contruct a NestedTensor, however, nested_dim will be lost in this process.""" - return masking.to_tensor_mask(self, mask_dim) + # Return a tuple of a tensor and a mask that represent the given tensor list + # Returned tensor is always the same no matter what mask_dim was passed. + # If mask_dim was not passed, a mask with the smallest dimensionality would be returned. + # if passed mask_dim is lower than the minimal dimensionality of the mask that can represent + # the data tensor, an error is thrown. + return torch.ops.nestedtensor.to_tensor_mask(self, mask_dim) + + def to_padded_tensor(self, padding=-1): + padding = float(padding) + return torch.ops.nestedtensor.to_padded_tensor(self, padding) - def to_padded_tensor(self, mask_dim=None, padding=-1): - tensor, mask = masking.to_tensor_mask(self.to_list(), mask_dim) - return tensor.masked_fill(~mask, padding) + def to_sparse_csr_tensor(self): + return torch.ops.nestedtensor.to_sparse_csr(self._impl) diff --git a/nestedtensor/nn/__init__.py b/nestedtensor/nn/__init__.py index 29aebb72..dc32eed2 100644 --- a/nestedtensor/nn/__init__.py +++ b/nestedtensor/nn/__init__.py @@ -1,2 +1 @@ -from .mha import MultiheadAttention -from .parameter import Parameter as NTParameter +from .mha import multi_head_attention_forward diff --git a/nestedtensor/nn/mha.py b/nestedtensor/nn/mha.py index 963a3444..690c8298 100644 --- a/nestedtensor/nn/mha.py +++ b/nestedtensor/nn/mha.py @@ -1,47 +1,31 @@ -from torch.nn.init import constant_ -from torch.nn.init import xavier_uniform_ -from torch.nn.init import xavier_normal_ -from torch.nn.parameter import Parameter -from torch import nn, Tensor -from torch.nn.modules.module import Module import torch -import torch.nn.functional as F import nestedtensor # NT case query, key, value have nested_dim 1 and are of shape (bsz, tgt_len, embed_dim) -def multi_head_attention_forward(query, # type: NestedTensor - key, # type: NestedTensor - value, # type: NestedTensor - embed_dim_to_check, # type: int - num_heads, # type: int - in_proj_weight, # type: Tensor - in_proj_bias, # type: Tensor - # type: Optional[Tensor] +def multi_head_attention_forward(query, + key, + value, + embed_dim_to_check, + num_heads, + in_proj_weight, + in_proj_bias, bias_k, - # type: Optional[Tensor] bias_v, - add_zero_attn, # type: bool - dropout_p, # type: float - out_proj_weight, # type: Tensor - out_proj_bias, # type: Tensor - training=True, # type: bool - # type: Optional[Tensor] + add_zero_attn, + dropout_p, + out_proj_weight, + out_proj_bias, + training=True, key_padding_mask=None, - need_weights=True, # type: bool - # type: Optional[Tensor] + need_weights=True, attn_mask=None, - use_separate_proj_weight=False, # type: bool - # type: Optional[Tensor] + use_separate_proj_weight=False, q_proj_weight=None, - # type: Optional[Tensor] k_proj_weight=None, - # type: Optional[Tensor] v_proj_weight=None, - # type: Optional[Tensor] static_k=None, - # type: Optional[Tensor] static_v=None ): assert isinstance(query, nestedtensor.NestedTensor) @@ -59,7 +43,7 @@ def multi_head_attention_forward(query, # type: Nested assert static_k is None assert static_v is None assert not add_zero_attn - assert not need_weights + # assert not need_weights bsz, tgt_len, embed_dim = query.size() assert embed_dim == embed_dim_to_check @@ -70,111 +54,30 @@ def multi_head_attention_forward(query, # type: Nested assert head_dim * num_heads == embed_dim, "embed_dim must be divisible by num_heads" scaling = float(head_dim) ** -0.5 - return torch.ops.nestedtensor.min_mha(num_heads, - head_dim, - dropout_p, - training, - query._impl, - key._impl, - value._impl, - in_proj_weight, - in_proj_bias, - scaling, - out_proj_weight, - out_proj_bias), None - - -class MultiheadAttention(Module): - __annotations__ = { - 'bias_k': torch._jit_internal.Optional[torch.Tensor], - 'bias_v': torch._jit_internal.Optional[torch.Tensor], - } - __constants__ = ['q_proj_weight', 'k_proj_weight', - 'v_proj_weight', 'in_proj_weight'] - - def __init__(self, embed_dim, num_heads, dropout=0., bias=True, add_bias_kv=False, add_zero_attn=False, kdim=None, vdim=None): - super(MultiheadAttention, self).__init__() - self.embed_dim = embed_dim - self.kdim = kdim if kdim is not None else embed_dim - self.vdim = vdim if vdim is not None else embed_dim - self._qkv_same_embed_dim = self.kdim == embed_dim and self.vdim == embed_dim - - self.num_heads = num_heads - self.dropout = dropout - self.head_dim = embed_dim // num_heads - assert self.head_dim * \ - num_heads == self.embed_dim, "embed_dim must be divisible by num_heads" - - if self._qkv_same_embed_dim is False: - self.q_proj_weight = Parameter(torch.Tensor(embed_dim, embed_dim)) - self.k_proj_weight = Parameter(torch.Tensor(embed_dim, self.kdim)) - self.v_proj_weight = Parameter(torch.Tensor(embed_dim, self.vdim)) - self.register_parameter('in_proj_weight', None) - else: - self.in_proj_weight = Parameter( - torch.empty(3 * embed_dim, embed_dim)) - self.register_parameter('q_proj_weight', None) - self.register_parameter('k_proj_weight', None) - self.register_parameter('v_proj_weight', None) - - if bias: - self.in_proj_bias = Parameter(torch.empty(3 * embed_dim)) - else: - self.register_parameter('in_proj_bias', None) - self.out_proj = nn.Linear(embed_dim, embed_dim, bias=bias) - - if add_bias_kv: - self.bias_k = Parameter(torch.empty(1, 1, embed_dim)) - self.bias_v = Parameter(torch.empty(1, 1, embed_dim)) - else: - self.bias_k = self.bias_v = None - - self.add_zero_attn = add_zero_attn - - self._reset_parameters() - - def _reset_parameters(self): - if self._qkv_same_embed_dim: - xavier_uniform_(self.in_proj_weight) - else: - xavier_uniform_(self.q_proj_weight) - xavier_uniform_(self.k_proj_weight) - xavier_uniform_(self.v_proj_weight) - - if self.in_proj_bias is not None: - constant_(self.in_proj_bias, 0.) - constant_(self.out_proj.bias, 0.) - if self.bias_k is not None: - xavier_normal_(self.bias_k) - if self.bias_v is not None: - xavier_normal_(self.bias_v) - - def __setstate__(self, state): - # Support loading old MultiheadAttention checkpoints generated by v1.1.0 - if '_qkv_same_embed_dim' not in state: - state['_qkv_same_embed_dim'] = True - - super(MultiheadAttention, self).__setstate__(state) - - def forward(self, query, key, value, key_padding_mask=None, - need_weights=True, attn_mask=None): - if not self._qkv_same_embed_dim: - return multi_head_attention_forward( - query, key, value, self.embed_dim, self.num_heads, - self.in_proj_weight, self.in_proj_bias, - self.bias_k, self.bias_v, self.add_zero_attn, - self.dropout, self.out_proj.weight, self.out_proj.bias, - training=self.training, - key_padding_mask=key_padding_mask, need_weights=need_weights, - attn_mask=attn_mask, use_separate_proj_weight=True, - q_proj_weight=self.q_proj_weight, k_proj_weight=self.k_proj_weight, - v_proj_weight=self.v_proj_weight) - else: - return multi_head_attention_forward( - query, key, value, self.embed_dim, self.num_heads, - self.in_proj_weight, self.in_proj_bias, - self.bias_k, self.bias_v, self.add_zero_attn, - self.dropout, self.out_proj.weight, self.out_proj.bias, - training=self.training, - key_padding_mask=key_padding_mask, need_weights=need_weights, - attn_mask=attn_mask) + if query is key and key is value and in_proj_weight.is_cuda: + return torch.ops.nestedtensor.bt_min_mha(num_heads, + head_dim, + 0.5, + False, + query, + query, + query, + in_proj_weight, + in_proj_bias, + scaling, + out_proj_weight, + in_proj_bias), None + + return nestedtensor.nested.nested._wrap_result( + torch.ops.nestedtensor.min_mha(num_heads, + head_dim, + dropout_p, + training, + query._impl, + key._impl, + value._impl, + in_proj_weight, + in_proj_bias, + scaling, + out_proj_weight, + out_proj_bias)), None diff --git a/nestedtensor/nn/parameter.py b/nestedtensor/nn/parameter.py deleted file mode 100644 index e8a0bdd9..00000000 --- a/nestedtensor/nn/parameter.py +++ /dev/null @@ -1,47 +0,0 @@ -import torch -from torch._C import _disabled_torch_function_impl -from collections import OrderedDict -import nestedtensor - - -class Parameter(torch.Tensor): - r"""A kind of Tensor that is to be considered a module parameter. - - Parameters are :class:`~torch.Tensor` subclasses, that have a - very special property when used with :class:`Module` s - when they're - assigned as Module attributes they are automatically added to the list of - its parameters, and will appear e.g. in :meth:`~Module.parameters` iterator. - Assigning a Tensor doesn't have such effect. This is because one might - want to cache some temporary state, like last hidden state of the RNN, in - the model. If there was no such class as :class:`Parameter`, these - temporaries would get registered too. - - Arguments: - data (Tensor): parameter tensor. - requires_grad (bool, optional): if the parameter requires gradient. See - :ref:`excluding-subgraphs` for more details. Default: `True` - """ - def __new__(cls, data=None, requires_grad=True): - if data is None: - data = nestedtensor.NestedTensor(torch.Tensor()) - return nestedtensor.NestedTensor(data._impl) - - def __deepcopy__(self, memo): - if id(self) in memo: - return memo[id(self)] - else: - result = type(self)(self.data.clone(memory_format=torch.preserve_format), self.requires_grad) - memo[id(self)] = result - return result - - def __repr__(self): - return 'Parameter containing:\n' + super(Parameter, self).__repr__() - - def __reduce_ex__(self, proto): - # See Note [Don't serialize hooks] - return ( - torch._utils._rebuild_parameter, - (self.data, self.requires_grad, OrderedDict()) - ) - - __torch_function__ = _disabled_torch_function_impl diff --git a/nestedtensor/version.py b/nestedtensor/version.py index b817e3bf..022a7709 100644 --- a/nestedtensor/version.py +++ b/nestedtensor/version.py @@ -1,5 +1,5 @@ -__version__ = '0.0.1.dev20209114+46f958d' -git_version = '46f958d22011ae5ccfc538915db4ce2277d3f189' +__version__ = '0.1.4+5b45731' +git_version = '5b457313bfb6578b43d76282b321657bf85ee1b3' from nestedtensor import _C if hasattr(_C, 'CUDA_VERSION'): cuda = _C.CUDA_VERSION diff --git a/packaging/README.md b/packaging/README.md deleted file mode 100644 index bea52544..00000000 --- a/packaging/README.md +++ /dev/null @@ -1,90 +0,0 @@ -# Building nestedtensor packages for release - -## Anaconda packages - -### Linux - -```bash -nvidia-docker run -it --ipc=host --rm -v $(pwd):/remote soumith/conda-cuda bash -pushd remote/conda - -./build_vision.sh 9.0 -./build_vision.sh 10.0 -./build_vision.sh cpu - -# copy packages over to /remote -# exit docker -# anaconda upload -u pytorch nestedtensor*.bz2 -``` - -### OSX - -```bash -# create a fresh anaconda environment / install and activate it -conda install -y conda-build anaconda-client -./build_vision.sh cpu - -# copy packages over to /remote -# exit docker -# anaconda upload -u pytorch nestedtensor*.bz2 -``` - -### Windows - -```bash -# Open `Git Bash` and change dir to `conda` -./build_vision.sh 9.0 -./build_vision.sh 10.0 -./build_vision.sh cpu - -# copy packages to a output directory -# anaconda upload -u pytorch nestedtensor*.bz2 -``` - -## Wheels - -### Linux - -pushd wheel - -```bash -nvidia-docker run -it --ipc=host --rm -v $(pwd):/remote soumith/manylinux-cuda90:latest bash -cd remote -./linux_manywheel.sh cu90 - -rm -rf /usr/local/cuda* -./linux_manywheel.sh cpu -``` - -```bash -nvidia-docker run -it --ipc=host --rm -v $(pwd):/remote soumith/manylinux-cuda100:latest bash -cd remote -./linux_manywheel.sh cu100 -``` - -wheels are in the folders `cpu`, `cu90`, `cu100`. - -You can upload the `cu90` wheels to twine with `twine upload *.whl`. -Which wheels we upload depends on which wheels PyTorch uploads as default, and right now, it's `cu90`. - -### OSX - -```bash -pushd wheel -./osx_wheel.sh -``` - -### Windows - -```cmd -set PYTORCH_REPO=pytorch - -pushd windows -call build_vision.bat 90 0.3.0 1 -call build_vision.bat 100 0.3.0 1 -call build_vision.bat cpu 0.3.0 1 -``` - -wheels are in the current folder. - -You can upload them to twine with `twine upload *.whl` diff --git a/packaging/build_conda.sh b/packaging/build_conda.sh deleted file mode 100755 index 4f381a68..00000000 --- a/packaging/build_conda.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash -set -ex - -script_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" -. "$script_dir/pkg_helpers.bash" - -export BUILD_TYPE=conda -setup_env 0.8.0 -export SOURCE_ROOT_DIR="$PWD" -setup_conda_pytorch_constraint -setup_conda_cudatoolkit_constraint -setup_visual_studio_constraint -setup_junit_results_folder -conda build $CONDA_CHANNEL_FLAGS -c defaults -c conda-forge --no-anaconda-upload --python "$PYTHON_VERSION" packaging/nestedtensor diff --git a/packaging/build_wheel.sh b/packaging/build_wheel.sh index 9612e4d3..3117576b 100755 --- a/packaging/build_wheel.sh +++ b/packaging/build_wheel.sh @@ -1,39 +1,8 @@ -#!/bin/bash -set -ex +#!/usr/bin/env bash -script_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" -. "$script_dir/pkg_helpers.bash" +# Expects cuda 10.2 environment -export BUILD_TYPE=wheel -setup_env 0.8.0 -setup_wheel_python -pip_install numpy pyyaml future ninja -setup_pip_pytorch_version +WHEELS_FOLDER=${HOME}/project/wheels +mkdir -p $WHEELS_FOLDER python setup.py clean - -# Copy binaries to be included in the wheel distribution -if [[ "$(uname)" == Darwin || "$OSTYPE" == "msys" ]]; then - python_exec="$(which python)" - bin_path=$(dirname $python_exec) - env_path=$(dirname $bin_path) - if [[ "$(uname)" == Darwin ]]; then - # Include LibPNG - cp "$env_path/lib/libpng16.dylib" nestedtensor - # Include LibJPEG - cp "$env_path/lib/libjpeg.dylib" nestedtensor - else - cp "$bin_path/Library/bin/libpng16.dll" nestedtensor - cp "$bin_path/Library/bin/libjpeg.dll" nestedtensor - fi -else - # Include LibPNG - cp "/usr/lib64/libpng.so" nestedtensor - # Include LibJPEG - cp "/usr/lib64/libjpeg.so" nestedtensor -fi - -if [[ "$OSTYPE" == "msys" ]]; then - IS_WHEEL=1 "$script_dir/windows/internal/vc_env_helper.bat" python setup.py bdist_wheel -else - IS_WHEEL=1 python setup.py bdist_wheel -fi +PYTHON_VERSION="3.7" PYTORCH_VERSION="" UNICODE_ABI="" CU_VERSION="cpu" BUILD_VERSION="0.1.5.dev20210429" DEBUG=0 USE_NINJA=1 python setup.py develop bdist_wheel -d $WHEELS_FOLDER diff --git a/packaging/conda/build_vision.sh b/packaging/conda/build_vision.sh deleted file mode 100755 index 619ba743..00000000 --- a/packaging/conda/build_vision.sh +++ /dev/null @@ -1,229 +0,0 @@ -#!/usr/bin/env bash -if [[ -x "/remote/anaconda_token" ]]; then - . /remote/anaconda_token || true -fi - -set -ex - -if [[ "$CIRCLECI" == 'true' ]]; then - export PATH="/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.:$PATH" -fi - -# Function to retry functions that sometimes timeout or have flaky failures -retry () { - $* || (sleep 1 && $*) || (sleep 2 && $*) || (sleep 4 && $*) || (sleep 8 && $*) -} - -# Parse arguments and determmine version -########################################################### -if [[ -n "$DESIRED_CUDA" && -n "$TORCHVISION_BUILD_VERSION" && -n "$TORCHVISION_BUILD_NUMBER" ]]; then - desired_cuda="$DESIRED_CUDA" - build_version="$PYTORCH_BUILD_VERSION" - build_number="$PYTORCH_BUILD_NUMBER" -else - if [ "$#" -ne 3 ]; then - echo "Illegal number of parameters. Pass cuda version, pytorch version, build number" - echo "CUDA version should be Mm with no dot, e.g. '80'" - echo "DESIRED_PYTHON should be M.m, e.g. '2.7'" - exit 1 - fi - - desired_cuda="$1" - build_version="$2" - build_number="$3" -fi -if [[ "$desired_cuda" != cpu ]]; then - desired_cuda="$(echo $desired_cuda | tr -d cuda. )" -fi -echo "Building cuda version $desired_cuda and nestedtensor version: $build_version build_number: $build_number" - -if [[ "$desired_cuda" == 'cpu' ]]; then - cpu_only=1 - cuver="cpu" -else - # Switch desired_cuda to be M.m to be consistent with other scripts in - # pytorch/builder - export FORCE_CUDA=1 - cuda_nodot="$desired_cuda" - - if [[ ${#cuda_nodot} -eq 2 ]]; then - desired_cuda="${desired_cuda:0:1}.${desired_cuda:1:1}" - elif [[ ${#cuda_nodot} -eq 3 ]]; then - desired_cuda="${desired_cuda:0:2}.${desired_cuda:2:1}" - else - echo "unknown cuda version $cuda_nodot" - exit 1 - fi - - cuver="cu$cuda_nodot" -fi - -export TORCHVISION_BUILD_VERSION=$build_version -export TORCHVISION_BUILD_NUMBER=$build_number - -if [[ -z "$DESIRED_PYTHON" ]]; then - DESIRED_PYTHON=('3.5' '3.6' '3.7') -fi - -SOURCE_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" - -if [[ -z "$WIN_PACKAGE_WORK_DIR" ]]; then - WIN_PACKAGE_WORK_DIR="$(echo $(pwd -W) | tr '/' '\\')\\tmp_conda_$(date +%H%M%S)" -fi - -mkdir -p "$WIN_PACKAGE_WORK_DIR" || true -vision_rootdir="$(realpath ${WIN_PACKAGE_WORK_DIR})/nestedtensor-src" -git config --system core.longpaths true - -if [[ ! -d "$vision_rootdir" ]]; then - rm -rf "$vision_rootdir" - git clone "https://github.com/pytorch/vision" "$vision_rootdir" - pushd "$vision_rootdir" - git checkout $PYTORCH_BRANCH - popd -fi - -cd "$SOURCE_DIR" - -export tmp_conda="${WIN_PACKAGE_WORK_DIR}\\conda" -export miniconda_exe="${WIN_PACKAGE_WORK_DIR}\\miniconda.exe" -rm -rf "$tmp_conda" -rm -f "$miniconda_exe" -curl -sSk https://repo.anaconda.com/miniconda/Miniconda3-latest-Windows-x86_64.exe -o "$miniconda_exe" -"$SOURCE_DIR/install_conda.bat" && rm "$miniconda_exe" -pushd $tmp_conda -export PATH="$(pwd):$(pwd)/Library/usr/bin:$(pwd)/Library/bin:$(pwd)/Scripts:$(pwd)/bin:$PATH" -popd -retry conda install -yq conda-build - -ANACONDA_USER=pytorch-nightly -conda config --set anaconda_upload no - - -export TORCHVISION_PACKAGE_SUFFIX="" -if [[ "$desired_cuda" == 'cpu' ]]; then - export CONDA_CUDATOOLKIT_CONSTRAINT="" - export CONDA_CPUONLY_FEATURE="- cpuonly # [not osx]" - export CUDA_VERSION="None" -else - export CONDA_CPUONLY_FEATURE="" - . ./switch_cuda_version.sh $desired_cuda - if [[ "$desired_cuda" == "10.2" ]]; then - export CONDA_CUDATOOLKIT_CONSTRAINT="- cudatoolkit >=10.2,<10.3 # [not osx]" - elif [[ "$desired_cuda" == "10.1" ]]; then - export CONDA_CUDATOOLKIT_CONSTRAINT="- cudatoolkit >=10.1,<10.2 # [not osx]" - elif [[ "$desired_cuda" == "10.0" ]]; then - export CONDA_CUDATOOLKIT_CONSTRAINT="- cudatoolkit >=10.0,<10.1 # [not osx]" - elif [[ "$desired_cuda" == "9.2" ]]; then - export CONDA_CUDATOOLKIT_CONSTRAINT="- cudatoolkit >=9.2,<9.3 # [not osx]" - elif [[ "$desired_cuda" == "9.0" ]]; then - export CONDA_CUDATOOLKIT_CONSTRAINT="- cudatoolkit >=9.0,<9.1 # [not osx]" - elif [[ "$desired_cuda" == "8.0" ]]; then - export CONDA_CUDATOOLKIT_CONSTRAINT="- cudatoolkit >=8.0,<8.1 # [not osx]" - else - echo "unhandled desired_cuda: $desired_cuda" - exit 1 - fi -fi - -if [[ -z "$PYTORCH_VERSION" ]]; then - export CONDA_CHANNEL_FLAGS="-c pytorch-nightly" - export PYTORCH_VERSION="$(conda search --json 'pytorch[channel=pytorch-nightly]' | \ - python -c "import os, sys, json, re; cuver = '$cuver'; \ - cuver = cuver.replace('cu', 'cuda') if cuver != 'cpu' else cuver; \ - print(re.sub(r'\\+.*$', '', \ - [x['version'] for x in json.load(sys.stdin)['pytorch'] \ - if (x['platform'] == 'darwin' or cuver in x['fn']) \ - and 'py' + os.environ['DESIRED_PYTHON'] in x['fn']][-1]))")" - if [[ -z "$PYTORCH_VERSION" ]]; then - echo "PyTorch version auto detection failed" - echo "No package found for desired_cuda=$desired_cuda and DESIRED_PYTHON=$DESIRED_PYTHON" - exit 1 - fi -else - export CONDA_CHANNEL_FLAGS="-c pytorch -c pytorch-nightly" -fi -if [[ "$desired_cuda" == 'cpu' ]]; then - export CONDA_PYTORCH_BUILD_CONSTRAINT="- pytorch==$PYTORCH_VERSION" - export CONDA_PYTORCH_CONSTRAINT="- pytorch==$PYTORCH_VERSION" -else - export CONDA_PYTORCH_BUILD_CONSTRAINT="- pytorch==${PYTORCH_VERSION}" - export CONDA_PYTORCH_CONSTRAINT="- pytorch==${PYTORCH_VERSION}" -fi - -# Loop through all Python versions to build a package for each -for py_ver in "${DESIRED_PYTHON[@]}"; do - build_string="py${py_ver}_${build_string_suffix}" - folder_tag="${build_string}_$(date +'%Y%m%d')" - - # Create the conda package into this temporary folder. This is so we can find - # the package afterwards, as there's no easy way to extract the final filename - # from conda-build - output_folder="out_$folder_tag" - rm -rf "$output_folder" - mkdir "$output_folder" - - if [[ "$py_ver" == 3.5 ]]; then - export CONDA_TYPING_CONSTRAINT="- typing" - else - export CONDA_TYPING_CONSTRAINT="" - fi - - export VSTOOLCHAIN_PACKAGE=vs2017 - - # We need to build the compiler activation scripts first on Windows - time VSDEVCMD_ARGS=${VSDEVCMD_ARGS[@]} \ - conda build -c "$ANACONDA_USER" \ - --no-anaconda-upload \ - --output-folder "$output_folder" \ - ../$VSTOOLCHAIN_PACKAGE - - cp ../$VSTOOLCHAIN_PACKAGE/conda_build_config.yaml ../nestedtensor/conda_build_config.yaml - - conda config --set anaconda_upload no - echo "Calling conda-build at $(date)" - if [[ "$desired_cuda" == "9.2" ]]; then - time CMAKE_ARGS=${CMAKE_ARGS[@]} \ - BUILD_VERSION="$TORCHVISION_BUILD_VERSION" \ - CU_VERSION="$cuver" \ - SOURCE_ROOT_DIR="$vision_rootdir" \ - conda build -c "$ANACONDA_USER" \ - -c defaults \ - -c conda-forge \ - -c "numba/label/dev" \ - --no-anaconda-upload \ - --python "$py_ver" \ - --output-folder "$output_folder" \ - --no-verify \ - --no-test \ - ../nestedtensor - else - time CMAKE_ARGS=${CMAKE_ARGS[@]} \ - BUILD_VERSION="$TORCHVISION_BUILD_VERSION" \ - CU_VERSION="$cuver" \ - SOURCE_ROOT_DIR="$vision_rootdir" \ - conda build -c "$ANACONDA_USER" \ - -c defaults \ - -c conda-forge \ - --no-anaconda-upload \ - --python "$py_ver" \ - --output-folder "$output_folder" \ - --no-verify \ - --no-test \ - ../nestedtensor - fi - echo "Finished conda-build at $(date)" - - # Extract the package for testing - ls -lah "$output_folder" - built_package="$(find $output_folder/ -name '*nestedtensor*.tar.bz2')" - - # Copy the built package to the host machine for persistence before testing - if [[ -n "$PYTORCH_FINAL_PACKAGE_DIR" ]]; then - mkdir -p "$PYTORCH_FINAL_PACKAGE_DIR" || true - cp "$built_package" "$PYTORCH_FINAL_PACKAGE_DIR/" - fi -done - - -set +e diff --git a/packaging/conda/install_conda.bat b/packaging/conda/install_conda.bat deleted file mode 100644 index 6052ad08..00000000 --- a/packaging/conda/install_conda.bat +++ /dev/null @@ -1 +0,0 @@ -start /wait "" "%miniconda_exe%" /S /InstallationType=JustMe /RegisterPython=0 /AddToPath=0 /D=%tmp_conda% diff --git a/packaging/conda/switch_cuda_version.sh b/packaging/conda/switch_cuda_version.sh deleted file mode 100755 index 342def93..00000000 --- a/packaging/conda/switch_cuda_version.sh +++ /dev/null @@ -1,28 +0,0 @@ -if [[ "$OSTYPE" == "msys" ]]; then - CUDA_DIR="/c/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v$1" -else - CUDA_DIR="/usr/local/cuda-$1" -fi - -if ! ls "$CUDA_DIR" -then - echo "folder $CUDA_DIR not found to switch" -fi - -echo "Switching symlink to $CUDA_DIR" -mkdir -p /usr/local -rm -fr /usr/local/cuda -ln -s "$CUDA_DIR" /usr/local/cuda - -if [[ "$OSTYPE" == "msys" ]]; then - export CUDA_VERSION=`ls /usr/local/cuda/bin/cudart64*.dll | head -1 | tr '._' ' ' | cut -d ' ' -f2` - export CUDNN_VERSION=`ls /usr/local/cuda/bin/cudnn64*.dll | head -1 | tr '._' ' ' | cut -d ' ' -f2` -else - export CUDA_VERSION=$(ls /usr/local/cuda/lib64/libcudart.so.*|sort|tac | head -1 | rev | cut -d"." -f -3 | rev) - export CUDNN_VERSION=$(ls /usr/local/cuda/lib64/libcudnn.so.*|sort|tac | head -1 | rev | cut -d"." -f -3 | rev) -fi - -ls -alh /usr/local/cuda - -echo "CUDA_VERSION=$CUDA_VERSION" -echo "CUDNN_VERSION=$CUDNN_VERSION" diff --git a/packaging/nestedtensor/bld.bat b/packaging/nestedtensor/bld.bat deleted file mode 100644 index 609b2a39..00000000 --- a/packaging/nestedtensor/bld.bat +++ /dev/null @@ -1,27 +0,0 @@ -@echo on - -set TORCHVISION_BUILD_VERSION=%PKG_VERSION% -set TORCHVISION_BUILD_NUMBER=%PKG_BUILDNUM% - -set build_with_cuda= - -if "%CUDA_VERSION%" == "None" goto cuda_flags_end -if "%CUDA_VERSION%" == "cpu" goto cuda_flags_end -if "%CUDA_VERSION%" == "" goto cuda_flags_end - -set build_with_cuda=1 -set desired_cuda=%CUDA_VERSION:~0,-1%.%CUDA_VERSION:~-1,1% - -set CUDA_PATH=C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v%desired_cuda% -set CUDA_BIN_PATH=%CUDA_PATH%\bin -set NVCC_FLAGS=-D__CUDA_NO_HALF_OPERATORS__ --expt-relaxed-constexpr -if "%desired_cuda%" == "9.0" set NVCC_FLAGS=%NVCC_FLAGS% -gencode=arch=compute_35,code=sm_35 -gencode=arch=compute_50,code=sm_50 -gencode=arch=compute_60,code=sm_60 -gencode=arch=compute_70,code=sm_70 -gencode=arch=compute_50,code=compute_50 -if "%desired_cuda%" == "9.2" set NVCC_FLAGS=%NVCC_FLAGS% -gencode=arch=compute_35,code=sm_35 -gencode=arch=compute_50,code=sm_50 -gencode=arch=compute_60,code=sm_60 -gencode=arch=compute_61,code=sm_61 -gencode=arch=compute_70,code=sm_70 -gencode=arch=compute_50,code=compute_50 -if "%desired_cuda%" == "10.0" set NVCC_FLAGS=%NVCC_FLAGS% -gencode=arch=compute_35,code=sm_35 -gencode=arch=compute_50,code=sm_50 -gencode=arch=compute_60,code=sm_60 -gencode=arch=compute_70,code=sm_70 -gencode=arch=compute_75,code=sm_75 -gencode=arch=compute_50,code=compute_50 -if "%desired_cuda%" == "10.1" set NVCC_FLAGS=%NVCC_FLAGS% -gencode=arch=compute_35,code=sm_35 -gencode=arch=compute_50,code=sm_50 -gencode=arch=compute_60,code=sm_60 -gencode=arch=compute_70,code=sm_70 -gencode=arch=compute_75,code=sm_75 -gencode=arch=compute_50,code=compute_50 -if "%desired_cuda%" == "10.2" set NVCC_FLAGS=%NVCC_FLAGS% -gencode=arch=compute_35,code=sm_35 -gencode=arch=compute_50,code=sm_50 -gencode=arch=compute_60,code=sm_60 -gencode=arch=compute_70,code=sm_70 -gencode=arch=compute_75,code=sm_75 -gencode=arch=compute_50,code=compute_50 - -:cuda_flags_end - -python setup.py install --single-version-externally-managed --record=record.txt -if errorlevel 1 exit /b 1 diff --git a/packaging/nestedtensor/conda_build_config.yaml b/packaging/nestedtensor/conda_build_config.yaml deleted file mode 100644 index 5188bb0e..00000000 --- a/packaging/nestedtensor/conda_build_config.yaml +++ /dev/null @@ -1,24 +0,0 @@ -blas_impl: - - mkl # [x86_64] -c_compiler: - - vs2017 # [win] -cxx_compiler: - - vs2017 # [win] -python: - - 3.5 - - 3.6 -# This differs from target_platform in that it determines what subdir the compiler -# will target, not what subdir the compiler package will be itself. -# For example, we need a win-64 vs2008_win-32 package, so that we compile win-32 -# code on win-64 miniconda. -cross_compiler_target_platform: - - win-64 # [win] -target_platform: - - win-64 # [win] -vc: - - 14 -zip_keys: - - # [win] - - vc # [win] - - c_compiler # [win] - - cxx_compiler # [win] diff --git a/packaging/nestedtensor/meta.yaml b/packaging/nestedtensor/meta.yaml deleted file mode 100644 index e056227f..00000000 --- a/packaging/nestedtensor/meta.yaml +++ /dev/null @@ -1,58 +0,0 @@ -package: - name: nestedtensor - version: "{{ environ.get('BUILD_VERSION') }}" - -source: - path: "{{ environ.get('SOURCE_ROOT_DIR') }}" - -requirements: - build: - - {{ compiler('c') }} # [win] - - libpng - - jpeg - - host: - - python - - setuptools - {{ environ.get('CONDA_PYTORCH_BUILD_CONSTRAINT') }} - {{ environ.get('CONDA_CUDATOOLKIT_CONSTRAINT') }} - {{ environ.get('CONDA_CPUONLY_FEATURE') }} - - run: - - python - - libpng - - jpeg - - pillow >=4.1.1 - - numpy >=1.11 - {{ environ.get('CONDA_PYTORCH_CONSTRAINT') }} - {{ environ.get('CONDA_CUDATOOLKIT_CONSTRAINT') }} - -build: - string: py{{py}}_{{ environ['CU_VERSION'] }} - script: python setup.py install --single-version-externally-managed --record=record.txt # [not win] - script_env: - - CUDA_HOME - - FORCE_CUDA - - NVCC_FLAGS - - BUILD_VERSION - features: - {{ environ.get('CONDA_CPUONLY_FEATURE') }} - -test: - imports: - - nestedtensor - source_files: - - test - requires: - - pytest - - scipy - - av - - ca-certificates - {{ environ.get('CONDA_TYPING_CONSTRAINT') }} - - -about: - home: https://github.com/pytorch/vision - license: BSD - license_file: LICENSE - summary: 'image and video datasets and models for torch deep learning' diff --git a/packaging/pkg_helpers.bash b/packaging/pkg_helpers.bash deleted file mode 100644 index 1925343e..00000000 --- a/packaging/pkg_helpers.bash +++ /dev/null @@ -1,305 +0,0 @@ -# A set of useful bash functions for common functionality we need to do in -# many build scripts - - -# Setup CUDA environment variables, based on CU_VERSION -# -# Inputs: -# CU_VERSION (cpu, cu92, cu100) -# NO_CUDA_PACKAGE (bool) -# BUILD_TYPE (conda, wheel) -# -# Outputs: -# VERSION_SUFFIX (e.g., "") -# PYTORCH_VERSION_SUFFIX (e.g., +cpu) -# WHEEL_DIR (e.g., cu100/) -# CUDA_HOME (e.g., /usr/local/cuda-9.2, respected by torch.utils.cpp_extension) -# FORCE_CUDA (respected by nestedtensor setup.py) -# NVCC_FLAGS (respected by nestedtensor setup.py) -# -# Precondition: CUDA versions are installed in their conventional locations in -# /usr/local/cuda-* -# -# NOTE: Why VERSION_SUFFIX versus PYTORCH_VERSION_SUFFIX? If you're building -# a package with CUDA on a platform we support CUDA on, VERSION_SUFFIX == -# PYTORCH_VERSION_SUFFIX and everyone is happy. However, if you are building a -# package with only CPU bits (e.g., torchaudio), then VERSION_SUFFIX is always -# empty, but PYTORCH_VERSION_SUFFIX is +cpu (because that's how you get a CPU -# version of a Python package. But that doesn't apply if you're on OS X, -# since the default CU_VERSION on OS X is cpu. -setup_cuda() { - - # First, compute version suffixes. By default, assume no version suffixes - export VERSION_SUFFIX="" - export PYTORCH_VERSION_SUFFIX="" - export WHEEL_DIR="" - # Wheel builds need suffixes (but not if they're on OS X, which never has suffix) - if [[ "$BUILD_TYPE" == "wheel" ]] && [[ "$(uname)" != Darwin ]]; then - # The default CUDA has no suffix - if [[ "$CU_VERSION" != "cu102" ]]; then - export PYTORCH_VERSION_SUFFIX="+$CU_VERSION" - fi - # Match the suffix scheme of pytorch, unless this package does not have - # CUDA builds (in which case, use default) - if [[ -z "$NO_CUDA_PACKAGE" ]]; then - export VERSION_SUFFIX="$PYTORCH_VERSION_SUFFIX" - export WHEEL_DIR="$CU_VERSION/" - fi - fi - - # Now work out the CUDA settings - case "$CU_VERSION" in - cu102) - if [[ "$OSTYPE" == "msys" ]]; then - export CUDA_HOME="C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v10.2" - else - export CUDA_HOME=/usr/local/cuda-10.2/ - fi - export FORCE_CUDA=1 - # Hard-coding gencode flags is temporary situation until - # https://github.com/pytorch/pytorch/pull/23408 lands - export NVCC_FLAGS="-gencode=arch=compute_35,code=sm_35 -gencode=arch=compute_50,code=sm_50 -gencode=arch=compute_60,code=sm_60 -gencode=arch=compute_70,code=sm_70 -gencode=arch=compute_75,code=sm_75 -gencode=arch=compute_50,code=compute_50" - ;; - cu101) - if [[ "$OSTYPE" == "msys" ]]; then - export CUDA_HOME="C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v10.1" - else - export CUDA_HOME=/usr/local/cuda-10.1/ - fi - export FORCE_CUDA=1 - # Hard-coding gencode flags is temporary situation until - # https://github.com/pytorch/pytorch/pull/23408 lands - export NVCC_FLAGS="-gencode=arch=compute_35,code=sm_35 -gencode=arch=compute_50,code=sm_50 -gencode=arch=compute_60,code=sm_60 -gencode=arch=compute_70,code=sm_70 -gencode=arch=compute_75,code=sm_75 -gencode=arch=compute_50,code=compute_50" - ;; - cu100) - if [[ "$OSTYPE" == "msys" ]]; then - export CUDA_HOME="C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v10.0" - else - export CUDA_HOME=/usr/local/cuda-10.0/ - fi - export FORCE_CUDA=1 - # Hard-coding gencode flags is temporary situation until - # https://github.com/pytorch/pytorch/pull/23408 lands - export NVCC_FLAGS="-gencode=arch=compute_35,code=sm_35 -gencode=arch=compute_50,code=sm_50 -gencode=arch=compute_60,code=sm_60 -gencode=arch=compute_70,code=sm_70 -gencode=arch=compute_75,code=sm_75 -gencode=arch=compute_50,code=compute_50" - ;; - cu92) - if [[ "$OSTYPE" == "msys" ]]; then - export CUDA_HOME="C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v9.2" - else - export CUDA_HOME=/usr/local/cuda-9.2/ - fi - export FORCE_CUDA=1 - export NVCC_FLAGS="-gencode=arch=compute_35,code=sm_35 -gencode=arch=compute_50,code=sm_50 -gencode=arch=compute_60,code=sm_60 -gencode=arch=compute_70,code=sm_70 -gencode=arch=compute_50,code=compute_50" - ;; - cpu) - ;; - *) - echo "Unrecognized CU_VERSION=$CU_VERSION" - exit 1 - ;; - esac -} - -# Populate build version if necessary, and add version suffix -# -# Inputs: -# BUILD_VERSION (e.g., 0.2.0 or empty) -# VERSION_SUFFIX (e.g., +cpu) -# -# Outputs: -# BUILD_VERSION (e.g., 0.2.0.dev20190807+cpu) -# -# Fill BUILD_VERSION if it doesn't exist already with a nightly string -# Usage: setup_build_version 0.2.0 -setup_build_version() { - if [[ -z "$BUILD_VERSION" ]]; then - export BUILD_VERSION="$1.dev$(date "+%Y%m%d")$VERSION_SUFFIX" - else - export BUILD_VERSION="$BUILD_VERSION$VERSION_SUFFIX" - fi - - # Set build version based on tag if on tag - if [[ -n "${CIRCLE_TAG}" ]]; then - # Strip tag - export BUILD_VERSION="$(echo "${CIRCLE_TAG}" | sed -e 's/^v//' -e 's/-.*$//')" - fi -} - -# Set some useful variables for OS X, if applicable -setup_macos() { - if [[ "$(uname)" == Darwin ]]; then - export MACOSX_DEPLOYMENT_TARGET=10.9 CC=clang CXX=clang++ - fi -} - -# set variable to determine whether the typing library needs to be built in -setup_typing() { - if [[ "$PYTHON_VERSION" == 3.5 ]]; then - export CONDA_TYPING_CONSTRAINT="- typing" - else - export CONDA_TYPING_CONSTRAINT="" - fi -} - -# Top-level entry point for things every package will need to do -# -# Usage: setup_env 0.2.0 -setup_env() { - setup_cuda - setup_build_version "$1" - setup_macos - setup_typing -} - -# Function to retry functions that sometimes timeout or have flaky failures -retry () { - $* || (sleep 1 && $*) || (sleep 2 && $*) || (sleep 4 && $*) || (sleep 8 && $*) -} - -# Inputs: -# PYTHON_VERSION (2.7, 3.5, 3.6, 3.7) -# UNICODE_ABI (bool) -# -# Outputs: -# PATH modified to put correct Python version in PATH -# -# Precondition: If Linux, you are in a soumith/manylinux-cuda* Docker image -setup_wheel_python() { - if [[ "$(uname)" == Darwin || "$OSTYPE" == "msys" ]]; then - eval "$(conda shell.bash hook)" - conda env remove -n "env$PYTHON_VERSION" || true - conda create -yn "env$PYTHON_VERSION" python="$PYTHON_VERSION" - conda activate "env$PYTHON_VERSION" - # Install libpng from Anaconda (defaults) - conda install libpng jpeg -y - else - # Install native CentOS libPNG - yum install -y libpng-devel libjpeg-turbo-devel - case "$PYTHON_VERSION" in - 2.7) - if [[ -n "$UNICODE_ABI" ]]; then - python_abi=cp27-cp27mu - else - python_abi=cp27-cp27m - fi - ;; - 3.5) python_abi=cp35-cp35m ;; - 3.6) python_abi=cp36-cp36m ;; - 3.7) python_abi=cp37-cp37m ;; - 3.8) python_abi=cp38-cp38 ;; - *) - echo "Unrecognized PYTHON_VERSION=$PYTHON_VERSION" - exit 1 - ;; - esac - export PATH="/opt/python/$python_abi/bin:$PATH" - fi -} - -# Install with pip a bit more robustly than the default -pip_install() { - retry pip install --progress-bar off "$@" -} - -# Install torch with pip, respecting PYTORCH_VERSION, and record the installed -# version into PYTORCH_VERSION, if applicable -setup_pip_pytorch_version() { - if [[ -z "$PYTORCH_VERSION" ]]; then - # Install latest prerelease version of torch, per our nightlies, consistent - # with the requested cuda version - pip_install --pre torch -f "https://download.pytorch.org/whl/nightly/${WHEEL_DIR}torch_nightly.html" - if [[ "$CUDA_VERSION" == "cpu" ]]; then - # CUDA and CPU are ABI compatible on the CPU-only parts, so strip - # in this case - export PYTORCH_VERSION="$(pip show torch | grep ^Version: | sed 's/Version: *//' | sed 's/+.\+//')" - else - export PYTORCH_VERSION="$(pip show torch | grep ^Version: | sed 's/Version: *//')" - fi - else - pip_install "torch==$PYTORCH_VERSION$PYTORCH_VERSION_SUFFIX" \ - -f https://download.pytorch.org/whl/torch_stable.html \ - -f https://download.pytorch.org/whl/test/torch_test.html \ - -f https://download.pytorch.org/whl/nightly/torch_nightly.html - fi -} - -# Fill PYTORCH_VERSION with the latest conda nightly version, and -# CONDA_CHANNEL_FLAGS with appropriate flags to retrieve these versions -# -# You MUST have populated PYTORCH_VERSION_SUFFIX before hand. -setup_conda_pytorch_constraint() { - if [[ -z "$PYTORCH_VERSION" ]]; then - export CONDA_CHANNEL_FLAGS="-c pytorch-nightly" - export PYTORCH_VERSION="$(conda search --json 'pytorch[channel=pytorch-nightly]' | \ - python -c "import os, sys, json, re; cuver = os.environ.get('CU_VERSION'); \ - cuver_1 = cuver.replace('cu', 'cuda') if cuver != 'cpu' else cuver; \ - cuver_2 = (cuver[:-1] + '.' + cuver[-1]).replace('cu', 'cuda') if cuver != 'cpu' else cuver; \ - print(re.sub(r'\\+.*$', '', \ - [x['version'] for x in json.load(sys.stdin)['pytorch'] \ - if (x['platform'] == 'darwin' or cuver_1 in x['fn'] or cuver_2 in x['fn']) \ - and 'py' + os.environ['PYTHON_VERSION'] in x['fn']][-1]))")" - if [[ -z "$PYTORCH_VERSION" ]]; then - echo "PyTorch version auto detection failed" - echo "No package found for CU_VERSION=$CU_VERSION and PYTHON_VERSION=$PYTHON_VERSION" - exit 1 - fi - else - export CONDA_CHANNEL_FLAGS="-c pytorch -c pytorch-nightly -c pytorch-test" - fi - if [[ "$CU_VERSION" == cpu ]]; then - export CONDA_PYTORCH_BUILD_CONSTRAINT="- pytorch==$PYTORCH_VERSION${PYTORCH_VERSION_SUFFIX}" - export CONDA_PYTORCH_CONSTRAINT="- pytorch==$PYTORCH_VERSION" - else - export CONDA_PYTORCH_BUILD_CONSTRAINT="- pytorch==${PYTORCH_VERSION}${PYTORCH_VERSION_SUFFIX}" - export CONDA_PYTORCH_CONSTRAINT="- pytorch==${PYTORCH_VERSION}${PYTORCH_VERSION_SUFFIX}" - fi - if [[ "$OSTYPE" == msys && "$CU_VERSION" == cu92 ]]; then - export CONDA_CHANNEL_FLAGS="${CONDA_CHANNEL_FLAGS} -c defaults -c numba/label/dev" - fi -} - -# Translate CUDA_VERSION into CUDA_CUDATOOLKIT_CONSTRAINT -setup_conda_cudatoolkit_constraint() { - export CONDA_CPUONLY_FEATURE="" - if [[ "$(uname)" == Darwin ]]; then - export CONDA_CUDATOOLKIT_CONSTRAINT="" - else - case "$CU_VERSION" in - cu102) - export CONDA_CUDATOOLKIT_CONSTRAINT="- cudatoolkit >=10.2,<10.3 # [not osx]" - ;; - cu101) - export CONDA_CUDATOOLKIT_CONSTRAINT="- cudatoolkit >=10.1,<10.2 # [not osx]" - ;; - cu100) - export CONDA_CUDATOOLKIT_CONSTRAINT="- cudatoolkit >=10.0,<10.1 # [not osx]" - ;; - cu92) - export CONDA_CUDATOOLKIT_CONSTRAINT="- cudatoolkit >=9.2,<9.3 # [not osx]" - ;; - cpu) - export CONDA_CUDATOOLKIT_CONSTRAINT="" - export CONDA_CPUONLY_FEATURE="- cpuonly" - ;; - *) - echo "Unrecognized CU_VERSION=$CU_VERSION" - exit 1 - ;; - esac - fi -} - -# Build the proper compiler package before building the final package -setup_visual_studio_constraint() { - if [[ "$OSTYPE" == "msys" ]]; then - export VSTOOLCHAIN_PACKAGE=vs$VC_YEAR - conda build $CONDA_CHANNEL_FLAGS --no-anaconda-upload packaging/$VSTOOLCHAIN_PACKAGE - cp packaging/$VSTOOLCHAIN_PACKAGE/conda_build_config.yaml packaging/nestedtensor/conda_build_config.yaml - fi -} - -setup_junit_results_folder() { - if [[ "$CI" == "true" ]]; then - export CONDA_PYTORCH_BUILD_RESULTS_DIRECTORY="${SOURCE_ROOT_DIR}/build_results/results.xml" - fi -} diff --git a/packaging/wheel/linux_manywheel.sh b/packaging/wheel/linux_manywheel.sh deleted file mode 100644 index 19e7d1a7..00000000 --- a/packaging/wheel/linux_manywheel.sh +++ /dev/null @@ -1,62 +0,0 @@ -#!/bin/bash -set -ex - -if [ "$#" -ne 1 ]; then - echo "Illegal number of parameters. Pass cuda version" - echo "CUDA version should be cu92, cu100 or cpu" - exit 1 -fi -export CUVER="$1" # cu[0-9]* cpu - -if [[ "$CUVER" == "cu102" ]]; then - cu_suffix="" -else - cu_suffix="+$CUVER" -fi - -export TORCHVISION_BUILD_VERSION="0.4.0.dev$(date "+%Y%m%d")${cu_suffix}" -export TORCHVISION_BUILD_NUMBER="1" -export TORCHVISION_LOCAL_VERSION_LABEL="$CUVER" -export OUT_DIR="/remote/$CUVER" - -pushd /opt/python -DESIRED_PYTHON=(*/) -popd -for desired_py in "${DESIRED_PYTHON[@]}"; do - python_installations+=("/opt/python/$desired_py") -done - -OLD_PATH=$PATH -cd /tmp -rm -rf vision -git clone https://github.com/pytorch/vision - -cd /tmp/vision - -for PYDIR in "${python_installations[@]}"; do - export PATH=$PYDIR/bin:$OLD_PATH - pip install --upgrade pip - pip install numpy pyyaml future - - pip uninstall -y torch || true - pip uninstall -y torch_nightly || true - - export TORCHVISION_PYTORCH_DEPENDENCY_NAME=torch_nightly - pip install torch_nightly -f https://download.pytorch.org/whl/nightly/$CUVER/torch_nightly.html - # CPU/CUDA variants of PyTorch have ABI compatible PyTorch for - # the CPU only bits. Therefore, we - # strip off the local package qualifier, but ONLY if we're - # doing a CPU build. - if [[ "$CUVER" == "cpu" ]]; then - export TORCHVISION_PYTORCH_DEPENDENCY_VERSION="$(pip show torch_nightly | grep ^Version: | sed 's/Version: \+//' | sed 's/+.\+//')" - else - export TORCHVISION_PYTORCH_DEPENDENCY_VERSION="$(pip show torch_nightly | grep ^Version: | sed 's/Version: \+//')" - fi - echo "Building against ${TORCHVISION_PYTORCH_DEPENDENCY_VERSION}" - - pip install ninja - python setup.py clean - python setup.py bdist_wheel - mkdir -p $OUT_DIR - cp dist/*.whl $OUT_DIR/ -done diff --git a/packaging/wheel/osx_wheel.sh b/packaging/wheel/osx_wheel.sh deleted file mode 100644 index 4e2ff53f..00000000 --- a/packaging/wheel/osx_wheel.sh +++ /dev/null @@ -1,52 +0,0 @@ -if [[ ":$PATH:" == *"conda"* ]]; then - echo "existing anaconda install in PATH, remove it and run script" - exit 1 -fi -# download and activate anaconda -rm -rf ~/minconda_wheel_env_tmp -wget -q https://repo.anaconda.com/miniconda/Miniconda3-latest-MacOSX-x86_64.sh && \ - chmod +x Miniconda3-latest-MacOSX-x86_64.sh && \ - ./Miniconda3-latest-MacOSX-x86_64.sh -b -p ~/minconda_wheel_env_tmp && \ - rm Miniconda3-latest-MacOSX-x86_64.sh - -. ~/minconda_wheel_env_tmp/bin/activate - - -export TORCHVISION_BUILD_VERSION="0.4.0.dev$(date "+%Y%m%d")" -export TORCHVISION_BUILD_NUMBER="1" -export OUT_DIR=~/nestedtensor_wheels - -export MACOSX_DEPLOYMENT_TARGET=10.9 CC=clang CXX=clang++ - -pushd /tmp -rm -rf vision -git clone https://github.com/pytorch/vision -pushd vision - -desired_pythons=( "2.7" "3.5" "3.6" "3.7" ) -# for each python -for desired_python in "${desired_pythons[@]}" -do - # create and activate python env - env_name="env$desired_python" - conda create -yn $env_name python="$desired_python" - conda activate $env_name - - pip uninstall -y torch || true - pip uninstall -y torch_nightly || true - - export TORCHVISION_PYTORCH_DEPENDENCY_NAME=torch_nightly - pip install torch_nightly -f https://download.pytorch.org/whl/nightly/cpu/torch_nightly.html - export TORCHVISION_PYTORCH_DEPENDENCY_VERSION="$(pip show torch_nightly | grep ^Version: | sed 's/Version: *//')" - echo "Building against ${TORCHAUDIO_PYTORCH_DEPENDENCY_VERSION}" - - # install nestedtensor dependencies - pip install ninja scipy pytest - - python setup.py clean - python setup.py bdist_wheel - mkdir -p $OUT_DIR - cp dist/*.whl $OUT_DIR/ -done -popd -popd diff --git a/requirements.txt b/requirements.txt index 23d95fdc..9f678bd1 100644 --- a/requirements.txt +++ b/requirements.txt @@ -8,7 +8,3 @@ pytest # Lets pytest find our code by automatically modifying PYTHONPATH pytest-pythonpath - -# Coverage statistics -pytest-cov -codecov diff --git a/setup.py b/setup.py index 8353bc6c..8da2965e 100644 --- a/setup.py +++ b/setup.py @@ -1,5 +1,4 @@ import setuptools -import datetime import torch import distutils.command.clean import shutil @@ -25,13 +24,7 @@ def read(*names, **kwargs): return fp.read() -latest_release = "0.0.1" - -dt = datetime.datetime.utcnow() -package_version = "{0}.dev{1}{2}{3}{4}".format( - latest_release, dt.year, dt.month, dt.day, dt.hour -) - +version = "0.1.4" sha = "Unknown" package_name = "nestedtensor" @@ -46,12 +39,11 @@ def read(*names, **kwargs): except Exception: pass -if os.getenv("BUILD_VERSION"): +if os.getenv("BUILD_VERSION") is not None: version = os.getenv("BUILD_VERSION") elif sha != "Unknown": - version = package_version + "+" + sha[:7] -else: - version = package_version + version = version + "+" + sha[:7] + print("Building wheel {}-{}".format(package_name, version)) @@ -71,13 +63,12 @@ def write_version_file(): pytorch_dep = "torch" -requirements = [ - pytorch_dep, -] - if os.getenv("PYTORCH_VERSION"): pytorch_dep += "==" + os.getenv("PYTORCH_VERSION") +requirements = [ + pytorch_dep, +] def get_extensions(): @@ -88,7 +79,8 @@ def get_extensions(): extra_link_args = [] extra_compile_args = {"cxx": ["-O3", "-g", "-std=c++14"]} if int(os.environ.get("DEBUG", 0)): - extra_compile_args = {"cxx": ["-O0", "-fno-inline", "-g", "-std=c++14"]} + extra_compile_args = { + "cxx": ["-O0", "-fno-inline", "-g", "-std=c++14"]} extra_link_args = ["-O0", "-g"] if (torch.cuda.is_available() and CUDA_HOME is not None) or os.getenv( "FORCE_CUDA", "0" @@ -108,6 +100,7 @@ def get_extensions(): this_dir = os.path.dirname(os.path.abspath(__file__)) extensions_dir = os.path.join(this_dir, "nestedtensor", "csrc") utils_dir = os.path.join(extensions_dir, "utils") + cuda_dir = os.path.join(this_dir, "nestedtensor", "csrc", "cuda") extension_sources = set( os.path.join(extensions_dir, p) @@ -117,7 +110,18 @@ def get_extensions(): os.path.join(utils_dir, p) for p in glob.glob(os.path.join(utils_dir, "*.cpp")) ) - sources = list(set(extension_sources) | set(utils_sources)) + if (torch.cuda.is_available() and CUDA_HOME is not None) or os.getenv( + "FORCE_CUDA", "0" + ) == "1": + cuda_sources = set( + os.path.join(cuda_dir, p) for p in glob.glob(os.path.join(cuda_dir, "*.cu")) + ) + cuda_cpp_sources = set( + os.path.join(cuda_dir, p) for p in glob.glob(os.path.join(cuda_dir, "*.cpp")) + ) + sources = list(set(extension_sources) | set(utils_sources) | set(cuda_sources) | set(cuda_cpp_sources)) + else: + sources = list(set(extension_sources) | set(utils_sources)) include_dirs = [extensions_dir, utils_dir] @@ -152,7 +156,7 @@ def run(self): setuptools.setup( name=package_name, - version=package_version, + version=version, author="Christian Puhrsch", author_email="cpuhrsch@fb.com", description="NestedTensors for PyTorch", @@ -168,7 +172,8 @@ def run(self): cmdclass={ "clean": clean, "build_ext": BuildExtension.with_options( - use_ninja=os.environ.get("NT_USE_NINJA", False) + no_python_abi_suffix=True, + use_ninja=os.environ.get("USE_NINJA", False) ), }, install_requires=requirements, diff --git a/test/detr_nestedtensor.py b/test/detr_nestedtensor.py index cf9e6829..a1d3e376 100644 --- a/test/detr_nestedtensor.py +++ b/test/detr_nestedtensor.py @@ -1,7 +1,6 @@ import torch import nestedtensor import utils -import torchvision from torch.nn import functional as F import random diff --git a/test/frozen_batch_norm_2d.py b/test/frozen_batch_norm_2d.py index b090027c..9cb6a783 100644 --- a/test/frozen_batch_norm_2d.py +++ b/test/frozen_batch_norm_2d.py @@ -5,11 +5,9 @@ import torch import nestedtensor import unittest -from utils import TestCase +from utils_test_case import TestCase import random import utils -import torchvision -from torchvision.models._utils import IntermediateLayerGetter class NTFrozenBatchNorm2d(torch.nn.Module): """ diff --git a/test/joiner.py b/test/joiner.py index 5e2eb02e..4230056b 100644 --- a/test/joiner.py +++ b/test/joiner.py @@ -5,11 +5,9 @@ import torch import nestedtensor import unittest -from utils import TestCase +from utils_test_case import TestCase import random import utils -import torchvision -from torchvision.models._utils import IntermediateLayerGetter from torch import nn import math @@ -19,9 +17,9 @@ def __init__(self, backbone, position_embedding): def forward(self, tensor_list: nestedtensor.NestedTensor): xs = self[0](tensor_list) - out: List[NestedTensor] = [] + out = [] pos = [] - for name, x in xs.items(): + for _, x in xs.items(): out.append(x) pos.append(self[1](x)) diff --git a/test/position_encoding.py b/test/position_encoding.py index 487a185e..7d092ce2 100644 --- a/test/position_encoding.py +++ b/test/position_encoding.py @@ -1,15 +1,5 @@ -import traceback -import functools -import pdb -import sys import torch import nestedtensor -import unittest -from utils import TestCase -import random -import utils -import torchvision -from torchvision.models._utils import IntermediateLayerGetter from torch import nn import math diff --git a/test/test_coverage.py b/test/test_coverage.py new file mode 100644 index 00000000..76e8f9f1 --- /dev/null +++ b/test/test_coverage.py @@ -0,0 +1,57 @@ +import torch +import nestedtensor +import unittest +from torch.nn import functional as F +from torch import nn + +from utils_test_case import TestCase + + +def ntnt(x): return nestedtensor.nested_tensor(x, requires_grad=True) +def ntnt_nograd(x): return nestedtensor.nested_tensor(x, requires_grad=False) + + +# Various smoke tests to confirm coverage of an operator + +class TestCoverage(TestCase): + + @unittest.skip("Fails for strange reason") + @torch.inference_mode() + def test_issues_313(self): + # Based on https://github.com/pytorch/nestedtensor/issues/313 + + def model(x): + torch.manual_seed(20) + linear = nn.Linear(9, 64) + norm = nn.BatchNorm1d(64).eval() + # 3 voxel with 40, 50 and 90 points respectively + x = linear(x) + x = norm(x.transpose(2, 1).contiguous() + ).transpose(2, 1).contiguous() + x = F.relu(x) + return torch.max(x, dim=1, keepdim=True)[0] + + inputs = [torch.randn(i, 9) for i in [40, 50, 90]] + model(ntnt_nograd(inputs)) + + inputs = [torch.randn(30, 9) for _ in range(3)] + x0 = model(ntnt_nograd(inputs)) + x1 = model(torch.stack(inputs)) + self.assertEqual(torch.stack(x0.unbind()), x1) + + @unittest.skip("Fails for strange reason") + @torch.inference_mode() + def test_pytorch_commit_56017(self): + # Based on https://github.com/pytorch/nestedtensor/issues/313 + + nn.Linear(9, 64) + # inputs = [torch.randn(i, 3) for i in [4, 5, 9]] + # x0 = ntnt_nograd(inputs) + # print(x0) + # del inputs + # x0 = x0 + x0 + # print(x0) + + +if __name__ == "__main__": + unittest.main() diff --git a/test/test_nested_tensor_autograd.py b/test/test_nested_tensor_autograd.py index 08433dd2..c95675da 100644 --- a/test/test_nested_tensor_autograd.py +++ b/test/test_nested_tensor_autograd.py @@ -1,16 +1,42 @@ -import traceback -import functools -import pdb -import sys import torch import nestedtensor import unittest -import random -from utils import TestCase +from utils_test_case import TestCase + + +def ntnt(x): return nestedtensor.nested_tensor(x, requires_grad=True) +def ntnt_nograd(x): return nestedtensor.nested_tensor(x) class TestNestedTensorAutograd(TestCase): + + @unittest.skip("Requires autograd support") + def test_autograd_size_equal_nt(self): + # TODO: Right now this only exercises the mechanisms + a = ntnt([torch.randn(1, 2)]) + s = a.sum() + s.backward() + + a = ntnt([torch.randn(1, 2), torch.randn(2, 1)]) + b = ntnt([torch.randn(1, 2), torch.randn(2, 1)]) + c = a + b + c.backward(a) + + a = ntnt([torch.randn(1, 2), torch.randn(2, 1)]) + t0 = torch.randn(2, 2, requires_grad=True) + d = t0 + a + d.sum().backward() + + t1 = torch.randn(1, 2, requires_grad=True) + t1.sum().backward() + + e = ntnt([torch.randn(1, 2), torch.randn(2, 1)]) + a0 = a + b + a1 = a0 + e + a2 = a1.sum() + + @unittest.skip("Requires autograd support") def test_basic_grad(self): def some_func(x): return torch.sum(x ** 2 + x ** 3) @@ -36,7 +62,7 @@ def some_func(x): # nested_tensor constructor tensor2 = torch.tensor( [[1, 2], [3, 4]], dtype=torch.float, requires_grad=True) - nt2 = nestedtensor.nested_tensor([tensor2]) #, requires_grad=True) + nt2 = nestedtensor.nested_tensor([tensor2]) # , requires_grad=True) nt_sum_res2 = some_func(nt2) # TODO: Re-enable under autograd self.assertRaises(RuntimeError, lambda: nt_sum_res2.backward()) @@ -45,14 +71,15 @@ def some_func(x): # self.assertIsNone(tensor2.grad) # self.assertIsNotNone(nt2[0].grad) + @unittest.skip("Requires autograd support") def test_grad_to_tensor_mask(self): def some_func(x): return torch.sum(x ** 2 + x ** 3) nt1 = nestedtensor.nested_tensor([torch.tensor([1, 2, 3, 4]), - torch.tensor([1, 2, 3]), - torch.tensor([1, 2])], - dtype=torch.float) #, requires_grad=True) + torch.tensor([1, 2, 3]), + torch.tensor([1, 2])], + dtype=torch.float) # , requires_grad=True) nt_sum_res = some_func(nt1) # nt_sum_res.backward() # TODO: Re-enable under autograd @@ -63,9 +90,9 @@ def some_func(x): # self.assertEqual(nt1[2].grad, torch.tensor([ 5., 16.])) nt2 = nestedtensor.nested_tensor([torch.tensor([1, 2, 3, 4]), - torch.tensor([1, 2, 3]), - torch.tensor([1, 2])], - dtype=torch.float) # , requires_grad=True) + torch.tensor([1, 2, 3]), + torch.tensor([1, 2])], + dtype=torch.float) # , requires_grad=True) tensor, mask = nt2.to_tensor_mask(mask_dim=2) sum_res = some_func(tensor) # sum_res.backward() @@ -78,6 +105,7 @@ def some_func(x): # self.assertEqual(nt2[1].grad, torch.tensor([ 5., 16., 33.])) # self.assertEqual(nt2[2].grad, torch.tensor([ 5., 16.])) + @unittest.skip("Requires autograd support") def test_grad_nt_from_tensor_mask(self): def some_func(x): return torch.sum(x ** 2 + x ** 3) @@ -141,6 +169,5 @@ def some_func(x): # self.assertEqual(result2[1][1], torch.matmul(t21, t1)) - if __name__ == "__main__": unittest.main() diff --git a/test/test_nested_tensor_autograd_functional.py b/test/test_nested_tensor_autograd_functional.py index 7e352823..d83ca724 100644 --- a/test/test_nested_tensor_autograd_functional.py +++ b/test/test_nested_tensor_autograd_functional.py @@ -1,20 +1,11 @@ -import traceback -import functools -import pdb -import sys import torch import nestedtensor import unittest -from utils import TestCase +from utils_test_case import TestCase import random -import utils -from torch.nn import functional as F -from torchvision.models._utils import IntermediateLayerGetter from frozen_batch_norm_2d import NTFrozenBatchNorm2d from position_encoding import PositionEmbeddingSine from joiner import Joiner -from detr_nestedtensor import DETRNestedTensor -from torch import nn def ntnt(x): return nestedtensor.nested_tensor(x, requires_grad=True) @@ -22,6 +13,7 @@ def ntnt_nograd(x): return nestedtensor.nested_tensor(x) class TestAutogradFunctional(TestCase): + @unittest.skip("Requires autograd support") def test_nn_conv2d(self): def _test(Conv2d): inputs = [ @@ -58,6 +50,7 @@ def _test(Conv2d): _test(lambda: torch.nn.Conv2d( 3, 33, kernel_size=(1, 1), stride=(1, 1), bias=False)) + @unittest.skip("Requires autograd support") def test_nn_linear(self): def _test(linear): inputs = [ @@ -88,51 +81,53 @@ def _test(linear): _test(lambda: torch.nn.Linear(10, 6)) + @unittest.skip("Requires autograd support") def test_nn_batch_norm(self): - def _test(BatchNorm2d): - inputs = [ - torch.randn(3, 50, 60, requires_grad=True), - torch.randn(3, 18, 18, requires_grad=True) - ] + def _test(BatchNorm2d, has_grad=True): + inputs = torch.randn(5, 3, 18, 18, requires_grad=True) batch_norm = BatchNorm2d() - batch_norm.eval() - tensor_res = [] - for i in range(2): - t_res = batch_norm(inputs[i].unsqueeze(0).contiguous()) - tensor_res.append(t_res.squeeze(0)) - t_res.sum().backward() + t_res = batch_norm(inputs) + t_res.sum().backward() layer_grad0 = [p.grad for (n, p) in batch_norm.named_parameters()] batch_norm.zero_grad() - nt = ntnt(inputs) + nt = ntnt(inputs.unbind()) nt_res = batch_norm(nt) - nt_res.sum().backward() - layer_grad1 = [p.grad for (n, p) in batch_norm.named_parameters()] - self.assertEqual(ntnt(tensor_res), nt_res) - map(self.assertEqual, zip(layer_grad0, layer_grad1)) - self.assertEqual(nt.grad[0], inputs[0].grad) - self.assertEqual(nt.grad[1], inputs[1].grad) + self.assertEqual(ntnt(t_res.unbind()), nt_res) + if has_grad: + nt_res.sum().backward() + layer_grad1 = [p.grad for ( + n, p) in batch_norm.named_parameters()] + map(self.assertEqual, zip(layer_grad0, layer_grad1)) + self.assertEqual(nt.grad[0], inputs.grad[0]) + self.assertEqual(nt.grad[1], inputs.grad[1]) + else: + self.assertRaisesRegex( + RuntimeError, "var.dim gradient not implemented yet.", lambda: nt_res.sum().backward()) + _test(lambda: torch.nn.BatchNorm2d(3, eps=1e-05, - momentum=0.1, affine=True, track_running_stats=True)) - # _test(lambda: torch.nn.BatchNorm2d(3, eps=1e-05, momentum=0.1, - # affine=True, track_running_stats=True).eval()) - # _test(lambda: torch.nn.BatchNorm2d(3, eps=1e-05, - # momentum=0.1, affine=False, track_running_stats=False)) - # _test(lambda: torch.nn.BatchNorm2d(3, eps=1e-05, momentum=0.1, - # affine=False, track_running_stats=False).eval()) - # _test(lambda: torch.nn.BatchNorm2d(3, eps=1e-05, - # momentum=0.1, affine=True, track_running_stats=False)) - # _test(lambda: torch.nn.BatchNorm2d(3, eps=1e-05, momentum=0.1, - # affine=True, track_running_stats=False).eval()) - # _test(lambda: torch.nn.BatchNorm2d(3, eps=1e-05, - # momentum=0.1, affine=False, track_running_stats=True)) - # _test(lambda: torch.nn.BatchNorm2d(3, eps=1e-05, momentum=0.1, - # affine=False, track_running_stats=True).eval()) - # _test(lambda: torch.nn.BatchNorm2d(3)) + momentum=0.1, affine=True, track_running_stats=True), False) + _test(lambda: torch.nn.BatchNorm2d(3, eps=1e-05, momentum=0.1, + affine=True, track_running_stats=True).eval()) + _test(lambda: torch.nn.BatchNorm2d(3, eps=1e-05, + momentum=0.1, affine=True, track_running_stats=False), False) + _test(lambda: torch.nn.BatchNorm2d(3, eps=1e-05, momentum=0.1, + affine=True, track_running_stats=False).eval(), False) + + _test(lambda: torch.nn.BatchNorm2d(3, eps=1e-05, + momentum=0.1, affine=False, track_running_stats=False), False) + _test(lambda: torch.nn.BatchNorm2d(3, eps=1e-05, momentum=0.1, + affine=False, track_running_stats=False).eval(), False) + _test(lambda: torch.nn.BatchNorm2d(3, eps=1e-05, + momentum=0.1, affine=False, track_running_stats=True), False) + _test(lambda: torch.nn.BatchNorm2d(3, eps=1e-05, momentum=0.1, + affine=False, track_running_stats=True).eval()) + _test(lambda: torch.nn.BatchNorm2d(3), False) + @unittest.skip("Requires autograd support") def test_nn_relu(self): inputs = [ torch.randn(3, 500, 600, requires_grad=True), @@ -160,6 +155,7 @@ def test_nn_relu(self): self.assertEqual(inputs[0].grad, nt.grad[0]) self.assertEqual(inputs[1].grad, nt.grad[1]) + @unittest.skip("Requires autograd support") def test_add(self): inputs0_ = [ torch.randn(5, 6, requires_grad=True), @@ -177,17 +173,25 @@ def test_add(self): self.assertEqual(inputs0.grad.sum(), inputs1.grad.sum() + inputs1.grad.sum()) + @unittest.skip("Requires autograd support") def test_resnet_bottleneck(self): import torchvision - def _test(Bottleneck): + def _test(Bottleneck, has_grad=True): inputs_ = [ torch.randn(256, 50, 60, requires_grad=True) ] inputs = ntnt(inputs_) b = Bottleneck() - b(inputs).sum().backward() + print(b) + x = b(inputs).sum() + # import torchviz + # dot = torchviz.make_dot(x) + # dot.format = 'svg' + # dot.render('asdf') + # x.backward() + # import sys; sys.exit(1) g0 = list(p.grad for (n, p) in b.named_parameters()) b.zero_grad() @@ -202,20 +206,22 @@ def _test(Bottleneck): ] b = Bottleneck() inputs = ntnt(inputs_) - b(inputs).sum().backward() - # print(list((n, p.grad is None) for (n, p) in b.named_parameters())) + if has_grad: + b(inputs).sum().backward() + # print(list((n, p.grad is None) for (n, p) in b.named_parameters())) - b.zero_grad() - b(inputs_[0].unsqueeze(0)).sum().backward() + b.zero_grad() + b(inputs_[0].unsqueeze(0)).sum().backward() - b.zero_grad() - b(inputs_[1].unsqueeze(0)).sum().backward() + b.zero_grad() + b(inputs_[1].unsqueeze(0)).sum().backward() - self.assertEqual(inputs_[0].grad, inputs.grad[0]) - self.assertEqual(inputs_[1].grad, inputs.grad[1]) - _test(lambda: torchvision.models.resnet.Bottleneck(256, 64)) + self.assertEqual(inputs_[0].grad, inputs.grad[0]) + self.assertEqual(inputs_[1].grad, inputs.grad[1]) + _test(lambda: torchvision.models.resnet.Bottleneck(256, 64), False) _test(lambda: torchvision.models.resnet.Bottleneck(256, 64).eval()) + @unittest.skip("Requires autograd support") def test_resnet_classification(self): import torchvision @@ -257,8 +263,10 @@ def _test(FCNHead): # _test(lambda: torchvision.models.segmentation.fcn.FCNHead(256, 64)) _test(lambda: torchvision.models.segmentation.fcn.FCNHead(256, 64).eval()) + @unittest.skip("Requires autograd support") def test_backbone(self): import torchvision + from torchvision.models._utils import IntermediateLayerGetter def _test(FCNHead): inputs_ = [ @@ -302,134 +310,12 @@ def _test(FCNHead): # Note: It seems expected that layer0 has no gradients. return_layers = {"layer1": "0", "layer2": "1", "layer3": "2", "layer4": "3"} - _test(lambda: Joiner(IntermediateLayerGetter(getattr(torchvision.models, "resnet50")( + _test(lambda: Joiner(IntermediateLayerGetter(torchvision.models.resnet50( replace_stride_with_dilation=[False, False, False], pretrained=True, norm_layer=NTFrozenBatchNorm2d), return_layers), PositionEmbeddingSine(128, normalize=True))) - def test_mha(self): - embed_dim = 2 - num_heads = 2 - torch.manual_seed(1010) - mha = torch.nn.MultiheadAttention(embed_dim, num_heads) - query = torch.randn(3, 1, embed_dim, requires_grad=True) - key = torch.randn(2, 1, embed_dim, requires_grad=True) - value = torch.randn(2, 1, embed_dim, requires_grad=True) - attn_output, _ = mha(query, key, value) - nt_mha = nestedtensor.nn.MultiheadAttention(embed_dim, num_heads) - nt_mha.in_proj_weight = mha.in_proj_weight - nt_mha.in_proj_bias = mha.in_proj_bias - nt_mha.out_proj.weight = mha.out_proj.weight - nt_mha.out_proj.bias = mha.out_proj.bias - query_nt = ntnt([query.squeeze(1)]) - key_nt = ntnt([key.squeeze(1)]) - value_nt = ntnt([value.squeeze(1)]) - nt_attn_output, _ = nt_mha( - query_nt, key_nt, value_nt, need_weights=False) - # nt_attn_output.sum().backward() - # For regular tensors the batch dimension is along dimension 1 - scalar1 = attn_output.sum() - scalar2 = nt_attn_output.sum() - scalar1.backward() - scalar2.backward() - self.assertEqual(attn_output.squeeze(1), nt_attn_output[0]) - # XXX: This needs a test that actually checks the parameter gradients - - def test_mha_detr(self): - NDIM = 128 - BSZ = 8 - NHEAD = 8 - RAND_INTS = [(1, 5), (7, 9)] - MODEL = torch.nn.MultiheadAttention(NDIM, NHEAD).eval() - - src_list = nestedtensor.nested_tensor( - [torch.randn(NDIM, i, j) for (i, j) in RAND_INTS]) - detr_nt_src = DETRNestedTensor.from_tensor_list(src_list) - src0, mask = detr_nt_src.decompose() - src0.requires_grad_() - src = src0.flatten(2).permute(2, 0, 1) - mask = mask.flatten(1) - result, _ = MODEL(src, src, src, key_padding_mask=mask, - need_weights=False) # [0].sum().backward() - mask = (~mask.t().unsqueeze(2)).float() - result = result * mask - result_sum = result.sum() - result_sum.backward() - grad_sum = src0.grad.sum() - - src = ntnt([t.flatten(1).permute( - 1, 0) for t in src_list]) - result, _ = MODEL(src, src, src, need_weights=False) - self.assertEqual(result_sum, result.sum()) - result.sum().backward() - # TODO: The numerical instabilities of summation seem to add up here. - self.assertEqual(src.grad.sum(), grad_sum, prec=5e-5) - - def test_squeeze(self): - t = torch.randn(2, 3) - result = ntnt_nograd([t]) - - nt = ntnt_nograd([[t.reshape(1, 2, 1, 3)]]) - # self.assertEqual(nt.squeeze(), result) - self.assertRaises(RuntimeError, lambda: nt.squeeze()) - nt.squeeze_() - self.assertEqual(nt, result) - - nt = ntnt_nograd([t.reshape(2, 3)]) - # self.assertEqual(nt.squeeze(), result) - self.assertRaises(RuntimeError, lambda: nt.squeeze()) - nt.squeeze_() - self.assertEqual(nt, result) - - nt = ntnt_nograd([[t.reshape(2, 3)]]) - # self.assertEqual(nt.squeeze(), result) - self.assertRaises(RuntimeError, lambda: nt.squeeze()) - nt.squeeze_() - self.assertEqual(nt, result) - - nt = ntnt_nograd([t.reshape(1, 2, 3)]) - # self.assertEqual(nt.squeeze(), result) - self.assertRaises(RuntimeError, lambda: nt.squeeze()) - nt.squeeze_() - self.assertEqual(nt, result) - - nt = ntnt_nograd([t.reshape(1, 2, 1, 3, 1)]) - # self.assertEqual(nt.squeeze(), result) - self.assertRaises(RuntimeError, lambda: nt.squeeze()) - nt.squeeze_() - self.assertEqual(nt, result) - - nt = ntnt_nograd([[[t.reshape(1, 2, 3)]]]) - # self.assertEqual(nt.squeeze(), result) - self.assertRaises(RuntimeError, lambda: nt.squeeze()) - nt.squeeze_() - self.assertEqual(nt, result) - - result = ntnt([t]) - nt = ntnt([t.reshape(1, 2, 3)]) - self.assertEqual(nt.squeeze(1), result) - self.assertRaisesRegex( - RuntimeError, "Cannot squeeze first dimension.", lambda: nt.squeeze(0)) - self.assertRaisesRegex( - RuntimeError, "Given dimension is either undefined or not a singleton.", lambda: nt.squeeze(2)) - self.assertRaisesRegex( - RuntimeError, "Given dimension is either undefined or not a singleton.", lambda: nt.squeeze(3)) - self.assertRaises(IndexError, lambda: nt.squeeze(4)) - a = nt.squeeze(1) - a.sum().backward() - self.assertEqual(nt.grad, ntnt_nograd( - [t.reshape(1, 2, 3).mul(0).add(1)])) - - nt = ntnt([[t.reshape(1, 2, 1, 3)]]) - self.assertRaisesRegex( - RuntimeError, "Cannot squeeze nested dimension.", lambda: nt.squeeze(1)) - # self.assertEqual(nt.squeeze(1), ntnt( - # [t.reshape(1, 2, 1, 3)])) - self.assertEqual(nt.squeeze( - 2), ntnt([[t.reshape(2, 1, 3)]])) - self.assertEqual(nt.squeeze( - 4), ntnt([[t.reshape(1, 2, 3)]])) - + @unittest.skip("Requires autograd support") def test_nn_max_pool2d(self): data = [ [ @@ -455,6 +341,7 @@ def test_nn_max_pool2d(self): nt_res = maxPool2d(nt) self.assertEqual(ntnt(tensor_res), nt_res) + @unittest.skip("Requires autograd support") def test_fzbn2d(self): class FrozenBatchNorm2d(torch.nn.Module): """ @@ -519,144 +406,6 @@ def forward(self, x): self.assertEqual(len((list(b0.named_parameters()))), 0) self.assertEqual(len((list(b1.named_parameters()))), 0) - def test_layer_norm(self): - layer_norm = torch.nn.LayerNorm((0,)) - t0 = torch.randn(3) - t1 = torch.randn(2) - t2 = torch.randn(3) - ts = [[t0, t1], [t2]] - nt = ntnt(ts) - self.assertRaisesRegex(RuntimeError, - "Cannot normalize across irregular dimension 2", lambda: layer_norm(nt)) - - d = torch.nn.Dropout(0.1) - t0 = torch.randn(864, 256) - t1 = torch.randn(360, 256) - ts = [t0, t1, t0, t1] - nt = ntnt(ts) - nt2 = ntnt_nograd(ts) - layer_norm = torch.nn.LayerNorm(256) - # print(list(layer_norm.named_parameters())) - # print(nt) - tt = torch.randn(30, 43, 256, requires_grad=True) - # print(nt.requires_grad) - # res = layer_norm(nt) - res = layer_norm(tt) - nt = nt + 3 - # print(res.requires_grad) - res = res * 5 - # print(res) - # print(res.requires_grad) - res.sum().backward() - res = layer_norm(tt + 2) - res.sum().backward() - # print(list(layer_norm.named_parameters())) - # XXX: Need to check weight and bias gradients - # import sys - # sys.exit(1) - t0 = torch.randn(3, 256) - t1 = torch.randn(2, 256) - t2 = torch.randn(3, 256) - ts = [[t0, t1], [t2]] - result = ntnt(ts) - map(self.assertEqual, tuple( - map(lambda x: layer_norm(x), ts[0])), result[0]) - map(self.assertEqual, tuple( - map(lambda x: layer_norm(x), ts[1])), result[1]) - - layer_norm = torch.nn.LayerNorm(3) - t0 = torch.randn(3, 3, 4) - t1 = torch.randn(2, 3, 4) - t2 = torch.randn(3, 3, 4) - ts = [[t0, t1], [t2]] - nt = ntnt(ts) - self.assertRaisesRegex(RuntimeError, - "Given normalized_shape=\[3\], expected input with shape \[\*, 3\], but got input of size\[3, 3, 4\]", - lambda: layer_norm(nt)) - - layer_norm = torch.nn.LayerNorm((3, 2, 4)) - self.assertRaisesRegex(RuntimeError, - "Currently only singleton tuples of integers supported for layer_norm.", - lambda: layer_norm(nt)) - - def test_decoder(self): - class TransformerDecoderLayer(nn.Module): - - def __init__(self, d_model, nhead, dim_feedforward=2048, dropout=0.1, - activation="relu", normalize_before=False): - super().__init__() - self.self_attn = nestedtensor.nn.MultiheadAttention( - d_model, nhead, dropout=dropout) - self.multihead_attn = nestedtensor.nn.MultiheadAttention( - d_model, nhead, dropout=dropout) - # Implementation of Feedforward model - self.linear1 = nn.Linear(d_model, dim_feedforward) - self.dropout = nn.Dropout(dropout) - self.linear2 = nn.Linear(dim_feedforward, d_model) - - self.norm1 = nn.LayerNorm(d_model) - self.norm2 = nn.LayerNorm(d_model) - self.norm3 = nn.LayerNorm(d_model) - self.dropout1 = nn.Dropout(dropout) - self.dropout2 = nn.Dropout(dropout) - self.dropout3 = nn.Dropout(dropout) - - self.activation = torch.nn.functional.relu - self.normalize_before = normalize_before - - def with_pos_embed(self, tensor, pos): - return tensor if pos is None else tensor + pos - - def forward(self, tgt, memory, - # tgt_mask: Optional[Tensor] = None, - # memory_mask: Optional[Tensor] = None, - # tgt_key_padding_mask: Optional[Tensor] = None, - # memory_key_padding_mask: Optional[Tensor] = None, - pos=None, query_pos=None): - q = k = self.with_pos_embed(tgt, query_pos) - tgt2 = self.self_attn(q, k, value=tgt, - need_weights=False)[0] - # tgt = tgt + self.dropout1(tgt2) - tgt = tgt + tgt2 - tgt = self.norm1(tgt) - tgt2 = self.multihead_attn(query=self.with_pos_embed(tgt, query_pos), - key=self.with_pos_embed( - memory, pos), - value=memory, - need_weights=False)[0] - # tgt = tgt + self.dropout2(tgt2) - tgt = tgt + tgt2 - tgt = self.norm2(tgt) - tgt2 = self.linear2(self.dropout( - self.activation(self.linear1(tgt)))) - # tgt = tgt + self.dropout3(tgt2) - tgt = tgt + tgt2 - tgt = self.norm3(tgt) - # print('tgt.requires_grad') - # print(tgt.requires_grad) - return tgt - - d = TransformerDecoderLayer(256, 8) - d.zero_grad() - a = d( - ntnt([ - torch.randn(864, 256), - torch.randn(360, 256)]), - ntnt([ - torch.randn(864, 256), - torch.randn(360, 256)]), - pos=ntnt([ - torch.randn(864, 256), - torch.randn(360, 256)]), - query_pos=ntnt([ - torch.randn(864, 256), - torch.randn(360, 256)]), - ) - a.sum().backward() - # for (n, p) in d.named_parameters(): - # print(n) - # print(p is None) - if __name__ == "__main__": unittest.main() diff --git a/test/test_nested_tensor_buffer.py b/test/test_nested_tensor_buffer.py index eace74be..04bdf647 100644 --- a/test/test_nested_tensor_buffer.py +++ b/test/test_nested_tensor_buffer.py @@ -1,18 +1,13 @@ -import traceback -import functools -import pdb -import sys import torch import nestedtensor import unittest -from utils import TestCase -import random - +from utils_test_case import TestCase # TODO: Test unbind, test grad and backward class TestNestedTensorBuffer(TestCase): + @unittest.skip("Requires autograd support") def test_grad(self): nt = nestedtensor.nested_tensor([torch.rand(1, 2)]) nt.requires_grad_(True) @@ -44,6 +39,7 @@ def test_grad(self): # self.assertIsNotNone(nt_grad.unbind()[0]) # TODO + @unittest.skip("Requires autograd support") def test_detach(self): pass diff --git a/test/test_nested_tensor_class.py b/test/test_nested_tensor_class.py index 8956b697..2334a800 100644 --- a/test/test_nested_tensor_class.py +++ b/test/test_nested_tensor_class.py @@ -1,17 +1,17 @@ -import traceback -import functools -import pdb -import sys import torch import nestedtensor import unittest -from utils import TestCase -import random +from utils_test_case import TestCase import utils -ntnt = nestedtensor.nested_tensor +def ntnt(x): return nestedtensor.nested_tensor(x, requires_grad=True) + + +def ntnt_nograd(x, device=None, dtype=None, channels_last=None): + return nestedtensor.nested_tensor(x, + requires_grad=False, device=device, dtype=dtype, channels_last=channels_last) # Given arguments to a constructor iterator over results for # as_nested_tensor and nested_tensor constructors. @@ -24,7 +24,8 @@ def _iter_constructors(): def _test_property(self, fn): for constructor in _iter_constructors(): - num_nested_tensor = 3 + # TODO: Used to be 3. Currently only supporting nested dim 1. + num_nested_tensor = 1 nested_tensor_lists = [utils.gen_nested_list(i, i, 3) for i in range(1, num_nested_tensor)] first_tensors = [utils.get_first_tensor( @@ -38,7 +39,8 @@ class TestNestedTensor(TestCase): def test_nested_constructor(self): for constructor in _iter_constructors(): - num_nested_tensor = 3 + # TODO: Currently only supporting nested dim 1 + num_nested_tensor = 1 # TODO: Shouldn't be constructable [utils.gen_nested_tensor(i, i, 3, constructor=constructor) for i in range(1, num_nested_tensor)] @@ -82,9 +84,8 @@ def test_as_nested_tensor(self): nested_tensor1 = nestedtensor.as_nested_tensor(nested_tensor) self.assertTrue(nested_tensor1 is nested_tensor) - self.assertRaises(NotImplementedError, lambda: nestedtensor.as_nested_tensor( - nested_tensor, dtype=torch.int64)) - # self.assertTrue(nested_tensor2 is not nested_tensor) + nested_tensor2 = nestedtensor.as_nested_tensor(nested_tensor, dtype=torch.int64) + self.assertTrue(nested_tensor2 is nested_tensor) def test_constructor(self): for constructor in _iter_constructors(): @@ -161,6 +162,9 @@ def test_repr_string(self): str(a) repr(a) + @unittest.skip("Currently only supporting nested dim 1.") + def test_repr_string_nested(self): + for constructor in _iter_constructors(): a = constructor( [ [torch.tensor([[1, 2], [2, 3]]), torch.tensor([[3, 4]])], @@ -226,6 +230,9 @@ def test_nested_size(self): self.assertEqual(b[0][0], 1) self.assertEqual(b[0][1], 2) + @unittest.skip("Currently only supporting nested dim 1.") + def test_nested_size_nested(self): + for constructor in _iter_constructors(): a = constructor( [[torch.randn(1)], [torch.randn(2), torch.randn(1)]]) self.assertEqual(a.nested_size()[0][0], torch.Size([1])) @@ -245,6 +252,7 @@ def test_nested_size(self): self.assertEqual(a.nested_size(1), (1, 2)) self.assertRaises(IndexError, lambda: a.nested_size(2)) + @torch.inference_mode() def test_nested_stride(self): for constructor in _iter_constructors(): tensors = [torch.rand(1, 2, 4)[:, :, 0], torch.rand( @@ -284,20 +292,14 @@ def test_equal(self): a1 = constructor([torch.tensor([1, 2]), torch.tensor([2, 8])]) - if constructor == nestedtensor.as_nested_tensor: - self.assertRaises(NotImplementedError, lambda: constructor([torch.tensor([0, 1]), - torch.tensor([1, 0])], dtype=torch.bool)) - self.assertRaises(NotImplementedError, lambda: constructor([torch.tensor([1, 0]), - torch.tensor([0, 1])], dtype=torch.bool)) - else: - a2 = constructor([torch.tensor([0, 1]), - torch.tensor([1, 0])], dtype=torch.bool) - a3 = constructor([torch.tensor([1, 0]), - torch.tensor([0, 1])], dtype=torch.bool) - self.assertEqual((a1 == 2), a2) - self.assertEqual((a1 != 2), a3) - self.assertEqual((a1 == 2.0), a2) - self.assertEqual((a1 != 2.0), a3) + a2 = constructor([torch.tensor([0, 1]), + torch.tensor([1, 0])], dtype=torch.bool) + a3 = constructor([torch.tensor([1, 0]), + torch.tensor([0, 1])], dtype=torch.bool) + self.assertEqual((a1 == 2), a2) + self.assertEqual((a1 != 2), a3) + self.assertEqual((a1 == 2.0), a2) + self.assertEqual((a1 != 2.0), a3) def test_dim(self): for constructor in _iter_constructors(): @@ -307,12 +309,17 @@ def test_dim(self): self.assertEqual(a1.dim(), 1) a1 = constructor([torch.tensor([1, 2, 3, 4])]) self.assertEqual(a1.dim(), 2) + + @unittest.skip("Currently only supporting nested dim 1.") + def test_dim_nested(self): + for constructor in _iter_constructors(): a1 = constructor([ [torch.tensor([1, 2, 3, 4])], [torch.tensor([5, 6, 7, 8]), torch.tensor([9, 0, 0, 0])] ]) self.assertEqual(a1.dim(), 3) + @unittest.skip("Currently only supporting nested dim 1.") def test_nested_dim(self): for constructor in _iter_constructors(): nt = constructor([torch.tensor(3)]) @@ -341,14 +348,15 @@ def _test(a, b, c, d, e): self.assertTrue(a is not a1) self.assertTrue(b is not b1) - nt1 = nestedtensor.nested_tensor([[c, d], [e]]) - nt11, nt12 = unbind_fn(nt1, 0) - c1, d1 = unbind_fn(nt11, 0) - e1 = unbind_fn(nt12, 0)[0] + # Currently only supporting nested dim 1 + # nt1 = nestedtensor.nested_tensor([[c, d], [e]]) + # nt11, nt12 = unbind_fn(nt1, 0) + # c1, d1 = unbind_fn(nt11, 0) + # e1 = unbind_fn(nt12, 0)[0] - self.assertTrue(c is not c1) - self.assertTrue(d is not d1) - self.assertTrue(e is not e1) + # self.assertTrue(c is not c1) + # self.assertTrue(d is not d1) + # self.assertTrue(e is not e1) nt = nestedtensor.nested_tensor([a, b]) a1, b1 = unbind_fn(nt, 0) @@ -379,6 +387,7 @@ def _test(a, b, c, d, e): torch.tensor([]), torch.tensor([]), torch.tensor([])) + _test_fn(lambda x, dim: x.unbind(dim)) _test_fn(lambda x, dim: torch.unbind(x, dim)) @@ -422,17 +431,18 @@ def _test_fn(unbind_fn): # TODO: Add more tensors and unbind across more dimensions to create mixing c = torch.rand(4, 3) - nt = nestedtensor.nested_tensor([[a], [b, c]]) - nt_a, nt_b = unbind_fn(nt, 0) - self.assertEqual(nt_a, nestedtensor.nested_tensor( - [a]), ignore_contiguity=True) - self.assertEqual(nt_b, nestedtensor.nested_tensor( - [b, c]), ignore_contiguity=True) - result = ( - nestedtensor.nested_tensor([a, b]), - nestedtensor.nested_tensor([c])) - for x, y in zip(unbind_fn(nt, 1), result): - self.assertEqual(x, y, ignore_contiguity=True) + # TODO: Currently only supporting nested dim 1 + # nt = nestedtensor.nested_tensor([[a], [b, c]]) + # nt_a, nt_b = unbind_fn(nt, 0) + # self.assertEqual(nt_a, nestedtensor.nested_tensor( + # [a]), ignore_contiguity=True) + # self.assertEqual(nt_b, nestedtensor.nested_tensor( + # [b, c]), ignore_contiguity=True) + # result = ( + # nestedtensor.nested_tensor([a, b]), + # nestedtensor.nested_tensor([c])) + # for x, y in zip(unbind_fn(nt, 1), result): + # self.assertEqual(x, y, ignore_contiguity=True) _test_fn(lambda x, dim: x.unbind(dim)) _test_fn(lambda x, dim: torch.unbind(x, dim)) @@ -447,10 +457,11 @@ def test_size(self): a = constructor([torch.tensor(1), torch.tensor(2)]) self.assertEqual(a.size(), (2,)) - a = constructor([[torch.rand(1, 8), - torch.rand(3, 8)], - [torch.rand(7, 8)]]) - self.assertEqual(a.size(), (2, None, None, 8)) + # TODO: Currently only supporting nested dim 1 + # a = constructor([[torch.rand(1, 8), + # torch.rand(3, 8)], + # [torch.rand(7, 8)]]) + # self.assertEqual(a.size(), (2, None, None, 8)) a = constructor([torch.rand(1, 2), torch.rand(1, 8)]) @@ -472,55 +483,67 @@ def test_to_tensor(self): self.assertRaises(IndexError, lambda: a.to_tensor(1)) self.assertRaises(IndexError, lambda: a.to_tensor(2)) - t_a = torch.randn(2, 3) - t_b = torch.randn(2, 3) - a = constructor([[t_a, t_b]]) - result = torch.stack([torch.stack([t_a, t_b])]) - self.assertEqual(a.to_tensor(), result) - self.assertEqual(a.to_tensor(0), result) + # Currently only supporting nested dime 1. + # t_a = torch.randn(2, 3) + # t_b = torch.randn(2, 3) + # a = constructor([[t_a, t_b]]) + # result = torch.stack([torch.stack([t_a, t_b])]) + # self.assertEqual(a.to_tensor(), result) + # self.assertEqual(a.to_tensor(0), result) + + # nested dim 1 change: Was already commented out # self.assertEqual(a.to_tensor(1), nestedtensor.as_nested_tensor( # [torch.stack([t_a, t_b])])) # self.assertEqual(a.to_tensor( # 2), nestedtensor.as_nested_tensor([[t_a, t_b]])) # self.assertEqual(a.to_tensor( # 3), nestedtensor.as_nested_tensor([[t_a, t_b]])) - self.assertRaises(RuntimeError, lambda: a.to_tensor(1)) - self.assertRaises(RuntimeError, lambda: a.to_tensor(2)) - self.assertRaises(RuntimeError, lambda: a.to_tensor(3)) - self.assertRaises(IndexError, lambda: a.to_tensor(4)) - - t_c = torch.randn(2, 3) - t_d = torch.randn(2, 3) - a = constructor([[t_a, t_b], [t_c, t_d]]) - result = torch.stack( - [torch.stack([t_a, t_b]), torch.stack([t_c, t_d])]) - self.assertEqual(a.to_tensor(), result) - self.assertEqual(a.to_tensor(0), result) + + # self.assertRaises(RuntimeError, lambda: a.to_tensor(1)) + # self.assertRaises(RuntimeError, lambda: a.to_tensor(2)) + # self.assertRaises(RuntimeError, lambda: a.to_tensor(3)) + # self.assertRaises(IndexError, lambda: a.to_tensor(4)) + + # Currently only supporting nested dime 1. + # t_c = torch.randn(2, 3) + # t_d = torch.randn(2, 3) + # a = constructor([[t_a, t_b], [t_c, t_d]]) + # result = torch.stack( + # [torch.stack([t_a, t_b]), torch.stack([t_c, t_d])]) + # self.assertEqual(a.to_tensor(), result) + # self.assertEqual(a.to_tensor(0), result) + + # nested dim 1 change: Was already commented out # self.assertEqual(a.to_tensor(1), nestedtensor.as_nested_tensor( # [torch.stack([t_a, t_b]), torch.stack([t_c, t_d])])) # self.assertEqual(a.to_tensor(2), nestedtensor.as_nested_tensor( # [[t_a, t_b], [t_c, t_d]])) # self.assertEqual(a.to_tensor(3), nestedtensor.as_nested_tensor( # [[t_a, t_b], [t_c, t_d]])) - self.assertRaises(RuntimeError, lambda: a.to_tensor(1)) - self.assertRaises(RuntimeError, lambda: a.to_tensor(2)) - self.assertRaises(RuntimeError, lambda: a.to_tensor(3)) - self.assertRaises(IndexError, lambda: a.to_tensor(4)) - - t_e = torch.randn(3, 2) - t_f = torch.randn(3, 2) - a = constructor([[t_a, t_b], [t_e, t_f]]) - self.assertRaises(IndexError, lambda: a.to_tensor(0)) + + # self.assertRaises(RuntimeError, lambda: a.to_tensor(1)) + # self.assertRaises(RuntimeError, lambda: a.to_tensor(2)) + # self.assertRaises(RuntimeError, lambda: a.to_tensor(3)) + # self.assertRaises(IndexError, lambda: a.to_tensor(4)) + + # Currently only supporting nested dime 1. + # t_e = torch.randn(3, 2) + # t_f = torch.randn(3, 2) + # a = constructor([[t_a, t_b], [t_e, t_f]]) + # self.assertRaises(IndexError, lambda: a.to_tensor(0)) + + # nested dim 1 change: Was already commented out # self.assertEqual(a.to_tensor(1), nestedtensor.as_nested_tensor( # [torch.stack([t_a, t_b]), torch.stack([t_e, t_f])])) # self.assertEqual(a.to_tensor(2), nestedtensor.as_nested_tensor( # [[t_a, t_b], [t_e, t_f]])) # self.assertEqual(a.to_tensor(3), nestedtensor.as_nested_tensor( # [[t_a, t_b], [t_e, t_f]])) - self.assertRaises(RuntimeError, lambda: a.to_tensor(1)) - self.assertRaises(RuntimeError, lambda: a.to_tensor(2)) - self.assertRaises(RuntimeError, lambda: a.to_tensor(3)) - self.assertRaises(IndexError, lambda: a.to_tensor(4)) + + # self.assertRaises(RuntimeError, lambda: a.to_tensor(1)) + # self.assertRaises(RuntimeError, lambda: a.to_tensor(2)) + # self.assertRaises(RuntimeError, lambda: a.to_tensor(3)) + # self.assertRaises(IndexError, lambda: a.to_tensor(4)) def test_to_nested_tensor(self): for constructor in _iter_constructors(): @@ -529,7 +552,7 @@ def test_to_nested_tensor(self): []), ignore_contiguity=True) self.assertEqual(a.to_nested_tensor( 0), constructor([]), ignore_contiguity=True) - self.assertRaises(IndexError, lambda: a.to_nested_tensor(1)) + self.assertEqual(a, a.to_nested_tensor(1)) self.assertRaises(IndexError, lambda: a.to_nested_tensor(2)) a = constructor([torch.tensor(1)]) @@ -546,41 +569,53 @@ def test_to_nested_tensor(self): result = constructor([t_a, t_b]) self.assertEqual(a.to_nested_tensor(), result) self.assertEqual(a.to_nested_tensor(0), result) - result = constructor([t_a.unbind(0), t_b.unbind(0)]) - self.assertEqual(a.to_nested_tensor(1), result) - result = constructor( - [list(map(lambda x: x.unbind(), t_a.unbind())), - list(map(lambda x: x.unbind(), t_b.unbind()))] - ) - self.assertEqual(a.to_nested_tensor(2), result) - self.assertRaises(IndexError, lambda: a.to_nested_tensor(3)) - - a = constructor([[t_a, t_b]]) - result = constructor([[t_a, t_b]]) - self.assertEqual(a.to_nested_tensor(), result) - self.assertEqual(a.to_nested_tensor(0), result) - self.assertEqual(a.to_nested_tensor(1), result) - result = constructor([[t_a.unbind(0), t_b.unbind(0)]]) - self.assertEqual(a.to_nested_tensor(2), result) - result = constructor([[list(map(lambda x: x.unbind(), t_a.unbind())), - list(map(lambda x: x.unbind(), t_b.unbind()))]]) - self.assertEqual(a.to_nested_tensor(3), result) - self.assertRaises(IndexError, lambda: a.to_nested_tensor(4)) - - t_c = torch.randn(2, 4) - a = constructor([[t_a, t_b], [t_c]]) - result = constructor([[t_a, t_b], [t_c]]) - self.assertEqual(a.to_nested_tensor(), result) - self.assertEqual(a.to_nested_tensor(0), result) - self.assertEqual(a.to_nested_tensor(1), result) - result = constructor( - [[t_a.unbind(), t_b.unbind()], [t_c.unbind()]]) - self.assertEqual(a.to_nested_tensor(2), result) - result = constructor([[list(map(lambda x: x.unbind(), t_a.unbind())), - list(map(lambda x: x.unbind(), t_b.unbind()))], - [list(map(lambda x: x.unbind(), t_c.unbind()))]]) - self.assertEqual(a.to_nested_tensor(3), result) - self.assertRaises(IndexError, lambda: a.to_nested_tensor(4)) + + # Currently only supporting nested dime 1. + # result = constructor([t_a.unbind(0), t_b.unbind(0)]) + # self.assertEqual(a.to_nested_tensor(1), result) + # result = constructor( + # [list(map(lambda x: x.unbind(), t_a.unbind())), + # list(map(lambda x: x.unbind(), t_b.unbind()))] + # ) + # self.assertEqual(a.to_nested_tensor(2), result) + # self.assertRaises(IndexError, lambda: a.to_nested_tensor(3)) + + # Currently only supporting nested dime 1. + # a = constructor([[t_a, t_b]]) + # result = constructor([[t_a, t_b]]) + # self.assertEqual(a.to_nested_tensor(), result) + # self.assertEqual(a.to_nested_tensor(0), result) + # self.assertEqual(a.to_nested_tensor(1), result) + # result = constructor([[t_a.unbind(0), t_b.unbind(0)]]) + # self.assertEqual(a.to_nested_tensor(2), result) + # result = constructor([[list(map(lambda x: x.unbind(), t_a.unbind())), + # list(map(lambda x: x.unbind(), t_b.unbind()))]]) + # self.assertEqual(a.to_nested_tensor(3), result) + # self.assertRaises(IndexError, lambda: a.to_nested_tensor(4)) + + # t_c = torch.randn(2, 4) + # a = constructor([[t_a, t_b], [t_c]]) + # result = constructor([[t_a, t_b], [t_c]]) + # self.assertEqual(a.to_nested_tensor(), result) + # self.assertEqual(a.to_nested_tensor(0), result) + # self.assertEqual(a.to_nested_tensor(1), result) + # result = constructor( + # [[t_a.unbind(), t_b.unbind()], [t_c.unbind()]]) + # self.assertEqual(a.to_nested_tensor(2), result) + # result = constructor([[list(map(lambda x: x.unbind(), t_a.unbind())), + # list(map(lambda x: x.unbind(), t_b.unbind()))], + # [list(map(lambda x: x.unbind(), t_c.unbind()))]]) + # self.assertEqual(a.to_nested_tensor(3), result) + # self.assertRaises(IndexError, lambda: a.to_nested_tensor(4)) + + # t = torch.randn(2, 3) + # self.assertEqual(t, nestedtensor.to_nested_tensor(t, 0)) + # self.assertEqual(ntnt_nograd(t.unbind()), + # nestedtensor.to_nested_tensor(t, 1)) + # self.assertEqual(ntnt_nograd( + # [ti.unbind() for ti in t.unbind()]), nestedtensor.to_nested_tensor(t, 2)) + # self.assertRaises( + # IndexError, lambda: nestedtensor.to_nested_tensor(t, 3)) def test_to(self): tensors = [torch.randn(1, 8), @@ -605,9 +640,10 @@ def test_requires_grad(self): tensors = [torch.randn(1, 8), torch.randn(3, 8), torch.randn(7, 8)] - a1 = nestedtensor.nested_tensor(tensors, requires_grad=True) + a1 = ntnt_nograd(tensors) self.assertIsNone(a1.grad) + @unittest.skip("Not implemented") @unittest.skipIf(not torch.cuda.is_available(), "CUDA not enabled.") def test_pin_memory(self): # Check if it can be applied widely @@ -639,32 +675,34 @@ def test_pin_memory(self): self.assertFalse(a5.is_pinned()) self.assertFalse(a6.is_pinned()) + @unittest.skip("Currently only supporting nested dim 1.") def test_getitem(self): a, b, c = torch.randn(3, 4), torch.randn(4, 3), torch.randn(1, 3) - nt = nestedtensor.nested_tensor([[a, b], [c]]) + nt = ntnt_nograd([[a, b], [c]]) tmp = nt[0, :, 0] self.assertEqual(tmp[0], a[:, 0]) self.assertEqual(tmp[1], b[:, 0]) - self.assertEqual(nt[0, :, 0].contiguous(), ntnt([a[:, 0], b[:, 0]])) - self.assertEqual(nt[None], ntnt([[[a, b], [c]]])) - self.assertEqual(nt[0], ntnt([a, b])) + self.assertEqual(nt[0, :, 0].contiguous(), + ntnt_nograd([a[:, 0], b[:, 0]])) + self.assertEqual(nt[None], ntnt_nograd([[[a, b], [c]]])) + self.assertEqual(nt[0], ntnt_nograd([a, b])) # Supports grad self.assertEqual(nt[:], nt) - self.assertEqual(nt[:, 0], ntnt([a, c])) - self.assertEqual(nt[-1:], ntnt([[c]])) - self.assertEqual(nt[-1:, 0], ntnt([c])) - self.assertEqual(nt[:, -1], ntnt([b, c])) - self.assertEqual(nt[-1:, -1], ntnt([c])) - self.assertEqual(nt[:, -1:], ntnt([[b], [c]])) - self.assertEqual(nt[-1:, -1:], ntnt([[c]])) - self.assertEqual(nt[:, -1:, None], ntnt([[b[None]], [c[None]]])) - self.assertEqual(nt[-1:, :, None], ntnt([[c[None]]])) - self.assertEqual(nt[:, 1:, None], ntnt([[b[None]], []])) + self.assertEqual(nt[:, 0], ntnt_nograd([a, c])) + self.assertEqual(nt[-1:], ntnt_nograd([[c]])) + self.assertEqual(nt[-1:, 0], ntnt_nograd([c])) + self.assertEqual(nt[:, -1], ntnt_nograd([b, c])) + self.assertEqual(nt[-1:, -1], ntnt_nograd([c])) + self.assertEqual(nt[:, -1:], ntnt_nograd([[b], [c]])) + self.assertEqual(nt[-1:, -1:], ntnt_nograd([[c]])) + self.assertEqual(nt[:, -1:, None], ntnt_nograd([[b[None]], [c[None]]])) + self.assertEqual(nt[-1:, :, None], ntnt_nograd([[c[None]]])) + self.assertEqual(nt[:, 1:, None], ntnt_nograd([[b[None]], []])) nt = nestedtensor.nested_tensor([[a, b]]) - self.assertEqual(nt[0, 0], ntnt([a[0], b[0]])) - self.assertEqual(nt[0, 1:], ntnt([a[1:], b[1:]])) - self.assertEqual(nt[:1, :, 1:], ntnt([[a[1:], b[1:]]])) + self.assertEqual(nt[0, 0], ntnt_nograd([a[0], b[0]])) + self.assertEqual(nt[0, 1:], ntnt_nograd([a[1:], b[1:]])) + self.assertEqual(nt[:1, :, 1:], ntnt_nograd([[a[1:], b[1:]]])) self.assertEqual(nt[:, :], nt) - self.assertEqual(nt[:, None], ntnt([[[a, b]]])) + self.assertEqual(nt[:, None], ntnt_nograd([[[a, b]]])) self.assertRaisesRegex(IndexError, "Dimension out of range \(expected to be in range of \[-1, 0\], but got 2\)", lambda: nt[2]) @@ -674,12 +712,12 @@ def test_cat(self): b = a + 12 c = b + 12 - nt0 = nestedtensor.nested_tensor([a, b]) - nt1 = nestedtensor.nested_tensor([c]) - self.assertEqual(nestedtensor.cat([nt0, nt1], dim=0), ntnt([a, b, c])) - self.assertEqual(nestedtensor.cat( - [nt0, nt1], dim=1), ntnt([torch.cat([a, c]), b])) - self.assertEqual(nestedtensor.cat([nt0, nt1], dim=2), ntnt( + nt0 = ntnt_nograd([a, b]) + nt1 = ntnt_nograd([c]) + self.assertEqual(torch.cat([nt0, nt1], dim=0), ntnt_nograd([a, b, c])) + self.assertEqual(torch.cat( + [nt0, nt1], dim=1), ntnt_nograd([torch.cat([a, c]), b])) + self.assertEqual(torch.cat([nt0, nt1], dim=2), ntnt_nograd( [torch.cat([a, c], dim=1), b])) def test_stack(self): @@ -687,23 +725,155 @@ def test_stack(self): b = a + 12 c = b + 12 - nt = nestedtensor.nested_tensor([[a, b], [c]]) - nt0 = nestedtensor.nested_tensor([a, b]) - nt1 = nestedtensor.nested_tensor([c]) - self.assertEqual(nestedtensor.stack( - [nt0, nt1], dim=0), ntnt([[a, b], [c]])) - self.assertEqual(nestedtensor.stack( - [nt0, nt1], dim=1), ntnt([torch.stack([a, c]), b.reshape(1, 3, 4)])) - self.assertEqual(nestedtensor.stack( - [nt0, nt1], dim=2), ntnt([torch.stack([a, c], dim=1), b.reshape(3, 1, 4)])) + nt0 = ntnt_nograd([a, b]) + nt1 = ntnt_nograd([c]) + # Currently only supporting nested dime 1. + # self.assertEqual(torch.stack( + # [nt0, nt1], dim=0), ntnt_nograd([[a, b], [c]])) + self.assertEqual(torch.stack( + [nt0, nt1], dim=1), + ntnt_nograd([torch.stack([a, c]), b.reshape(1, 3, 4)])) + self.assertEqual(torch.stack( + [nt0, nt1], dim=2), + ntnt_nograd([torch.stack([a, c], dim=1), b.reshape(3, 1, 4)])) + + @unittest.skip("sparse csr currently broken") + def test_to_sparse_csr(self): + a = torch.arange(3) + 1 + b = torch.arange(4) + 1 + c = torch.arange(2) + 1 + nt = ntnt_nograd([a, b, c]) + data = nt.to_padded_tensor(padding=0) + st = nt.to_sparse_csr_tensor() + self.assertEqual(data, nt.to_sparse_csr_tensor().to_dense()) + nt = ntnt_nograd([a.unsqueeze(1), b.unsqueeze(1)]) + self.assertRaisesRegex(RuntimeError, + "Given tensor must be of dimension 2, got dimension 3", + lambda: nt.to_sparse_csr_tensor()) + + @unittest.skipIf(not torch.cuda.is_available(), "CUDA not enabled.") + def test_to_padded_tensor_cuda_dim2(self): + import random + random.seed(1010) + tensors = [torch.randn(random.randint(3, 30)) for _ in range(5)] + nt = ntnt_nograd(tensors, device=torch.device('cuda')) + data0 = nt.to_padded_tensor(padding=1) + nt = ntnt_nograd(tensors, device=torch.device('cpu')) + data1, mask1 = nt.to_tensor_mask() + data1.masked_fill_(mask1.logical_not(), 1) + self.assertEqual(data0, data1) + + @unittest.skipIf(not torch.cuda.is_available(), "CUDA not enabled.") + def test_to_padded_tensor_cuda_dim3(self): + import random + random.seed(1010) + tensors = [torch.randn(random.randint(3, 30), random.randint(3, 30)) + for _ in range(5)] + nt = ntnt_nograd(tensors, device=torch.device('cuda')) + data0 = nt.to_padded_tensor(padding=1) + nt = ntnt_nograd(tensors, device=torch.device('cpu')) + data1, mask1 = nt.to_tensor_mask() + data1.masked_fill_(mask1.logical_not(), 1) + self.assertEqual(data0, data1) + + @unittest.skipIf(not torch.cuda.is_available(), "CUDA not enabled.") + def test_to_padded_tensor_cuda_dim4(self): + import random + random.seed(1010) + tensors = [torch.randn(random.randint(3, 30), + random.randint(3, 30), + random.randint(3, 30)) for _ in range(5)] + nt = ntnt_nograd(tensors, device=torch.device('cuda')) + data0 = nt.to_padded_tensor(padding=1) + nt = ntnt_nograd(tensors, device=torch.device('cpu')) + data1, mask1 = nt.to_tensor_mask() + data1.masked_fill_(mask1.logical_not(), 1) + self.assertEqual(data0, data1) + + @unittest.skipIf(not torch.cuda.is_available(), "CUDA not enabled.") + def test_to_tensor_mask_cuda(self): + def _test(dtype): + import random + random.seed(110) + tensors = [random.randint(2, 4) for _ in range(3)] + tensors = [torch.arange(t * 3).reshape(t, 3).float() for t in tensors] + nt = ntnt_nograd(tensors, device=torch.device('cuda'), dtype=dtype) + data, mask = nt.to_tensor_mask(mask_dim=2) + nt1 = ntnt_nograd(tensors, device=torch.device('cpu'), dtype=dtype) + data1, mask1 = nt1.to_tensor_mask(mask_dim=2) + self.assertEqual(data, data1) + self.assertEqual(mask, mask1) + _test(torch.float16) + _test(torch.float32) + + def test_to_mask(self): + import random + random.seed(110) + tensors = [random.randint(2, 4) for _ in range(3)] + tensors = [torch.arange(t * 3).reshape(t, 3).float() for t in tensors] + nt = ntnt_nograd(tensors) + data, mask0 = nt.to_tensor_mask(mask_dim=2) + mask1 = torch.ops.nestedtensor.to_mask(nt, 2) + self.assertEqual(mask0, mask1) + + @unittest.skipIf(not torch.cuda.is_available(), "CUDA not enabled.") + def test_nchw_nhwc_cuda(self): + def _test(dtype): + def _prod(tup): + r = 1 + for t in tup: + r = r * t + return r + import random + random.seed(1010) + shapes = [(32, + random.randint(20, 100), + random.randint(20, 100)) for _ in range(20)] + tensors = [torch.randn(*s) for s in shapes] + nt = ntnt_nograd(tensors, device=torch.device('cuda'), dtype=dtype) + nt0 = nestedtensor.transpose_nchw_nhwc(nt) + tensors1 = [t.permute(1, 2, 0) for t in tensors] + nt1 = ntnt_nograd(tensors1, device=torch.device('cuda'), dtype=dtype) + self.assertEqual(nt0, nt1) + nt2 = nestedtensor.transpose_nhwc_nchw(nt0) + self.assertEqual(nt, nt2) + _test(torch.float16) + _test(torch.float32) + + @unittest.skipIf(not torch.cuda.is_available(), "CUDA not enabled.") + def test_channels_last_cuda(self): + def _test(dtype): + def _prod(tup): + r = 1 + for t in tup: + r = r * t + return r + import random + random.seed(1010) + shapes = [(30, + random.randint(20, 40), + random.randint(20, 40)) for _ in range(7)] + tensors = [torch.randn(*s) for s in shapes] + tensors_channel_last = [t.unsqueeze(0).to(memory_format=torch.channels_last).squeeze(0) for t in tensors] + nt = ntnt_nograd(tensors, device=torch.device('cuda'), dtype=dtype, channels_last=True) + for (t_i, nt_i) in zip(tensors_channel_last, nt): + if (dtype == torch.float16): + self.assertEqual(t_i, nt_i, prec=1e-2) + else: + self.assertEqual(t_i, nt_i) + + _test(torch.float16) + _test(torch.float32) class TestContiguous(TestCase): - def test_contiguous(self): + + @unittest.skip("Nested dim currently restricted to 1.") + def test_contiguous_nested(self): for _ in range(1, 10): # data = gen_nested_list(1, 2, 3, size_low=1, size_high=3) data = [[torch.rand(1, 2), torch.rand(3, 4)], [torch.rand(5, 6)]] - nt = nestedtensor.nested_tensor(data) + nt = ntnt_nograd(data) self.assertTrue(nt.is_contiguous()) # buf = nt.flatten() self.assertEqual(nt, nt) @@ -711,6 +881,7 @@ def test_contiguous(self): nt.cos_() nt.cos() + def test_contiguous(self): a = nestedtensor.as_nested_tensor([torch.tensor([1, 2]), torch.tensor([3, 4]), torch.tensor([5, 6]), diff --git a/test/test_nested_tensor_functional.py b/test/test_nested_tensor_functional.py index 3b5fdc72..e6ce2a08 100644 --- a/test/test_nested_tensor_functional.py +++ b/test/test_nested_tensor_functional.py @@ -1,14 +1,12 @@ -import traceback -import functools -import pdb -import sys import torch import nestedtensor import unittest -from utils import TestCase +from utils_test_case import TestCase import random import utils from torch.nn import functional as F +from detr_nestedtensor import DETRNestedTensor +from torch import nn def _iter_constructors(): @@ -19,6 +17,10 @@ def _iter_constructors(): def ntnt(x): return nestedtensor.nested_tensor(x, requires_grad=True) +def ntnt_nograd(x, device=None, dtype=None): return nestedtensor.nested_tensor( + x, requires_grad=False, device=device, dtype=dtype) + + class TestFunctional(TestCase): def test_nll_loss(self): utils.gen_float_tensor(1, (40, 5)) @@ -30,6 +32,108 @@ def test_addmm(self): [torch.rand(1, 4), torch.rand(1, 4), torch.rand(4, 4)] ) + @torch.inference_mode() + @unittest.skipIf(not torch.cuda.is_available(), "Test requires cuda") + def test_add(self): + nt = ntnt_nograd([torch.randn(4, 2, 5), torch.randn(4, 3, 5)], + device=torch.device('cuda'), dtype=torch.half) + o = torch.randn(1, 4, 1, 1) + o = o.cuda().half() + res = nt + o + + def _test_conv2d_dtype(self, dtype, weight, device, shapes, + stride=None, padding=None, dilation=None, + groups=None): + if stride is None: + stride = [1, 1] + if padding is None: + padding = [0, 0] + if dilation is None: + dilation = [1, 1] + if groups is None: + groups = 1 + + def _prod(tup): + r = 1 + for t in tup: + r = r * t + return r + + def _test(ts, weight, stride, padding, dilation, groups): + nt = ntnt_nograd(ts, device=device, dtype=dtype) + nt_out = torch.conv2d(nt, weight, stride=stride, + padding=padding, dilation=dilation, + groups=groups) + for i, (t, nt_out_i) in enumerate(zip(ts, nt_out.unbind())): + t_out = torch.conv2d(t.unsqueeze(0), weight, + stride=stride, padding=padding, + dilation=dilation, + groups=groups).squeeze(0) + self.assertEqual(t_out, nt_out_i) + ts = [] + for s in shapes: + ts.append(torch.randn(_prod(s)).reshape(*s).to(device=device, dtype=dtype)) + weight = weight.to(device=device, dtype=dtype) + _test(ts, weight, stride, padding, dilation, groups) + + @torch.inference_mode() + @unittest.skipIf(not torch.cuda.is_available(), "Test requires cuda") + def test_conv2d_1x1_cuda(self): + shapes = [(2, 2, 3), (2, 4, 2), (2, 2, 2)] + weight = torch.randn(3*2*1*1).reshape(3, 2, 1, 1) + self._test_conv2d_dtype(torch.float16, weight, torch.device('cuda'), shapes) + self._test_conv2d_dtype(torch.float32, weight, torch.device('cuda'), shapes) + + @torch.inference_mode() + def test_conv2d_1x1_cpu(self): + shapes = [(2, 2, 3), (2, 4, 2), (2, 2, 2)] + weight = torch.randn(3*2*1*1).reshape(3, 2, 1, 1) + # self._test_conv2d_dtype(torch.float16, weight, torch.device('cpu'), shapes) + self._test_conv2d_dtype(torch.float32, weight, torch.device('cpu'), shapes) + + @torch.inference_mode() + @unittest.skipIf(not torch.cuda.is_available(), "Test requires cuda") + def test_conv2d_3x3_cuda(self): + shapes = [(2, 4, 5), (2, 5, 3), (2, 3, 3)] + weight = torch.randn(3*2*3*3).reshape(3, 2, 3, 3) + self._test_conv2d_dtype(torch.float16, weight, torch.device('cuda'), shapes) + self._test_conv2d_dtype(torch.float32, weight, torch.device('cuda'), shapes) + + @torch.inference_mode() + def test_conv2d_3x3_cpu(self): + shapes = [(2, 4, 5), (2, 5, 3), (2, 3, 3)] + weight = torch.randn(3*2*3*3).reshape(3, 2, 3, 3) + # self._test_conv2d_dtype(torch.float16, weight, torch.device('cpu'), shapes) + self._test_conv2d_dtype(torch.float32, weight, torch.device('cpu'), shapes) + + @torch.inference_mode() + @unittest.skipIf(not torch.cuda.is_available(), "Test requires cuda") + def test_conv2d_3x3_resnext_common_cuda(self): + shapes = [(32, 4, 5), (32, 5, 3), (32, 3, 3)] + weight = torch.randn(32*1*3*3).reshape(32, 1, 3, 3) + for dtype in [torch.float16, torch.float32]: + stride = [1, 1] # default + padding = [1, 1] + dilation = [1, 1] # default + groups = 32 + self._test_conv2d_dtype(dtype, weight, torch.device('cuda'), + shapes, stride=stride, padding=padding, + dilation=dilation, groups=groups) + + @torch.inference_mode() + @unittest.skipIf(not torch.cuda.is_available(), "Test requires cuda") + def test_conv2d_3x3_resnext_input_cuda(self): + shapes = [(4, 3, 2), (4, 3, 3), (4, 2, 3)] + weight = torch.randn(5, 4, 2, 2) + for dtype in [torch.float16, torch.float32]: + stride = [1, 1] + padding = [1, 1] + dilation = [1, 1] + groups = 1 + self._test_conv2d_dtype(dtype, weight, torch.device('cuda'), + shapes, stride=stride, padding=padding, + dilation=dilation, groups=groups) + def test_contiguousity(self): initial_t = torch.rand(2, 5, 10, 15) self.assertEqual(True, initial_t.is_contiguous()) @@ -48,6 +152,7 @@ def test_contiguousity(self): # nt_cont = relu(nt) # self.assertEqual(True, nt_cont.is_contiguous()) + @torch.inference_mode() def test_nn_embedding(self): inputs = [torch.randint(100, (L,)) for L in torch.randint(5, 50, (8,))] x = nestedtensor.nested_tensor(inputs, dtype=torch.int64) @@ -56,6 +161,41 @@ def test_nn_embedding(self): for i, inp in enumerate(inputs): self.assertEqual(emb(inp), y[i]) + @torch.inference_mode() + def test_nn_embedding_bag(self): + + def run_test(EmbeddingBag, inputs): + x = nestedtensor.nested_tensor(inputs, dtype=torch.int64) + torch.manual_seed(0) + emb = EmbeddingBag() + y = emb(x) + s = y.sum() + # s.backward() + input_tensor = torch.cat(inputs).contiguous() + input_offset = [0] + for inp in inputs[:-1]: + input_offset.append(len(inp) + input_offset[-1]) + input_offset = torch.tensor(input_offset) + torch.manual_seed(0) + emb_t = EmbeddingBag() + y_t = emb_t(input_tensor, input_offset) + s_t = y_t.sum() + # s_t.backward() + for yi, y_ti in zip(y.unbind(), y_t.unbind()): + self.assertEqual(yi, y_ti) + self.assertEqual(s, s_t) + # self.assertEqual(emb.weight.grad, emb_t.weight.grad) + + run_test(lambda: torch.nn.EmbeddingBag(100, 8), [ + torch.randint(100, (5,)), torch.randint(100, (5,))]) + run_test(lambda: torch.nn.EmbeddingBag(100, 8), [ + torch.randint(100, (L,)) for L in torch.randint(3, 7, (5,))]) + run_test(lambda: torch.nn.EmbeddingBag(100, 8, sparse=True), [ + torch.randint(100, (5,)), torch.randint(100, (5,))]) + run_test(lambda: torch.nn.EmbeddingBag(100, 8, sparse=True), [ + torch.randint(100, (L,)) for L in torch.randint(3, 7, (5,))]) + + @torch.inference_mode() def test_nn_functional_conv2d(self): tensor1 = torch.rand(3, 128, 128) tensor2 = torch.rand(3, 300, 400) @@ -87,7 +227,7 @@ def test_nn_functional_conv2d(self): nt, weight, bias, (2, 2), (3, 3), (1, 1), 1).unbind()] self.assertEqual(nt_res, tensor_res) - @unittest.skip("Not fully implemented") + @unittest.skip("Not implemented") def test_nn_functional_batch_norm(self): inputs = [ torch.tensor([[[-0.5000]], [[0.5000]]]), @@ -128,14 +268,14 @@ def test_nn_functional_max_pool2d(self): def test_functional_relu_(self): orig_t1 = torch.tensor([-2, -1, 0, 1, 2]) expected_t = torch.tensor([0, 0, 0, 1, 2]) - expected_nt = nestedtensor.nested_tensor([expected_t]) + expected_nt = ntnt_nograd([expected_t]) t_clone = orig_t1.clone() torch.nn.functional.relu_(t_clone) self.assertEqual(t_clone, expected_t) t_clone = orig_t1.clone() - nt1 = nestedtensor.nested_tensor([t_clone]) + nt1 = ntnt_nograd([t_clone]) torch.nn.functional.relu_(nt1) self.assertEqual(nt1, expected_nt) self.assertEqual(t_clone, orig_t1) @@ -213,11 +353,10 @@ def test_nn_functional_dropout(self): inputs[i].unsqueeze(0).contiguous()) tensor_res.append(t_res.squeeze(0)) - nt = ntnt(inputs) + nt = ntnt_nograd(inputs) nt_res = torch.nn.functional.dropout(nt) - self.assertEqual(ntnt(tensor_res).size(), nt_res.size()) + self.assertEqual(ntnt_nograd(tensor_res).size(), nt_res.size()) - @ unittest.skip("Not implemented") def test_nn_functional_interpolate(self): inputs = [ torch.randn(3, 200, 300), @@ -293,42 +432,46 @@ def test_copy_(self): nt1.copy_(nt2) self.assertEqual(nt1, nt2) - nt1 = constructor( - [[torch.randn(1, 2, 3), torch.randn(2, 1, 3)], [torch.randn(3, 2, 1)]]) - nt2 = constructor( - [[torch.randn(1, 2, 3), torch.randn(2, 1, 3)], [torch.randn(3, 2, 1)]]) - nt1.copy_(nt2) - self.assertEqual(nt1, nt2) + # Currently only supporting nested dim 1. + # nt1 = constructor( + # [[torch.randn(1, 2, 3), torch.randn(2, 1, 3)], [torch.randn(3, 2, 1)]]) + # nt2 = constructor( + # [[torch.randn(1, 2, 3), torch.randn(2, 1, 3)], [torch.randn(3, 2, 1)]]) + # nt1.copy_(nt2) + # self.assertEqual(nt1, nt2) + @unittest.skip("Currently only supporting nested dim 1.") def test_unsqueeze(self): for constructor in _iter_constructors(): t = torch.randn(2, 3) - nt = constructor([[t.reshape(2, 3)]]) - self.assertEqual(nt.unsqueeze( - 0), constructor([[[t.reshape(2, 3)]]])) - self.assertEqual(nt.unsqueeze( - 1), constructor([[[t.reshape(2, 3)]]])) - self.assertEqual(nt.unsqueeze( - 2), constructor([[t.reshape(1, 2, 3)]])) - self.assertEqual(nt.unsqueeze( - 3), constructor([[t.reshape(2, 1, 3)]])) - self.assertEqual(nt.unsqueeze( - 4), constructor([[t.reshape(2, 3, 1)]])) - - t0 = t.reshape(3, 2) - t1 = t - t2 = torch.randn(4, 5) - nt = constructor([[t0, t1], [t2]]) - self.assertEqual(nt.unsqueeze(0), constructor([[[t0, t1], [t2]]])) - self.assertEqual(nt.unsqueeze( - 1), constructor([[[t0, t1]], [[t2]]])) - self.assertEqual(nt.unsqueeze(2), constructor( - [[t0.reshape(1, 3, 2), t1.reshape(1, 2, 3)], [t2.reshape(1, 4, 5)]])) - self.assertEqual(nt.unsqueeze(3), constructor( - [[t0.reshape(3, 1, 2), t1.reshape(2, 1, 3)], [t2.reshape(4, 1, 5)]])) - self.assertEqual(nt.unsqueeze(4), constructor( - [[t0.reshape(3, 2, 1), t1.reshape(2, 3, 1)], [t2.reshape(4, 5, 1)]])) + # Currently only supporting nested dim 1. + # nt = constructor([[t.reshape(2, 3)]]) + # self.assertEqual(nt.unsqueeze( + # 0), constructor([[[t.reshape(2, 3)]]])) + # self.assertEqual(nt.unsqueeze( + # 1), constructor([[[t.reshape(2, 3)]]])) + # self.assertEqual(nt.unsqueeze( + # 2), constructor([[t.reshape(1, 2, 3)]])) + # self.assertEqual(nt.unsqueeze( + # 3), constructor([[t.reshape(2, 1, 3)]])) + # self.assertEqual(nt.unsqueeze( + # 4), constructor([[t.reshape(2, 3, 1)]])) + + # Currently only supporting nested dim 1. + # t0 = t.reshape(3, 2) + # t1 = t + # t2 = torch.randn(4, 5) + # nt = constructor([[t0, t1], [t2]]) + # self.assertEqual(nt.unsqueeze(0), constructor([[[t0, t1], [t2]]])) + # self.assertEqual(nt.unsqueeze( + # 1), constructor([[[t0, t1]], [[t2]]])) + # self.assertEqual(nt.unsqueeze(2), constructor( + # [[t0.reshape(1, 3, 2), t1.reshape(1, 2, 3)], [t2.reshape(1, 4, 5)]])) + # self.assertEqual(nt.unsqueeze(3), constructor( + # [[t0.reshape(3, 1, 2), t1.reshape(2, 1, 3)], [t2.reshape(4, 1, 5)]])) + # self.assertEqual(nt.unsqueeze(4), constructor( + # [[t0.reshape(3, 2, 1), t1.reshape(2, 3, 1)], [t2.reshape(4, 5, 1)]])) t = torch.randn(2, 3) nt = constructor([t]) @@ -341,6 +484,7 @@ def test_unsqueeze(self): 3), constructor([t.reshape(2, 3, 1)])) self.assertRaises(IndexError, lambda: nt.unsqueeze(4)) + @torch.inference_mode() def test_matmul(self): for constructor in _iter_constructors(): t1 = torch.randn(2, 3) @@ -352,13 +496,15 @@ def test_matmul(self): result1 = torch.matmul(a, t22) self.assertEqual(result[1], result1[0]) self.assertEqual(result[1], result1[1]) - c = constructor([[t21, t22], [t22, t21]]) - result2 = torch.matmul(c, t1) - self.assertEqual(result2[0][0], torch.matmul(t21, t1)) - self.assertEqual(result2[0][1], torch.matmul(t22, t1)) - self.assertEqual(result2[1][0], torch.matmul(t22, t1)) - self.assertEqual(result2[1][1], torch.matmul(t21, t1)) - + # Currently only supporting nested dim 1. + # c = constructor([[t21, t22], [t22, t21]]) + # result2 = torch.matmul(c, t1) + # self.assertEqual(result2[0][0], torch.matmul(t21, t1)) + # self.assertEqual(result2[0][1], torch.matmul(t22, t1)) + # self.assertEqual(result2[1][0], torch.matmul(t22, t1)) + # self.assertEqual(result2[1][1], torch.matmul(t21, t1)) + + @unittest.skip("Currently only supporting nested dim 1.") def test_transpose(self): t0 = torch.randn(3, 3, 4) t1 = torch.randn(2, 4, 3) @@ -380,6 +526,7 @@ def test_transpose(self): list(map(lambda x: x.unbind(), t_t.unbind()))) self.assertEqual(t_t, nt_t.to_tensor()) + @unittest.skip("Currently only supporting nested dim 1.") def test_flatten(self): t0 = torch.randn(3, 3, 4) t1 = torch.randn(2, 4, 3) @@ -411,8 +558,8 @@ def test_flatten(self): map(self.assertEqual, zip(ts[0].unbind(), ts_r[0].unbind())) map(self.assertEqual, zip(ts[1].unbind(), ts_r[1].unbind())) + @unittest.skip("Currently only supporting nested dim 1.") def test_reshape(self): - t0 = torch.randn(3, 3) t1 = torch.randn(2, 3) t2 = torch.randn(3, 3) @@ -460,37 +607,569 @@ def _map_fn(dim, result): map(lambda x: fn(x, dim), ts[0])), result[0]) map(self.assertEqual, tuple( map(lambda x: fn(x, dim), ts[1])), result[1]) + s = result.sum() + # s.backward() for i in range(nt.dim() - nt.nested_dim()): _map_fn(i, fn(nt, i + nt.nested_dim())) + @unittest.skip("Currently only supporting nested dim 1.") def test_softmax_1(self): ts = [[], []] - nt = nestedtensor.nested_tensor(ts) + nt = ntnt_nograd(ts) self._test_softmax(ts, nt) + @unittest.skip("Currently only supporting nested dim 1.") def test_softmax_2(self): t0 = torch.randn(3) t1 = torch.randn(2) t2 = torch.randn(3) ts = [[t0, t1], [t2]] - nt = nestedtensor.nested_tensor(ts) + nt = ntnt_nograd(ts) self._test_softmax(ts, nt) + @unittest.skip("Currently only supporting nested dim 1.") def test_softmax_3(self): t0 = torch.randn(3, 2, 1) t1 = torch.randn(2, 3, 1) t2 = torch.randn(3, 1, 2) ts = [[t0, t1], [t2]] - nt = nestedtensor.nested_tensor(ts) + nt = ntnt_nograd(ts) self._test_softmax(ts, nt) + @unittest.skip("Currently only supporting nested dim 1.") def test_softmax_4(self): ts = torch.randn(6, 4, 3, 2, 5) ts = list(map(lambda x: x.unbind(), ts.unbind())) - nt = nestedtensor.nested_tensor(ts) + nt = ntnt_nograd(ts) self._test_softmax(ts, nt) + @torch.inference_mode() + def test_mha(self): + embed_dim = 2 + num_heads = 2 + torch.manual_seed(1010) + mha = torch.nn.MultiheadAttention(embed_dim, num_heads) + query = torch.randn(3, 1, embed_dim, requires_grad=True) + key = torch.randn(2, 1, embed_dim, requires_grad=True) + value = torch.randn(2, 1, embed_dim, requires_grad=True) + attn_output, _ = mha(query, key, value) + nt_mha = torch.nn.MultiheadAttention(embed_dim, num_heads) + nt_mha.in_proj_weight = mha.in_proj_weight + nt_mha.in_proj_bias = mha.in_proj_bias + nt_mha.out_proj.weight = mha.out_proj.weight + nt_mha.out_proj.bias = mha.out_proj.bias + query_nt = ntnt_nograd([query.squeeze(1)]) + key_nt = ntnt_nograd([key.squeeze(1)]) + value_nt = ntnt_nograd([value.squeeze(1)]) + nt_attn_output, _ = nt_mha( + query_nt, key_nt, value_nt, need_weights=False) + self.assertEqual(attn_output.squeeze(1), nt_attn_output[0]) + + @torch.inference_mode() + def test_mha_detr(self): + NDIM = 128 + BSZ = 8 + NHEAD = 8 + RAND_INTS = [(1, 5), (7, 9)] + MODEL = torch.nn.MultiheadAttention(NDIM, NHEAD).eval() + + src_list = ntnt_nograd( + [torch.randn(NDIM, i, j) for (i, j) in RAND_INTS]) + detr_nt_src = DETRNestedTensor.from_tensor_list(src_list) + src0, mask = detr_nt_src.decompose() + src0.requires_grad_() + src = src0.flatten(2).permute(2, 0, 1) + mask = mask.flatten(1) + result, _ = MODEL(src, src, src, key_padding_mask=mask, + need_weights=False) # [0].sum().backward() + mask = (~mask.t().unsqueeze(2)).float() + result0 = result * mask + # result_sum = result.sum() + + src = ntnt_nograd([t.flatten(1).permute( + 1, 0) for t in src_list]) + result1, _ = MODEL(src, src, src, need_weights=False) + self.assertEqual(result0.sum(0).sum(0), result1.sum(1).sum(0)) + + @torch.inference_mode() + @unittest.skipIf(not torch.cuda.is_available(), "Test requires cuda") + def test_mha_detr_cuda(self): + NDIM = 128 + BSZ = 8 + NHEAD = 8 + RAND_INTS = [(1, 5), (7, 9)] + MODEL = torch.nn.MultiheadAttention(NDIM, NHEAD).cuda().eval() + + src_list = [torch.randn(NDIM, i, j) for (i, j) in RAND_INTS] + detr_nt_src = DETRNestedTensor.from_tensor_list(src_list) + src0, mask = detr_nt_src.decompose() + src = src0.flatten(2).permute(2, 0, 1).cuda() + mask = mask.flatten(1).cuda() + result, _ = MODEL(src, src, src, key_padding_mask=mask, + need_weights=False) # [0].sum().backward() + mask = (~mask.t().unsqueeze(2)).float() + result0 = result * mask + # result_sum = result.sum() + + src = ntnt_nograd([t.flatten(1).permute( + 1, 0) for t in src_list], device=torch.device('cuda')) + result1, _ = MODEL(src, src, src, need_weights=False) + self.assertEqual(result0.sum(0).sum(0), result1.sum(1).sum(0)) + + def test_squeeze(self): + t = torch.randn(2, 3) + result = ntnt_nograd([t]) + + # Currently only supporting nested dim 1. + # nt = ntnt_nograd([[t.reshape(1, 2, 1, 3)]]) + # # self.assertEqual(nt.squeeze(), result) + # self.assertRaises(RuntimeError, lambda: nt.squeeze()) + # nt.squeeze_() + # self.assertEqual(nt, result) + + nt = ntnt_nograd([t.reshape(2, 3)]) + # self.assertEqual(nt.squeeze(), result) + self.assertRaises(RuntimeError, lambda: nt.squeeze()) + nt.squeeze_() + self.assertEqual(nt, result) + + # Currently only supporting nested dim 1. + # nt = ntnt_nograd([[t.reshape(2, 3)]]) + # # self.assertEqual(nt.squeeze(), result) + # self.assertRaises(RuntimeError, lambda: nt.squeeze()) + # nt.squeeze_() + # self.assertEqual(nt, result) + + nt = ntnt_nograd([t.reshape(1, 2, 3)]) + # self.assertEqual(nt.squeeze(), result) + self.assertRaises(RuntimeError, lambda: nt.squeeze()) + nt.squeeze_() + self.assertEqual(nt, result) + + nt = ntnt_nograd([t.reshape(1, 2, 1, 3, 1)]) + # self.assertEqual(nt.squeeze(), result) + self.assertRaises(RuntimeError, lambda: nt.squeeze()) + nt.squeeze_() + self.assertEqual(nt, result) + + # Currently only supporting nested dim 1. + # nt = ntnt_nograd([[[t.reshape(1, 2, 3)]]]) + # # self.assertEqual(nt.squeeze(), result) + # self.assertRaises(RuntimeError, lambda: nt.squeeze()) + # nt.squeeze_() + # self.assertEqual(nt, result) + + # result = ntnt([t]) + # nt = ntnt([t.reshape(1, 2, 3)]) + # self.assertEqual(nt.squeeze(1), result) + # self.assertRaisesRegex( + # RuntimeError, "Cannot squeeze first dimension.", lambda: nt.squeeze(0)) + # self.assertRaisesRegex( + # RuntimeError, "Given dimension is either undefined or not a singleton.", lambda: nt.squeeze(2)) + # self.assertRaisesRegex( + # RuntimeError, "Given dimension is either undefined or not a singleton.", lambda: nt.squeeze(3)) + # self.assertRaises(IndexError, lambda: nt.squeeze(4)) + # a = nt.squeeze(1) + # a.sum().backward() + # self.assertEqual(nt.grad, ntnt_nograd( + # [t.reshape(1, 2, 3).mul(0).add(1)])) + + # nt = ntnt([[t.reshape(1, 2, 1, 3)]]) + # self.assertRaisesRegex( + # RuntimeError, "Cannot squeeze nested dimension.", lambda: nt.squeeze(1)) + # # self.assertEqual(nt.squeeze(1), ntnt( + # # [t.reshape(1, 2, 1, 3)])) + # self.assertEqual(nt.squeeze( + # 2), ntnt([[t.reshape(2, 1, 3)]])) + # self.assertEqual(nt.squeeze( + # 4), ntnt([[t.reshape(1, 2, 3)]])) + + def test_nn_max_pool2d(self): + data = [ + [ + torch.randn(3, 500, 600), + torch.randn(3, 128, 128) + ], + [ + torch.randn(3, 500, 600), + torch.randn(3, 500, 600) + ], + ] + + # with optional params + maxPool2d = torch.nn.MaxPool2d(kernel_size=( + 3, 3), stride=2, padding=(1, 1), dilation=1, ceil_mode=False) + for inputs in data: + tensor_res = [] + for i in range(2): + t_res = maxPool2d(inputs[i].unsqueeze(0).contiguous()) + tensor_res.append(t_res.squeeze(0)) + + nt = ntnt_nograd(inputs) + nt_res = maxPool2d(nt) + self.assertEqual(ntnt_nograd(tensor_res), nt_res) + + @unittest.skip("Currently broken") + def test_fzbn2d(self): + class FrozenBatchNorm2d(torch.nn.Module): + """ + BatchNorm2d where the batch statistics and the affine parameters are fixed. + Copy-paste from torchvision.misc.ops with added eps before rqsrt, + without which any other models than torchvision.models.resnet[18,34,50,101] + produce nans. + """ + + def __init__(self, n): + super(FrozenBatchNorm2d, self).__init__() + self.register_buffer("weight", torch.ones(n)) + self.register_buffer("bias", torch.zeros(n)) + self.register_buffer("running_mean", torch.zeros(n)) + self.register_buffer("running_var", torch.ones(n)) + + def _load_from_state_dict(self, state_dict, prefix, local_metadata, strict, + missing_keys, unexpected_keys, error_msgs): + num_batches_tracked_key = prefix + 'num_batches_tracked' + if num_batches_tracked_key in state_dict: + del state_dict[num_batches_tracked_key] + + super(FrozenBatchNorm2d, self)._load_from_state_dict( + state_dict, prefix, local_metadata, strict, + missing_keys, unexpected_keys, error_msgs) + + def forward(self, x): + # move reshapes to the beginning + # to make it fuser-friendly + print("1") + w = self.weight.reshape(-1, 1, 1) + print("2") + b = self.bias.reshape(-1, 1, 1) + print("3") + rv = self.running_var.reshape(-1, 1, 1) + print("4") + rm = self.running_mean.reshape(-1, 1, 1) + print("5") + eps = 1e-5 + print("6") + scale = w * (rv + eps).rsqrt() + print("7") + bias = b - rm * scale + print("8") + # return (x * scale + bias) + # return x + # return (x * scale + bias) + res = x + bias + print("9") + return res + + b0 = FrozenBatchNorm2d(64) # .cuda() + random.seed(1010) + torch.manual_seed(1310) + RAND_INTS = [random.randint(100, 300) for _ in range(1)] + tensors = [torch.rand(64, i, 256, requires_grad=False) + for i in RAND_INTS] + # RAND_INTS = [random.randint(1, 1) for _ in range(1)] + # tensors = [torch.rand(1, i, 2, requires_grad=True) + # for i in RAND_INTS] + nested_tensor = ntnt_nograd(tensors) + # print(nested_tensor.nested_size()) + s00 = b0(nested_tensor) + print("s00") + print(s00.requires_grad) + s0 = s00.sum() + # s0.backward() + + b1 = FrozenBatchNorm2d(64) + s1 = 0 + for t in tensors: + s1 += b1(t).sum() + # s1.backward() + self.assertEqual(s0, s1) + # for i in range(len(tensors)): + # self.assertEqual(nested_tensor.grad[i], tensors[i].grad) + + self.assertEqual(len((list(b0.named_parameters()))), 0) + self.assertEqual(len((list(b1.named_parameters()))), 0) + + @torch.inference_mode() + def test_layer_norm(self): + def _test(device, dtype, size): + print(f'device {device} dtype {dtype} size: {size}') + # Currently only supporting nested dim 1. + # layer_norm = torch.nn.LayerNorm((0,)).to(device) + # t0 = torch.randn(3) + # t1 = torch.randn(2) + # t2 = torch.randn(3) + # ts = [[t0, t1], [t2]] + # nt = ntnt_nograd(ts, device=device) + # self.assertRaisesRegex(RuntimeError, + # "Cannot normalize across irregular dimension 2", lambda: layer_norm(nt)) + + t0 = utils.gen_float_tensor(1, (2, size)).to(device).to(dtype) + t1 = utils.gen_float_tensor(2, (2, size)).to(device).to(dtype) + ts = [t0, t1, t0, t1] + nt = ntnt_nograd(ts, device=device, dtype=dtype) + layer_norm = torch.nn.LayerNorm(size).to(device).to(dtype) + nt_result = layer_norm(nt) + for i in range(len(ts)): + a = nt_result[i] + b = layer_norm( + ts[i].reshape(1, -1, size).squeeze(0)) + self.assertEqual(a, b) + + # layer_norm = torch.nn.LayerNorm(16).to(device).to(dtype) + # tt = utils.gen_float_tensor(1, (3, 23, 16)).to(device).to(dtype) + # res = layer_norm(tt) + # nt = nt + 3 + # res = res * 5 + # res = layer_norm(tt + 2) + # t0 = utils.gen_float_tensor(1, (3, 16)).to(device) + # t1 = utils.gen_float_tensor(2, (2, 16)).to(device) + # t2 = utils.gen_float_tensor(3, (3, 16)).to(device) + + # Currently only supporting nested dim 1. + # ts = [[t0, t1], [t2]] + # result = ntnt_nograd(ts, device=device) + # layer_norm(ts[0][0]) + # map(self.assertEqual, tuple( + # map(lambda x: layer_norm(x), ts[0])), result[0]) + # map(self.assertEqual, tuple( + # map(lambda x: layer_norm(x), ts[1])), result[1]) + + # layer_norm = torch.nn.LayerNorm(3).to(device) + # t0 = torch.randn(3, 3, 4) + # t1 = torch.randn(2, 3, 4) + # t2 = torch.randn(3, 3, 4) + # ts = [[t0, t1], [t2]] + # nt = ntnt_nograd(ts, device=device) + # self.assertRaisesRegex(RuntimeError, + # "Normalized shape \[3\] does not match the size of the last dimension \(4\) of input.", + # lambda: layer_norm(nt)) + + # layer_norm = torch.nn.LayerNorm((3, 2, 4)).to(device) + # self.assertRaisesRegex(RuntimeError, + # "Currently only singleton tuples of integers supported for layer_norm.", + # lambda: layer_norm(nt)) + for size in [1024, 512, 256, 128, 2, 4, 32]: + _test(torch.device('cpu'), torch.float32, size) + if torch.cuda.is_available(): + _test(torch.device('cuda'), torch.float16, size) + _test(torch.device('cuda'), torch.float32, size) + + @torch.inference_mode() + def test_decoder(self): + class TransformerDecoderLayer(nn.Module): + + def __init__(self, d_model, nhead, dim_feedforward=2048, dropout=0.1, + activation="relu", normalize_before=False): + super().__init__() + self.self_attn = torch.nn.MultiheadAttention( + d_model, nhead, dropout=dropout) + self.multihead_attn = torch.nn.MultiheadAttention( + d_model, nhead, dropout=dropout) + # Implementation of Feedforward model + self.linear1 = nn.Linear(d_model, dim_feedforward) + self.dropout = nn.Dropout(dropout) + self.linear2 = nn.Linear(dim_feedforward, d_model) + + self.norm1 = nn.LayerNorm(d_model) + self.norm2 = nn.LayerNorm(d_model) + self.norm3 = nn.LayerNorm(d_model) + self.dropout1 = nn.Dropout(dropout) + self.dropout2 = nn.Dropout(dropout) + self.dropout3 = nn.Dropout(dropout) + + self.activation = torch.nn.functional.relu + self.normalize_before = normalize_before + + def with_pos_embed(self, tensor, pos): + return tensor if pos is None else tensor + pos + + def forward(self, tgt, memory, + # tgt_mask: Optional[Tensor] = None, + # memory_mask: Optional[Tensor] = None, + # tgt_key_padding_mask: Optional[Tensor] = None, + # memory_key_padding_mask: Optional[Tensor] = None, + pos=None, query_pos=None): + q = k = self.with_pos_embed(tgt, query_pos) + tgt2 = self.self_attn(q, k, value=tgt, + need_weights=False)[0] + # tgt = tgt + self.dropout1(tgt2) + tgt = tgt + tgt2 + tgt = self.norm1(tgt) + tgt2 = self.multihead_attn(query=self.with_pos_embed(tgt, query_pos), + key=self.with_pos_embed( + memory, pos), + value=memory, + need_weights=False)[0] + # tgt = tgt + self.dropout2(tgt2) + tgt = tgt + tgt2 + tgt = self.norm2(tgt) + tgt2 = self.linear2(self.dropout( + self.activation(self.linear1(tgt)))) + # tgt = tgt + self.dropout3(tgt2) + tgt = tgt + tgt2 + tgt = self.norm3(tgt) + # print('tgt.requires_grad') + # print(tgt.requires_grad) + return tgt + + d = TransformerDecoderLayer(256, 8) + d.zero_grad() + a = d( + ntnt_nograd([ + torch.randn(864, 256), + torch.randn(360, 256)]), + ntnt_nograd([ + torch.randn(864, 256), + torch.randn(360, 256)]), + pos=ntnt_nograd([ + torch.randn(864, 256), + torch.randn(360, 256)]), + query_pos=ntnt_nograd([ + torch.randn(864, 256), + torch.randn(360, 256)]), + ) + # a.sum().backward() + # for (n, p) in d.named_parameters(): + # print(n) + # print(p is None) + + @torch.inference_mode() + @unittest.skipIf(not torch.cuda.is_available(), "Test requires cuda") + def test_effective_transformer_mha(self): + + def test(dtype, num_heads, batch_size, seq_len_, head_size, embedding_dim, + use_arange=False): + assert num_heads * head_size == embedding_dim + import random + inputs = [] + k = 0 + seq_len = 0 + seq_lens = [] + for _ in range(batch_size): + i = random.randint(1, seq_len_) + seq_len = max(i, seq_len) + seq_lens.append(i) + if use_arange: + inputs.append(torch.arange( + i * embedding_dim).reshape(i, embedding_dim)) + else: + inputs.append(torch.randn(i, embedding_dim)) + input_nt = nestedtensor.nested_tensor( + inputs, device=torch.device('cuda'), dtype=dtype) + + input_batch, input_mask = input_nt.to_tensor_mask(mask_dim=2) + + mha = torch.nn.MultiheadAttention(embedding_dim, num_heads) + mha = mha.to(dtype) + if use_arange: + in_proj_weight_test = torch.arange(mha.in_proj_weight.numel()).reshape( + mha.in_proj_weight.shape).to(dtype) + mha.in_proj_weight.copy_(in_proj_weight_test) + in_proj_weight = mha.in_proj_weight.clone().cuda() + + in_proj_bias = mha.in_proj_bias.clone().cuda() + + if use_arange: + out_proj_weight_test = torch.arange(mha.out_proj.weight.numel()).reshape( + mha.out_proj.weight.shape).to(dtype) + mha.out_proj.weight.copy_( + out_proj_weight_test) + out_proj_weight = mha.out_proj.weight.clone().cuda() + + import time + torch.cuda.synchronize() + torch.cuda.synchronize() + t0 = time.time() + scaling = float(head_size ** -0.5) + for _ in range(5): + result_nt = torch.ops.nestedtensor.bt_min_mha(num_heads, + head_size, + 0.5, + False, + input_nt, + input_nt, + input_nt, + in_proj_weight, + in_proj_bias, + scaling, + out_proj_weight, + in_proj_bias) + + torch.cuda.synchronize() + t1 = time.time() + a = t1 - t0 + + mha = mha.cuda() + torch.cuda.synchronize() + torch.cuda.synchronize() + t0 = time.time() + for _ in range(5): + attn_output, _ = mha(input_nt, input_nt, input_nt) + + torch.cuda.synchronize() + t1 = time.time() + b = t1 - t0 + + self.assertEqual(result_nt, attn_output) + + torch.cuda.synchronize() + input_batch = input_batch.transpose(0, 1) + not_input_mask = torch.logical_not(input_mask) + torch.cuda.synchronize() + t0 = time.time() + # print(input_batch.size()) + for _ in range(5): + attn_output, _ = mha( + input_batch, + input_batch, + input_batch, + key_padding_mask=not_input_mask) + + + torch.cuda.synchronize() + t1 = time.time() + attn_output = attn_output.transpose(0, 1) + attn_output = attn_output * torch.logical_not(not_input_mask.unsqueeze(-1)) + custom_atol = 5e-4 + custom_rtol = 1e-8 + r0 = result_nt.to_padded_tensor(padding=0) + r1 = attn_output + # print("r0.sum(): ", r0.sum(), " r1.sum(): ", r1.sum()) + self.assertTrue(torch.allclose(result_nt.to_padded_tensor(padding=0), attn_output, atol=custom_atol, rtol=custom_rtol)) + c = t1 - t0 + # print("bt: ", a, "\tnt: ", b, "\tdense: ", c, "\tdense/bt: ", c/a, "\tdtype: ", dtype) + + for dtype in [torch.float32, torch.float16]: + # test(dtype, 1, 1, 1, 4, 4, use_arange=True) + # test(dtype, 1, 1, 2, 2, 2, use_arange=True) + # test(dtype, 1, 2, 2, 1, 1, use_arange=True) + # test(dtype, 1, 4, 3, 2, 2, use_arange=True) + test(dtype, 2, 1, 2, 1, 2) + test(dtype, 1, 3, 5, 4, 4) + test(dtype, 2, 3, 5, 2, 4) + test(dtype, 2, 1, 2, 2, 4) + test(dtype, 2, 1, 2, 2, 4) + test(dtype, 2, 3, 5, 2, 4) + test(dtype, 1, 3, 5, 4, 4) + test(dtype, 8, 8, 50, 16, 128) + test(dtype, 16, 64, 50, 16, 256) + test(dtype, 16, 128, 50, 16, 256) + test(dtype, 16, 256, 50, 16, 256) + test(dtype, 4, 256, 50, 256, 1024) + test(dtype, 16, 256, 50, 64, 1024) + + @torch.inference_mode() + def test_relu(self): + nt = ntnt_nograd([torch.randn(2, 3), torch.randn(3, 2)]) + n1 = torch.nn.ReLU(inplace=False) + out1 = n1(nt) + n2 = torch.nn.ReLU(inplace=True) + out2 = n2(nt) + self.assertEqual(out1, out2) + self.assertEqual(out1, nt) + if __name__ == "__main__": unittest.main() diff --git a/test/test_nested_tensor_integration.py b/test/test_nested_tensor_integration.py index cc074093..7e403c68 100644 --- a/test/test_nested_tensor_integration.py +++ b/test/test_nested_tensor_integration.py @@ -1,16 +1,18 @@ -import traceback -import functools -import pdb -import sys import torch import nestedtensor import unittest -from utils import TestCase -import random -import utils -import torchvision -from torchvision.models._utils import IntermediateLayerGetter -from frozen_batch_norm_2d import NTFrozenBatchNorm2d +from utils_test_case import TestCase +from utils import debug_on + +try: + import classy_vision + TEST_CLASSY_VISION=True +except ModuleNotFoundError: + TEST_CLASSY_VISION=False + + +def ntnt(x): return nestedtensor.nested_tensor(x, requires_grad=True) +def ntnt_nograd(x): return nestedtensor.nested_tensor(x, requires_grad=False) class ConfusionMatrix(object): @@ -58,9 +60,23 @@ def __str__(self): class TestIntegration(TestCase): - @unittest.skipIf( - not utils.internet_on(), "Cannot reach internet to download reference model." - ) + def test_resnet18(self): + import torchvision + EXAMPLE_IMAGE_TENSORS = [torch.randn(3, 10, 10) for _ in range(3)] + model = torchvision.models.resnet.resnet18(pretrained=True).eval() + with torch.inference_mode(): + result_model_nt = model(ntnt_nograd( + EXAMPLE_IMAGE_TENSORS)).unbind() + result_model = model(torch.stack(EXAMPLE_IMAGE_TENSORS)).unbind() + for t0, t1 in zip(result_model_nt, result_model): + self.assertEqual(t0, t1) + + # non-regular shape smoke test + EXAMPLE_IMAGE_TENSORS = [torch.randn( + 3, 100 * i, 100) for i in range(1, 4)] + with torch.inference_mode(): + model(ntnt_nograd(EXAMPLE_IMAGE_TENSORS)) + def test_segmentation_pretrained_test_only(self): def _test(seed, model_factory, use_confmat, num_classes=21): @@ -103,14 +119,15 @@ def _test(seed, model_factory, use_confmat, num_classes=21): nt_tr1 = tr1.clone().detach() nt_tr2 = tr2.clone().detach() - nt_input = nestedtensor.nested_tensor( - [nt_t1, nt_t2], requires_grad=True) - nt_target = nestedtensor.nested_tensor( - [nt_tr1, nt_tr2], requires_grad=True) + nt_input = ntnt_nograd( + [nt_t1, nt_t2]) + nt_target = ntnt_nograd( + [nt_tr1, nt_tr2]) if use_confmat: confmat2 = ConfusionMatrix(num_classes) - output2 = model2(nt_input) + with torch.inference_mode(): + output2 = model2(nt_input) if use_confmat: output2 = output2["out"] else: @@ -125,30 +142,78 @@ def _test(seed, model_factory, use_confmat, num_classes=21): self.assertEqual(confmat.mat, confmat2.mat) # grad test - output1_sum = output1.sum() - output2_sum = output2.sum() - self.assertEqual(output1_sum, output2_sum) + self.assertEqual(ntnt_nograd(output1.unbind()), output2) - output1_sum.backward() - output2_sum.backward() + # output1.sum().backward() + # output2.sum().backward() - for (n1, p1), (n2, p2) in zip(model1.named_parameters(), model2.named_parameters()): - if p1.grad is not None: - self.assertEqual(p1.grad, p2.grad) - else: - self.assertIsNone(p2.grad) + # for (n1, p1), (n2, p2) in zip(model1.named_parameters(), model2.named_parameters()): + # if p1.grad is not None: + # self.assertEqual(p1.grad, p2.grad) + # else: + # self.assertIsNone(p2.grad) - # TODO: Re-enable under autograd support - self.assertEqual(t1.grad, nt_input.grad[0]) - self.assertEqual(t2.grad, nt_input.grad[1]) + # # TODO: Re-enable under autograd support + # self.assertEqual(t1.grad, nt_input.grad[0]) + # self.assertEqual(t2.grad, nt_input.grad[1]) - _test(1010, lambda: torchvision.models.segmentation.__dict__["fcn_resnet101"]( + import torchvision + _test(10, lambda: torchvision.models.segmentation.__dict__["fcn_resnet101"]( num_classes=21, aux_loss="store_true", pretrained=True ).eval(), True) - # _test(10, lambda: IntermediateLayerGetter(getattr(torchvision.models, "resnet18")( + # _test(1010, lambda: IntermediateLayerGetter(getattr(torchvision.models, "resnet18")( # replace_stride_with_dilation=[False, False, False], - # pretrained=True, norm_layer=FrozenBatchNorm2d), {'layer4': "0"}), False) + # pretrained=True, norm_layer=NTFrozenBatchNorm2d), {'layer4': "0"}), False) + + def test_transformer_forward(self): + EMBED_DIM = 32 + NHEAD = 8 + t = torch.nn.Transformer(EMBED_DIM, NHEAD, dropout=0.0) + + src0 = torch.randn(2, EMBED_DIM) + src1 = torch.randn(4, EMBED_DIM) + nt_src = ntnt_nograd([src0, src1]) + + tgt0 = torch.randn(3, EMBED_DIM) + tgt1 = torch.randn(5, EMBED_DIM) + nt_tgt = ntnt_nograd([tgt0, tgt1]) + + res_0 = t(src0.unsqueeze(1), tgt0.unsqueeze(1)).squeeze(1) + res_1 = t(src1.unsqueeze(1), tgt1.unsqueeze(1)).squeeze(1) + with torch.inference_mode(): + res_nt = t(nt_src, nt_tgt) + + for t0, t1 in zip(res_nt.unbind(), [res_0, res_1]): + self.assertEqual(t0, t1) + + @unittest.skipIf(not TEST_CLASSY_VISION, "No classy vision") + def test_fusion_resnext101_32x4d(self): + @torch.inference_mode() + def _test(dtype, use_channels_last): + from classy_vision.models import build_model + from torch.fx import symbolic_trace + model = build_model({"name": "resnext101_32x4d"}).eval().cuda() + model._initialize_weights(False) + # This is needed to allow tracing, but for makes no difference for resnext + model = model.classy_model + fused = nestedtensor.fuse_conv_bn(model) + fused = nestedtensor.fuse_conv_relu(fused) + model = model.to(dtype) + fused = fused.to(dtype) + data = torch.randn(2, 3, 50, 50, device=torch.device('cuda'), dtype=dtype) + ref_output = model(data) + if use_channels_last: + data = data.contiguous(memory_format=torch.channels_last) + new_output = fused(data) + if dtype == torch.float16: + self.assertEqual(ref_output, new_output, prec=2e-3) + else: + self.assertEqual(ref_output, new_output) + _test(torch.float32, False) + _test(torch.float16, False) + _test(torch.float16, True) + _test(torch.float32, True) if __name__ == "__main__": diff --git a/test/test_nested_tensor_masking.py b/test/test_nested_tensor_masking.py index d177abfc..b4b5fc58 100644 --- a/test/test_nested_tensor_masking.py +++ b/test/test_nested_tensor_masking.py @@ -1,7 +1,8 @@ import torch import nestedtensor as nt import unittest -from utils import TestCase +from utils_test_case import TestCase + class TestTensorMask(TestCase): # @@ -14,99 +15,50 @@ def test_empty_nt(self): TestCase.assertEqual(self, mask, torch.tensor(False)) TestCase.assertEqual(self, tensor, torch.tensor([0])) - a = nt.nested_tensor([ - nt.nested_tensor([]) - ]) - - tensor, mask = a.to_tensor_mask() - - TestCase.assertEqual(self, mask, torch.tensor(False)) - TestCase.assertEqual(self, tensor, torch.tensor([[0]])) - - a = nt.nested_tensor([ - nt.nested_tensor([]), - nt.nested_tensor([]) - ]) - - tensor, mask = a.to_tensor_mask() - TestCase.assertEqual(self, mask, torch.tensor(False)) - TestCase.assertEqual(self, tensor, torch.tensor([[0], [0]])) - - #TODO once .to_list() bug fixed + # TODO once .to_list() bug fixed def test_empty_tensor(self): - #a = nt.nested_tensor([ - # torch.tensor([]) - # ]) - #self.assertRaisesRegex(RuntimeError, "Empty tensors are not yet supported.", lambda: a.to_tensor_mask()) - a = nt.nested_tensor([ - nt.nested_tensor([ - torch.tensor([]) - ]) + torch.tensor([]) ]) - self.assertRaisesRegex(RuntimeError, "Empty tensors are not yet supported.", lambda: a.to_tensor_mask()) + self.assertRaisesRegex(RuntimeError, + "Empty tensors are not yet supported.", + lambda: a.to_tensor_mask()) def test_single_scalar(self): a = nt.nested_tensor([ - torch.tensor(1, dtype=torch.uint8) - ]) - tensor, mask = a.to_tensor_mask() - TestCase.assertEqual(self, tensor, torch.tensor([1], dtype=torch.uint8)) - TestCase.assertEqual(self, mask, torch.tensor(True)) - - tensor, mask = a.to_tensor_mask(mask_dim=0) - TestCase.assertEqual(self, tensor, torch.tensor([1], dtype=torch.uint8)) - TestCase.assertEqual(self, mask, torch.tensor(True)) - - tensor, mask = a.to_tensor_mask(mask_dim=1) - TestCase.assertEqual(self, tensor, torch.tensor([1], dtype=torch.uint8)) - TestCase.assertEqual(self, mask, torch.tensor([True])) - - self.assertRaisesRegex(RuntimeError, "Mask dimension is bigger than nested dimension of a nested tensor.", lambda: a.to_tensor_mask(mask_dim=2)) - - a = nt.nested_tensor([ - nt.nested_tensor([ - torch.tensor(1, dtype=torch.bfloat16) - ]) - ]) - + torch.tensor(1, dtype=torch.uint8) + ]) tensor, mask = a.to_tensor_mask() - TestCase.assertEqual(self, tensor, torch.tensor([[1]], dtype=torch.bfloat16)) + TestCase.assertEqual( + self, tensor, torch.tensor([1], dtype=torch.uint8)) TestCase.assertEqual(self, mask, torch.tensor(True)) tensor, mask = a.to_tensor_mask(mask_dim=0) - TestCase.assertEqual(self, tensor, torch.tensor([[1]], dtype=torch.bfloat16)) + TestCase.assertEqual( + self, tensor, torch.tensor([1], dtype=torch.uint8)) TestCase.assertEqual(self, mask, torch.tensor(True)) tensor, mask = a.to_tensor_mask(mask_dim=1) - TestCase.assertEqual(self, tensor, torch.tensor([[1]], dtype=torch.bfloat16)) + TestCase.assertEqual( + self, tensor, torch.tensor([1], dtype=torch.uint8)) TestCase.assertEqual(self, mask, torch.tensor([True])) - tensor, mask = a.to_tensor_mask(mask_dim=2) - TestCase.assertEqual(self, tensor, torch.tensor([[1]], dtype=torch.bfloat16)) - TestCase.assertEqual(self, mask, torch.tensor([[True]])) - - self.assertRaisesRegex(RuntimeError, "Mask dimension is bigger than nested dimension of a nested tensor.", lambda: a.to_tensor_mask(mask_dim=3)) + self.assertRaisesRegex( + RuntimeError, + "Requested mask dimension 2 is bigger than dimension 1 of given NestedTensor.", + lambda: a.to_tensor_mask(mask_dim=2)) - #TODO once .to_list() bug fixed + # TODO once .to_list() bug fixed + @unittest.skip("Currently only supporting nested dim 1.") def test_multi_scalar(self): # TODO: add test cases - #a = nt.nested_tensor([ - # torch.tensor(1), - # torch.tensor(2), - # torch.tensor(3) - # ]) - #tensor, mask = a.to_tensor_mask() - a = nt.nested_tensor([ - nt.nested_tensor([ - torch.tensor(1), - torch.tensor(2), - torch.tensor(3) - ]) - ]) - + torch.tensor(1), + torch.tensor(2), + torch.tensor(3) + ]) tensor, mask = a.to_tensor_mask() + TestCase.assertEqual(self, tensor, torch.tensor([[1, 2, 3]])) TestCase.assertEqual(self, mask, torch.tensor(True)) @@ -118,60 +70,15 @@ def test_multi_scalar(self): TestCase.assertEqual(self, tensor, torch.tensor([[1, 2, 3]])) TestCase.assertEqual(self, mask, torch.tensor([[True, True, True]])) - self.assertRaisesRegex(RuntimeError, "Mask dimension is bigger than nested dimension of a nested tensor.", lambda: a.to_tensor_mask(mask_dim=3)) - - a = nt.nested_tensor([ - nt.nested_tensor([ - torch.tensor(1) - ]), - nt.nested_tensor([ - torch.tensor(2) - ]), - nt.nested_tensor([ - torch.tensor(3) - ]) - ]) - tensor, mask = a.to_tensor_mask() - TestCase.assertEqual(self, tensor, torch.tensor([[1], [2], [3]])) - TestCase.assertEqual(self, mask, torch.tensor(True)) - - tensor, mask = a.to_tensor_mask(mask_dim=1) - TestCase.assertEqual(self, tensor, torch.tensor([[1], [2], [3]])) - TestCase.assertEqual(self, mask, torch.tensor([True, True, True])) - - tensor, mask = a.to_tensor_mask(mask_dim=2) - TestCase.assertEqual(self, tensor, torch.tensor([[1], [2], [3]])) - TestCase.assertEqual(self, mask, torch.tensor([[True], [True], [True]])) - - def test_scalar_and_empty_nt(self): - a = nt.nested_tensor([ - nt.nested_tensor([]), - nt.nested_tensor([ - torch.tensor(11, dtype=torch.long) - ]) - ]) - - tensor, mask = a.to_tensor_mask() - TestCase.assertEqual(self, tensor, torch.tensor([[0], [11]], dtype=torch.long)) - TestCase.assertEqual(self, mask, torch.tensor([False, True])) - - @unittest.skipIf(not torch.cuda.is_available(), "CUDA not enabled.") - def test_scalar_and_empty_nt_cuda(self): - a = nt.nested_tensor([ - nt.nested_tensor([], dtype=torch.long, device='cuda'), - nt.nested_tensor([ - torch.tensor(11, dtype=torch.long, device='cuda') - ]) - ]) - - tensor, mask = a.to_tensor_mask() - TestCase.assertEqual(self, tensor, torch.tensor([[0], [11]], dtype=torch.long, device='cuda')) - TestCase.assertEqual(self, mask, torch.tensor([False, True], device='cuda')) + self.assertRaisesRegex( + RuntimeError, + "Requested mask dimension 3 is bigger than dimension 2 of given NestedTensor.", + lambda: a.to_tensor_mask(mask_dim=3)) def test_single_tensor(self): a = nt.nested_tensor([ - torch.tensor([1]) - ]) + torch.tensor([1]) + ]) tensor, mask = a.to_tensor_mask() TestCase.assertEqual(self, tensor, torch.tensor([[1]])) TestCase.assertEqual(self, mask, torch.tensor(True)) @@ -188,246 +95,66 @@ def test_single_tensor(self): TestCase.assertEqual(self, tensor, torch.tensor([[1]])) TestCase.assertEqual(self, mask, torch.tensor([[True]])) - self.assertRaisesRegex(RuntimeError, "Mask dimension is bigger than nested dimension of a nested tensor.", lambda: a.to_tensor_mask(mask_dim=3)) - - # Extra dim - a = nt.nested_tensor([ - nt.nested_tensor([ - torch.tensor([1]) - ]) - ]) - - tensor, mask = a.to_tensor_mask() - TestCase.assertEqual(self, tensor, torch.tensor([[[1]]])) - TestCase.assertEqual(self, mask, torch.tensor(True)) - - tensor, mask = a.to_tensor_mask(mask_dim=0) - TestCase.assertEqual(self, tensor, torch.tensor([[[1]]])) - TestCase.assertEqual(self, mask, torch.tensor(True)) - - tensor, mask = a.to_tensor_mask(mask_dim=1) - TestCase.assertEqual(self, tensor, torch.tensor([[[1]]])) - TestCase.assertEqual(self, mask, torch.tensor([True])) - - tensor, mask = a.to_tensor_mask(mask_dim=2) - TestCase.assertEqual(self, tensor, torch.tensor([[[1]]])) - TestCase.assertEqual(self, mask, torch.tensor([[True]])) - - tensor, mask = a.to_tensor_mask(mask_dim=3) - TestCase.assertEqual(self, tensor, torch.tensor([[[1]]])) - TestCase.assertEqual(self, mask, torch.tensor([[[True]]])) - - self.assertRaisesRegex(RuntimeError, "Mask dimension is bigger than nested dimension of a nested tensor.", lambda: a.to_tensor_mask(mask_dim=4)) + self.assertRaisesRegex( + RuntimeError, + "Requested mask dimension 3 is bigger than dimension 2 of given NestedTensor.", + lambda: a.to_tensor_mask(mask_dim=3)) def test_multi_tensor(self): a = nt.nested_tensor([ - torch.tensor([1]), - torch.tensor([2]), - torch.tensor([3]) - ]) + torch.tensor([1]), + torch.tensor([2]), + torch.tensor([3]) + ]) tensor, mask = a.to_tensor_mask() TestCase.assertEqual(self, tensor, torch.tensor([[1], - [2], - [3]])) + [2], + [3]])) TestCase.assertEqual(self, mask, torch.tensor(True)) tensor, mask = a.to_tensor_mask(mask_dim=0) TestCase.assertEqual(self, tensor, torch.tensor([[1], - [2], - [3]])) + [2], + [3]])) TestCase.assertEqual(self, mask, torch.tensor(True)) tensor, mask = a.to_tensor_mask(mask_dim=1) TestCase.assertEqual(self, tensor, torch.tensor([[1], - [2], - [3]])) + [2], + [3]])) TestCase.assertEqual(self, mask, torch.tensor([True, True, True])) tensor, mask = a.to_tensor_mask(mask_dim=2) TestCase.assertEqual(self, tensor, torch.tensor([[1], - [2], - [3]])) - TestCase.assertEqual(self, mask, torch.tensor([[True], [True], [True]])) - - a = nt.nested_tensor([ - nt.nested_tensor([ - torch.tensor([1]), - torch.tensor([2]), - torch.tensor([3]) - ]) - ]) - tensor, mask = a.to_tensor_mask() - TestCase.assertEqual(self, tensor, torch.tensor([[[1], [2], [3]]])) - TestCase.assertEqual(self, mask, torch.tensor(True)) - - tensor, mask = a.to_tensor_mask(mask_dim=1) - TestCase.assertEqual(self, tensor, torch.tensor([[[1], [2], [3]]])) - TestCase.assertEqual(self, mask, torch.tensor([True])) - - tensor, mask = a.to_tensor_mask(mask_dim=2) - TestCase.assertEqual(self, tensor, torch.tensor([[[1], [2], [3]]])) - TestCase.assertEqual(self, mask, torch.tensor([[True, True, True]])) - - a = nt.nested_tensor([ - nt.nested_tensor([ - torch.tensor([1]) - ]), - nt.nested_tensor([ - torch.tensor([2]) - ]), - nt.nested_tensor([ - torch.tensor([3]) - ]) - ]) - tensor, mask = a.to_tensor_mask() - TestCase.assertEqual(self, tensor, torch.tensor([[[1]], [[2]], [[3]]])) - TestCase.assertEqual(self, mask, torch.tensor(True)) - - tensor, mask = a.to_tensor_mask(mask_dim=1) - TestCase.assertEqual(self, tensor, torch.tensor([[[1]], [[2]], [[3]]])) - TestCase.assertEqual(self, mask, torch.tensor([True, True, True])) - - tensor, mask = a.to_tensor_mask(mask_dim=2) - TestCase.assertEqual(self, tensor, torch.tensor([[[1]], [[2]], [[3]]])) - TestCase.assertEqual(self, mask, torch.tensor([[True], [True], [True]])) - - def test_multi_tensor2(self): - a = nt.nested_tensor([ - nt.nested_tensor([ - nt.nested_tensor([ - torch.tensor([[1, 2, 3, 4], - [5, 6, 7, 8]], dtype=torch.bfloat16, requires_grad=True) - ]), - nt.nested_tensor([ - torch.tensor([[0, 0], [3, 4]], dtype=torch.bfloat16, requires_grad=True) - ]), - nt.nested_tensor([ - torch.tensor([[1]], dtype=torch.bfloat16, requires_grad=True) - ]), - ]) - ]) - - expected_t = torch.tensor([[ - [[[1, 2, 3, 4], - [5, 6, 7, 8]]], - [[[0, 0, 0, 0], - [3, 4, 0, 0]]], - [[[1, 0, 0, 0], - [0, 0, 0, 0]]], - ]]) - - expected_m = torch.tensor([[ - [[[ True, True, True, True], - [ True, True, True, True]]], - [[[ True, True, False, False], - [ True, True, False, False]]], - [[[ True, False, False, False], - [False, False, False, False]]]]]) - - tensor, mask = a.to_tensor_mask() - TestCase.assertEqual(self, expected_t, tensor) - TestCase.assertEqual(self, expected_m, mask) - - @unittest.skipIf(not torch.cuda.is_available(), "CUDA not enabled.") - def test_multi_tensor2_cuda(self): - a = nt.nested_tensor([ - nt.nested_tensor([ - nt.nested_tensor([ - torch.tensor([[1, 2, 3, 4], - [5, 6, 7, 8]], dtype=torch.bfloat16, device='cuda', requires_grad=True) - ]), - nt.nested_tensor([ - torch.tensor([[0, 0], [3, 4]], dtype=torch.bfloat16, device='cuda', requires_grad=True) - ]), - nt.nested_tensor([ - torch.tensor([[1]], dtype=torch.bfloat16, device='cuda', requires_grad=True) - ]), - ]) - ]) - - expected_t = torch.tensor([[ - [[[1, 2, 3, 4], - [5, 6, 7, 8]]], - [[[0, 0, 0, 0], - [3, 4, 0, 0]]], - [[[1, 0, 0, 0], - [0, 0, 0, 0]]], - ]]) - - expected_m = torch.tensor([[ - [[[ True, True, True, True], - [ True, True, True, True]]], - [[[ True, True, False, False], - [ True, True, False, False]]], - [[[ True, False, False, False], - [False, False, False, False]]]]]) - - tensor, mask = a.to_tensor_mask() - TestCase.assertEqual(self, expected_t, tensor) - TestCase.assertEqual(self, expected_m, mask) - - def test_multi_tensor3(self): - a = nt.nested_tensor([ - nt.nested_tensor([ - torch.tensor([[1, 2, 3], [4, 5, 6]]), - torch.tensor([[1, 2, 0, 4], [4, 0, 6, 5]]), - torch.tensor([[0, 0], [0, 0]]) - ]) - ]) - - expected_t = torch.tensor([[ - [[1, 2, 3, 0], [4, 5, 6, 0]], - [[1, 2, 0, 4], [4, 0, 6, 5]], - [[0, 0, 0, 0], [0, 0, 0, 0]] - ]]) - - expected_m = torch.tensor([[ - [[True, True, True, False], [True, True, True, False]], - [[True, True, True, True], [True, True, True, True]], - [[True, True, False, False], [True, True, False, False]] - ]]) - - tensor, mask = a.to_tensor_mask() - TestCase.assertEqual(self, expected_t, tensor) - TestCase.assertEqual(self, expected_m, mask) + [2], + [3]])) + TestCase.assertEqual( + self, mask, torch.tensor([[True], [True], [True]])) + @torch.inference_mode() def test_mask_dim_too_small_error(self): a = nt.nested_tensor([ - torch.tensor([1, 2,]), + torch.tensor([1, 2, ]), torch.tensor([3, 4, 5, 6]), ]) - self.assertRaisesRegex(RuntimeError, "Mask dimension is too small to represent data tensor.", lambda: a.to_tensor_mask(mask_dim=1)) - - a = nt.nested_tensor([ - nt.nested_tensor([ - nt.nested_tensor([ - torch.tensor([[1, 2, 3, 4], - [5, 6, 7, 8]]) - ]), - nt.nested_tensor([ - torch.tensor([[0, 0], [3, 4]]) - ]), - nt.nested_tensor([ - torch.tensor([[1]]) - ]), - ]) - ]) - - for dim in range(4): - self.assertRaisesRegex(RuntimeError, "Mask dimension is too small to represent data tensor.", lambda: a.to_tensor_mask(mask_dim=dim)) - + self.assertRaisesRegex( + RuntimeError, "Mask dimension is too small to represent data tensor.", lambda: a.to_tensor_mask(mask_dim=1)) # # Group of tests to test nested_tensor_from_tensor_mask() # def test_ntftm_nested_dim_0_error(self): tensor = torch.tensor([]) - self.assertRaisesRegex(RuntimeError, "Nested dimension can't be 0.", lambda: nt.nested_tensor_from_tensor_mask(tensor, tensor, nested_dim=0)) + self.assertRaisesRegex(RuntimeError, "Nested dimension can't be 0.", + lambda: nt.nested_tensor_from_tensor_mask(tensor, tensor, nested_dim=0)) def test_ntftm_none_passed(self): - self.assertRaises(RuntimeError, lambda: nt.nested_tensor_from_tensor_mask(None, None)) - self.assertRaises(RuntimeError, lambda: nt.nested_tensor_from_tensor_mask(torch.tensor([]), None)) + self.assertRaises( + RuntimeError, lambda: nt.nested_tensor_from_tensor_mask(None, None)) + self.assertRaises(RuntimeError, lambda: nt.nested_tensor_from_tensor_mask( + torch.tensor([]), None)) + @torch.inference_mode() def test_ntftm_empty(self): tensor = torch.tensor([]) @@ -435,11 +162,13 @@ def test_ntftm_empty(self): TestCase.assertEqual(self, res_nt, nt.nested_tensor([])) TestCase.assertEqual(self, res_nt.nested_dim(), 1) - res_nt = nt.nested_tensor_from_tensor_mask(tensor, tensor, nested_dim=1) + res_nt = nt.nested_tensor_from_tensor_mask( + tensor, tensor, nested_dim=1) TestCase.assertEqual(self, res_nt, nt.nested_tensor([])) TestCase.assertEqual(self, res_nt.nested_dim(), 1) - self.assertRaises(RuntimeError, lambda: nt.nested_tensor_from_tensor_mask(tensor, tensor, nested_dim=2)) + self.assertRaises(RuntimeError, lambda: nt.nested_tensor_from_tensor_mask( + tensor, tensor, nested_dim=2)) def test_ntftm_empty2(self): tensor = torch.tensor([[], []]) @@ -449,21 +178,19 @@ def test_ntftm_empty2(self): torch.tensor([]), ]) - expected_nt2 = nt.nested_tensor([ - nt.nested_tensor([]), - nt.nested_tensor([]) - ]) - res_nt = nt.nested_tensor_from_tensor_mask(tensor, tensor) TestCase.assertEqual(self, res_nt, expected_nt1) - res_nt = nt.nested_tensor_from_tensor_mask(tensor, tensor, nested_dim=1) + res_nt = nt.nested_tensor_from_tensor_mask( + tensor, tensor, nested_dim=1) TestCase.assertEqual(self, res_nt, expected_nt1) - res_nt = nt.nested_tensor_from_tensor_mask(tensor, tensor, nested_dim=2) - TestCase.assertEqual(self, res_nt, expected_nt2) + res_nt = nt.nested_tensor_from_tensor_mask(tensor, tensor) + TestCase.assertEqual(self, res_nt, expected_nt1) - self.assertRaises(RuntimeError, lambda: nt.nested_tensor_from_tensor_mask(tensor, tensor, nested_dim=3)) + res_nt = nt.nested_tensor_from_tensor_mask( + tensor, tensor, nested_dim=1) + TestCase.assertEqual(self, res_nt, expected_nt1) def test_ntftm_empty3(self): tensor = torch.tensor([0]) @@ -475,14 +202,6 @@ def test_ntftm_empty3(self): tensor = torch.tensor([[0], [0]]) mask = torch.tensor([[False], [False]]) - expected_nt = nt.nested_tensor([ - nt.nested_tensor([]), - nt.nested_tensor([]) - ]) - - res_nt = nt.nested_tensor_from_tensor_mask(tensor, mask, nested_dim=expected_nt.nested_dim()) - TestCase.assertEqual(self, res_nt, expected_nt) - def test_ntftm_empty_error(self): tensor = torch.tensor([]) mask = torch.tensor([True]) @@ -506,10 +225,11 @@ def test_ntftm_single_scalar_mask_false(self): def test_ntftm_single_scalar_error(self): tensor = torch.tensor(1) mask = torch.tensor(True) - self.assertRaisesRegex(RuntimeError, "Can't construct nested tensor from a scalar.", lambda: nt.nested_tensor_from_tensor_mask(tensor, mask)) + self.assertRaisesRegex(RuntimeError, "Can't construct nested tensor from a scalar.", + lambda: nt.nested_tensor_from_tensor_mask(tensor, mask)) def test_ntftm_single_scalar(self): - tensor = torch.tensor([1]) + tensor = torch.tensor([1], dtype=torch.float) mask = torch.tensor(True) res_nt = nt.nested_tensor_from_tensor_mask(tensor, mask) TestCase.assertEqual(self, res_nt, nt.nested_tensor([torch.tensor(1)])) @@ -519,152 +239,89 @@ def test_ntftm_single_scalar(self): TestCase.assertEqual(self, res_nt, nt.nested_tensor([torch.tensor(1)])) # Extra dim - tensor = torch.tensor([[1]]) + tensor = torch.tensor([[1]], dtype=torch.float) mask = torch.tensor(True) res_nt = nt.nested_tensor_from_tensor_mask(tensor, mask) TestCase.assertEqual(self, res_nt, - nt.nested_tensor([ - torch.tensor([1]) - ])) - - res_nt = nt.nested_tensor_from_tensor_mask(tensor, mask, nested_dim=2) - TestCase.assertEqual(self, res_nt, - nt.nested_tensor([ - nt.nested_tensor([ - torch.tensor(1) - ]) - ])) + nt.nested_tensor([ + torch.tensor([1]) + ])) def test_ntftm_multi_scalars(self): tensor = torch.tensor([1, 2, 3]) mask = torch.tensor(True) res_nt = nt.nested_tensor_from_tensor_mask(tensor, mask) TestCase.assertEqual(self, res_nt, - nt.nested_tensor([ - torch.tensor(1), - torch.tensor(2), - torch.tensor(3) - ])) + nt.nested_tensor([ + torch.tensor(1), + torch.tensor(2), + torch.tensor(3) + ], dtype=torch.int64)) mask = torch.tensor([True]) res_nt = nt.nested_tensor_from_tensor_mask(tensor, mask) TestCase.assertEqual(self, res_nt, - nt.nested_tensor([ - torch.tensor(1), - torch.tensor(2), - torch.tensor(3) - ])) + nt.nested_tensor([ + torch.tensor(1), + torch.tensor(2), + torch.tensor(3) + ], dtype=torch.int64)) - self.assertRaises(RuntimeError, lambda: nt.nested_tensor_from_tensor_mask(tensor, mask, nested_dim=2)) + self.assertRaises(RuntimeError, lambda: nt.nested_tensor_from_tensor_mask( + tensor, mask, nested_dim=2)) # Extra dim tensor = torch.tensor([[1, 2, 3]]) mask = torch.tensor(True) res_nt = nt.nested_tensor_from_tensor_mask(tensor, mask) TestCase.assertEqual(self, res_nt, - nt.nested_tensor([ - torch.tensor([1, 2, 3]) - ])) - - res_nt = nt.nested_tensor_from_tensor_mask(tensor, mask, nested_dim=2) - TestCase.assertEqual(self, res_nt, - nt.nested_tensor([ - nt.nested_tensor([ - torch.tensor(1), - torch.tensor(2), - torch.tensor(3) - ]) - ])) + nt.nested_tensor([ + torch.tensor([1, 2, 3]) + ], dtype=torch.int64)) def test_ntftm_single_tensor_all_true_mask(self): - tensor = torch.tensor([[1]]) + tensor = torch.tensor([[1]], dtype=torch.float) mask = torch.tensor(True) res_nt = nt.nested_tensor_from_tensor_mask(tensor, mask) - TestCase.assertEqual(self, res_nt, nt.nested_tensor([torch.tensor([1])])) + TestCase.assertEqual( + self, res_nt, nt.nested_tensor([torch.tensor([1])])) mask = torch.tensor([True]) res_nt = nt.nested_tensor_from_tensor_mask(tensor, mask) - TestCase.assertEqual(self, res_nt, nt.nested_tensor([torch.tensor([1])])) + TestCase.assertEqual( + self, res_nt, nt.nested_tensor([torch.tensor([1])])) def test_ntftm_multi_tensor_scalar_true_mask(self): tensor = torch.tensor([[1], [2], [3]]) mask = torch.tensor(True) res_nt = nt.nested_tensor_from_tensor_mask(tensor, mask) TestCase.assertEqual(self, res_nt, - nt.nested_tensor([ - torch.tensor([1]), - torch.tensor([2]), - torch.tensor([3]) - ])) + nt.nested_tensor([ + torch.tensor([1]), + torch.tensor([2]), + torch.tensor([3]) + ], dtype=tensor.dtype)) # Extra dim tensor = torch.tensor([[[1]], [[2]], [[3]]]) res_nt = nt.nested_tensor_from_tensor_mask(tensor, mask) expected_res1 = nt.nested_tensor([ - torch.tensor([[1]]), - torch.tensor([[2]]), - torch.tensor([[3]]) - ]) + torch.tensor([[1]]), + torch.tensor([[2]]), + torch.tensor([[3]]) + ], dtype=tensor.dtype) TestCase.assertEqual(self, res_nt, expected_res1) - res_nt = nt.nested_tensor_from_tensor_mask(tensor, mask, nested_dim=2) - expected_res2 = nt.nested_tensor([ - nt.nested_tensor([ - torch.tensor([1]) - ]), - nt.nested_tensor([ - torch.tensor([2]) - ]), - nt.nested_tensor([ - torch.tensor([3]) - ]) - ]) - TestCase.assertEqual(self, res_nt, expected_res2) - - res_nt = nt.nested_tensor_from_tensor_mask(tensor, mask, nested_dim=3) - expected_res3 = nt.nested_tensor([ - nt.nested_tensor([ - nt.nested_tensor([ - torch.tensor(1) - ]) - ]), - nt.nested_tensor([ - nt.nested_tensor([ - torch.tensor(2) - ]) - ]), - nt.nested_tensor([ - nt.nested_tensor([ - torch.tensor(3) - ]) - ]) - ]) - TestCase.assertEqual(self, res_nt, expected_res3) - - self.assertRaises(RuntimeError, lambda: nt.nested_tensor_from_tensor_mask(tensor, mask, nested_dim=4)) - def test_ntftm_multi_tensor_true_mask(self): extected_nt1 = nt.nested_tensor([ - torch.tensor([[1]]), - torch.tensor([[2]]), - torch.tensor([[3]]) - ]) - - extected_nt2 = nt.nested_tensor([ - nt.nested_tensor([ - torch.tensor([1]) - ]), - nt.nested_tensor([ - torch.tensor([2]) - ]), - nt.nested_tensor([ - torch.tensor([3]) - ]) - ]) + torch.tensor([[1]]), + torch.tensor([[2]]), + torch.tensor([[3]]) + ]) tensor = torch.tensor([[[1]], [[2]], - [[3]]]) + [[3]]], dtype=torch.float) # Mask dim 3 mask3 = torch.tensor([[[True]], @@ -674,35 +331,25 @@ def test_ntftm_multi_tensor_true_mask(self): res_nt = nt.nested_tensor_from_tensor_mask(tensor, mask3) TestCase.assertEqual(self, extected_nt1, res_nt) - res_nt = nt.nested_tensor_from_tensor_mask(tensor, mask3, nested_dim=2) - TestCase.assertEqual(self, extected_nt2, res_nt) - # Mask dim 2 mask2 = torch.tensor([[True], [True], [True]]) + res_nt = nt.nested_tensor_from_tensor_mask(tensor, mask2) TestCase.assertEqual(self, extected_nt1, res_nt) - res_nt = nt.nested_tensor_from_tensor_mask(tensor, mask2, nested_dim=2) - TestCase.assertEqual(self, extected_nt2, res_nt) - # Mask dim 1 mask1 = torch.tensor([True, True, True]) + res_nt = nt.nested_tensor_from_tensor_mask(tensor, mask1) TestCase.assertEqual(self, extected_nt1, res_nt) - res_nt = nt.nested_tensor_from_tensor_mask(tensor, mask1, nested_dim=2) - TestCase.assertEqual(self, extected_nt2, res_nt) - # Mask dim 0 mask0 = torch.tensor(True) res_nt = nt.nested_tensor_from_tensor_mask(tensor, mask0) TestCase.assertEqual(self, extected_nt1, res_nt) - res_nt = nt.nested_tensor_from_tensor_mask(tensor, mask0, nested_dim=2) - TestCase.assertEqual(self, extected_nt2, res_nt) - def test_ntftm_single_tensor_all_false_mask(self): tensor = torch.tensor([[1]]) mask = torch.tensor([False]) @@ -720,9 +367,6 @@ def test_ntftm_multi_tensor_all_false_mask(self): res_nt = nt.nested_tensor_from_tensor_mask(tensor, mask) TestCase.assertEqual(self, res_nt, nt.nested_tensor([])) - res_nt = nt.nested_tensor_from_tensor_mask(tensor, mask, nested_dim=2) - TestCase.assertEqual(self, res_nt, nt.nested_tensor([])) - mask = torch.tensor([False, False, False]) res_nt = nt.nested_tensor_from_tensor_mask(tensor, mask) TestCase.assertEqual(self, res_nt, nt.nested_tensor([])) @@ -730,330 +374,108 @@ def test_ntftm_multi_tensor_all_false_mask(self): mask = torch.tensor([[False], [False], [False]]) res_nt = nt.nested_tensor_from_tensor_mask(tensor, mask) TestCase.assertEqual(self, res_nt, - nt.nested_tensor([ - torch.tensor([], dtype=tensor.dtype) - ])) - - res_nt = nt.nested_tensor_from_tensor_mask(tensor, mask, nested_dim=3) - TestCase.assertEqual(self, res_nt, - nt.nested_tensor([ - nt.nested_tensor([ - ]) - ])) - - self.assertRaises(RuntimeError, lambda: nt.nested_tensor_from_tensor_mask(tensor, mask, nested_dim=4)) + nt.nested_tensor([ + torch.tensor([], dtype=tensor.dtype) + ], dtype=torch.int64)) def test_ntftm_multi_tensor_all_false_mask2(self): tensor = torch.tensor([[[1], [2], [3]]]) mask = torch.tensor([[[False], [False], [False]]]) res_nt = nt.nested_tensor_from_tensor_mask(tensor, mask) TestCase.assertEqual(self, res_nt, - nt.nested_tensor([ - torch.empty((3, 0), dtype=tensor.dtype) - ])) - - res_nt = nt.nested_tensor_from_tensor_mask(tensor, mask, nested_dim=2) - TestCase.assertEqual(self, res_nt, - nt.nested_tensor([ - nt.nested_tensor([ - torch.tensor([], dtype=tensor.dtype), - torch.tensor([], dtype=tensor.dtype), - torch.tensor([], dtype=tensor.dtype) - ]) - ])) + nt.nested_tensor([ + torch.empty((3, 0), dtype=tensor.dtype) + ], dtype=tensor.dtype)) def test_ntgtm_multi_scalar_mix_mask(self): - tensor = torch.tensor([1, 2, 3, 4]) + tensor = torch.tensor([1, 2, 3, 4], dtype=torch.float) mask = torch.tensor([True, False, False, True]) expected_nt = nt.nested_tensor([ - torch.tensor(1), - torch.tensor(4) - ]) + torch.tensor(1), + torch.tensor(4) + ]) res_nt = nt.nested_tensor_from_tensor_mask(tensor, mask) TestCase.assertEqual(self, expected_nt, res_nt) def test_ntgtm_multi_tensor_mix_mask(self): - tensor = torch.tensor([[1], [2], [3], [4]]) + tensor = torch.tensor([[1], [2], [3], [4]], dtype=torch.float) mask = torch.tensor([True, False, False, True]) expected_nt = nt.nested_tensor([ - torch.tensor([1]), - torch.tensor([4]) - ]) + torch.tensor([1]), + torch.tensor([4]) + ]) res_nt = nt.nested_tensor_from_tensor_mask(tensor, mask) TestCase.assertEqual(self, expected_nt, res_nt) def test_ntgtm_scalar_with_empty_mix_mask(self): - tensor = torch.tensor([[0], [11]]) + tensor = torch.tensor([[0], [11]], dtype=torch.float) mask = torch.tensor([False, True]) expected_nt1 = nt.nested_tensor([ torch.tensor([11], dtype=torch.long) ]) - expected_nt2 = nt.nested_tensor([ - nt.nested_tensor([]), - nt.nested_tensor([ - torch.tensor(11, dtype=torch.long) - ]) - ]) - res_nt = nt.nested_tensor_from_tensor_mask(tensor, mask) TestCase.assertEqual(self, expected_nt1, res_nt) - res_nt = nt.nested_tensor_from_tensor_mask(tensor, mask, nested_dim=2) - TestCase.assertEqual(self, expected_nt2, res_nt) - def test_ntftm_test_multi_tensor_mix_mask(self): expected_nt1 = nt.nested_tensor([ - torch.tensor([1, 2, 3]), - torch.tensor([4]) - ]) - - expected_nt2 = nt.nested_tensor([ - nt.nested_tensor([ - torch.tensor(1), - torch.tensor(2), - torch.tensor(3) - ]), - nt.nested_tensor([ - torch.tensor(4) - ]) + torch.tensor([1, 2, 3]), + torch.tensor([4]) ]) tensor = torch.tensor([[1, 2, 3], - [4, 0, 0]]) - mask = torch.tensor([[ True, True, True], - [ True, False, False]]) + [4, 0, 0]], dtype=torch.float) + mask = torch.tensor([[True, True, True], + [True, False, False]]) res_nt = nt.nested_tensor_from_tensor_mask(tensor, mask, nested_dim=1) TestCase.assertEqual(self, expected_nt1, res_nt) - res_nt = nt.nested_tensor_from_tensor_mask(tensor, mask, nested_dim=2) - TestCase.assertEqual(self, expected_nt2, res_nt) - def test_ntftm_test_multi_tensor_mix_mask2(self): expected_nt1 = nt.nested_tensor([ torch.tensor([[1, 2, 3]]), torch.tensor([[4]]) ]) - expected_nt2 = nt.nested_tensor([ - nt.nested_tensor([ - torch.tensor([1, 2, 3]) - ]), - nt.nested_tensor([ - torch.tensor([4]) - ]) - ]) - - expected_nt3 = nt.nested_tensor([ - nt.nested_tensor([ - nt.nested_tensor([ - torch.tensor(1), - torch.tensor(2), - torch.tensor(3) - ]) - ]), - nt.nested_tensor([ - nt.nested_tensor([ - torch.tensor(4) - ]) - ]) - ]) - tensor = torch.tensor([[[1, 2, 3]], - [[4, 0, 0]]]) - mask = torch.tensor([[[ True, True, True]], - [[ True, False, False]]]) + [[4, 0, 0]]], dtype=torch.float) + mask = torch.tensor([[[True, True, True]], + [[True, False, False]]]) res_nt = nt.nested_tensor_from_tensor_mask(tensor, mask, nested_dim=1) TestCase.assertEqual(self, expected_nt1, res_nt) - res_nt = nt.nested_tensor_from_tensor_mask(tensor, mask, nested_dim=2) - TestCase.assertEqual(self, expected_nt2, res_nt) - - res_nt = nt.nested_tensor_from_tensor_mask(tensor, mask, nested_dim=3) - TestCase.assertEqual(self, expected_nt3, res_nt) - - self.assertRaises(RuntimeError, lambda: nt.nested_tensor_from_tensor_mask(tensor, mask, nested_dim=4)) - - def test_ntftm_test_multi_tensor_mix_mask3(self): - expected_nt2 = nt.nested_tensor([ - nt.nested_tensor([ - torch.tensor([[[1, 2, 3, 4], - [5, 6, 7, 8]]]), - torch.tensor([[[0, 0], - [3, 4]]]), - torch.tensor([[[1]]]) - ]) - ]) - - expected_nt3 = nt.nested_tensor([ - nt.nested_tensor([ - nt.nested_tensor([ - torch.tensor([[1, 2, 3, 4], - [5, 6, 7, 8]]) - ]), - nt.nested_tensor([ - torch.tensor([[0, 0], - [3, 4]]) - ]), - nt.nested_tensor([ - torch.tensor([[1]]) - ]), - ]) - ]) - - expected_nt4 = nt.nested_tensor([ - nt.nested_tensor([ - nt.nested_tensor([ - nt.nested_tensor([ - torch.tensor([1, 2, 3, 4]), - torch.tensor([5, 6, 7, 8]) - ]) - ]), - nt.nested_tensor([ - nt.nested_tensor([ - torch.tensor([0, 0]), - torch.tensor([3, 4]) - ]) - ]), - nt.nested_tensor([ - nt.nested_tensor([ - torch.tensor([1]), - torch.tensor([], dtype=torch.long) - ]) - ]) - ]) - ]) - - expected_nt5 = nt.nested_tensor([ - nt.nested_tensor([ - nt.nested_tensor([ - nt.nested_tensor([ - nt.nested_tensor([ - torch.tensor(1), - torch.tensor(2), - torch.tensor(3), - torch.tensor(4) - ]), - nt.nested_tensor([ - torch.tensor(5), - torch.tensor(6), - torch.tensor(7), - torch.tensor(8) - ]), - ]) - ]), - nt.nested_tensor([ - nt.nested_tensor([ - nt.nested_tensor([ - torch.tensor(0), - torch.tensor(0) - ]), - nt.nested_tensor([ - torch.tensor(3), - torch.tensor(4) - ]) - ]) - ]), - nt.nested_tensor([ - nt.nested_tensor([ - nt.nested_tensor([ - torch.tensor(1) - ]), - nt.nested_tensor([ - ]) - ]) - ]) - ]) - ]) - - tensor = torch.tensor([ - [ - [[[1, 2, 3, 4], - [5, 6, 7, 8]]], - [[[0, 0, 0, 0], - [3, 4, 0, 0]]], - [[[1, 0, 0, 0], - [0, 0, 0, 0]]], - ] - ]) - - mask = torch.tensor([[ - [[[ True, True, True, True], - [ True, True, True, True]]], - [[[ True, True, False, False], - [ True, True, False, False]]], - [[[ True, False, False, False], - [False, False, False, False]]]]]) - - self.assertRaises(RuntimeError, lambda: nt.nested_tensor_from_tensor_mask(tensor, mask, nested_dim=1)) - - res_nt = nt.nested_tensor_from_tensor_mask(tensor, mask, nested_dim=2) - TestCase.assertEqual(self, expected_nt2, res_nt) - - res_nt = nt.nested_tensor_from_tensor_mask(tensor, mask, nested_dim=3) - TestCase.assertEqual(self, expected_nt3, res_nt) - - res_nt = nt.nested_tensor_from_tensor_mask(tensor, mask, nested_dim=4) - TestCase.assertEqual(self, expected_nt4, res_nt) - - res_nt = nt.nested_tensor_from_tensor_mask(tensor, mask, nested_dim=5) - TestCase.assertEqual(self, expected_nt5, res_nt) - - self.assertRaises(RuntimeError, lambda: nt.nested_tensor_from_tensor_mask(tensor, mask, nested_dim=6)) - - def test_ntftm_mask_dim(self): - a = nt.nested_tensor([ - nt.nested_tensor([ - nt.nested_tensor([ - torch.tensor([[1, 2, 3, 4], - [5, 6, 7, 8]], dtype=torch.float16, requires_grad=False) - ]), - nt.nested_tensor([ - torch.tensor([[1, 2, 3, 4], - [5, 6, 7, 8]], dtype=torch.float16, requires_grad=False) - ]), - nt.nested_tensor([ - torch.tensor([[1, 2, 3, 4], - [5, 6, 7, 8]], dtype=torch.float16, requires_grad=False) - ]), - ]) - ]) - - for i in range(a.dim()): - t, m = a.to_tensor_mask(mask_dim=i) - res_nt = nt.nested_tensor_from_tensor_mask(t, m, nested_dim=a.nested_dim()) - TestCase.assertEqual(self, a, res_nt) - TestCase.assertEqual(self, res_nt.nested_dim(), a.nested_dim()) - - @unittest.skipIf(not torch.cuda.is_available(), "CUDA not enabled.") - def test_ntftm_mask_dim_cuda(self): - a = nt.nested_tensor([ - nt.nested_tensor([ - nt.nested_tensor([ - torch.tensor([[1, 2, 3, 4], - [5, 6, 7, 8]], dtype=torch.float16, device='cuda', requires_grad=False) - ]), - nt.nested_tensor([ - torch.tensor([[1, 2, 3, 4], - [5, 6, 7, 8]], dtype=torch.float16, device='cuda', requires_grad=False) - ]), - nt.nested_tensor([ - torch.tensor([[1, 2, 3, 4], - [5, 6, 7, 8]], dtype=torch.float16, device='cuda', requires_grad=False) - ]), - ]) - ]) + self.assertRaises(RuntimeError, lambda: nt.nested_tensor_from_tensor_mask( + tensor, mask, nested_dim=4)) + + def test_to_padded_tensor(self): + data1 = torch.tensor( + [[[0.8413, 0.7325, 0.0000, 0.0000], + [0.0000, 0.0000, 0.0000, 0.0000], + [0.0000, 0.0000, 0.0000, 0.0000]], + + [[0.6334, 0.5473, 0.3273, 0.0564], + [0.3023, 0.6826, 0.3519, 0.1804], + [0.8431, 0.1645, 0.1821, 0.9185]]]) + mask1 = torch.tensor( + [[[True, True, False, False], + [False, False, False, False], + [False, False, False, False]], + + [[True, True, True, True], + [True, True, True, True], + [True, True, True, True]]]) + nt2 = nt.nested_tensor_from_tensor_mask(data1, mask1) + data2, mask2 = nt2.to_tensor_mask() + self.assertEqual(data1, data2) + self.assertEqual(mask1, mask2) + data3 = nt2.to_padded_tensor(padding=-10) + data1 = data1 + ~mask1 * -10 + self.assertEqual(data1, data3) - for i in range(a.dim()): - t, m = a.to_tensor_mask(mask_dim=i) - res_nt = nt.nested_tensor_from_tensor_mask(t, m, nested_dim=a.nested_dim()) - TestCase.assertEqual(self, a, res_nt) - TestCase.assertEqual(self, res_nt.nested_dim(), a.nested_dim()) if __name__ == "__main__": unittest.main() diff --git a/test/test_nested_tensor_nary.py b/test/test_nested_tensor_nary.py index 9a87b527..a6137423 100644 --- a/test/test_nested_tensor_nary.py +++ b/test/test_nested_tensor_nary.py @@ -1,20 +1,19 @@ -import traceback -import functools -import pdb -import sys import torch import nestedtensor import unittest -from utils import TestCase from utils import get_unary_functions from utils import get_binary_functions -from utils import get_python_binary_arithmetic_operations -import random import utils +from utils_test_case import TestCase -def ntnt(x): return nestedtensor.nested_tensor(x, requires_grad=True) -def ntnt_nograd(x): return nestedtensor.nested_tensor(x) +def ntnt(x, device=None): + return nestedtensor.nested_tensor( + x, requires_grad=False, device=device) + + +def ntnt_nograd(x, device=None): + return nestedtensor.nested_tensor(x, device=device) class DynamicClassBase(TestCase): @@ -23,7 +22,7 @@ class DynamicClassBase(TestCase): def _gen_test_unary(func__, nested_dim, device): def _test_unary(self): - data = utils.gen_nested_list(1, nested_dim, 3) + data = utils.gen_nested_list(1, nested_dim, 3, size_high=1) data = utils.nested_map(lambda x: x.to(device), data) if func__ in ['log', 'log10', 'log2', 'rsqrt', 'sqrt']: @@ -33,8 +32,6 @@ def _test_unary(self): if func__ in ['mvlgamma']: data = utils.nested_map(lambda x: x.clamp(min=1), data) - a1 = nestedtensor.nested_tensor(data, device=device) - a3 = nestedtensor.nested_tensor(data, device=device) func_ = getattr(torch, func__) method_ = getattr(nestedtensor.NestedTensor, func__) method_inplace_ = getattr(nestedtensor.NestedTensor, func__ + "_") @@ -92,127 +89,129 @@ def method_inplace(x): return method_inplace_(x, 0.3) method = method_ method_inplace = method_inplace_ - a2 = nestedtensor.nested_tensor( + def _close(t1, t2): + self.assertAlmostEqual(t1, t2, ignore_contiguity=True) + + a1 = ntnt(data, device=device) + a2 = ntnt( utils.nested_map(func, data), device=device) + _close(func(a1), a2) + _close(method(a1), a2) - self.assertTrue(a1.nested_dim() == a2.nested_dim()) - self.assertTrue(a2.nested_dim() == a3.nested_dim()) + a1 = ntnt_nograd(data, device=device) + a2 = ntnt_nograd( + utils.nested_map(func, data), device=device) + a3 = ntnt_nograd(data, device=device) - def _close(t1, t2): - self.assertAlmostEqual(t1, t2, ignore_contiguity=True) + self.assertEqual(a1.nested_dim(), a2.nested_dim()) + self.assertEqual(a2.nested_dim(), a3.nested_dim()) if func__ not in ['mvlgamma']: func(a1, out=a3) # TODO: Abstract this _close(func(a1), a3) - _close(func(a1), a2) - _close(method(a1), a2) _close(method_inplace(a1), a2) _close(a1, a2) return _test_unary -def _gen_test_binary(func): +def _gen_test_binary(func, no_grad): def _test_binary(self): - a = utils.gen_float_tensor(1, (2, 3)) * 0 + 1 - b = utils.gen_float_tensor(2, (2, 3)) * 0 + 2 - c = utils.gen_float_tensor(3, (2, 3)) * 0 + 3 + a = utils.gen_float_tensor(1, (2, 3)) # * 0 + 1 + b = utils.gen_float_tensor(2, (2, 3)) # * 0 + 2 + c = utils.gen_float_tensor(3, (2, 3)) # * 0 + 3 + d = utils.gen_float_tensor(4, (3, 2)) # * 0 + 4 + s = utils.gen_float_tensor(5, (1,)) # * 0 + 5 + torch_func = getattr(torch, func) - # The constructor is supposed to copy! a1 = ntnt([a, b]) - if func == "remainder": + if no_grad: a2 = ntnt_nograd([b, c]) else: a2 = ntnt([b, c]) - a3 = ntnt([getattr(torch, func)(a, b), - getattr(torch, func)(b, c)]) - res1 = getattr(torch, func)(a1, a2) - res1.sum().backward() - self.assertIsNotNone(a1.grad) - if func == "remainder": + a3 = ntnt([torch_func(a, b), + torch_func(b, c)]) + res1 = torch_func(a1, a2) + if not no_grad: + res1.sum().backward() + self.assertIsNotNone(a1.grad) + if no_grad: self.assertIsNone(a2.grad) else: self.assertIsNotNone(a2.grad) - self.assertEqual(a3, getattr(torch, func)(a1, a2)) + self.assertEqual(a3, torch_func(a1, a2)) self.assertEqual(a3, getattr(a1, func)(a2)) - a1 = a1.detach() - a3.detach_() + # a1.detach_() + # a2.detach_() + # a3.detach_() self.assertEqual(a3, getattr(a1, func + "_")(a2)) self.assertEqual(a3, a1) - # The constructor is supposed to copy! + # Test NT x T a1 = ntnt([a, b]) a2 = c - a3 = ntnt([getattr(torch, func)(a, a2), - getattr(torch, func)(b, a2)]) + a3 = ntnt([torch_func(a, a2), + torch_func(b, a2)]) - self.assertEqual(a3, getattr(torch, func)(a1, a2)) + self.assertEqual(a3, torch_func(a1, a2)) self.assertEqual(a3, getattr(a1, func)(a2)) - # TODO: Add check for broadcasting smaller tensors / tensor constiuents + # Test NT x T with broadcasting + if func not in ["pow", "atan2"]: + a1 = ntnt([a, b]) + a2 = torch.tensor([1, 2]).reshape(-1, 1, 1) + a3 = ntnt([torch_func(a, 1), + torch_func(b, 2)]) + self.assertEqual(a3, torch_func(a1, a2)) + self.assertEqual(a3, getattr(a1, func)(a2)) + + if func in ["pow"]: + apow = utils.gen_float_tensor(1, (2, 3)) + bpow = utils.gen_float_tensor(2, (2, 3)) + a1pow = ntnt([apow, bpow]) + a3pow = ntnt([torch_func(3.0, apow), + torch_func(3.0, bpow)]) + self.assertEqual(a3pow, torch_func(3.0, a1pow)) + + a1 = ntnt([a, d]) + self.assertEqual(ntnt([torch_func(a, s), torch_func(d, s)]), + torch_func(a1, s)) - # self.assertRaisesRegex(RuntimeError, "tensor dimension of self must match or be greater than dimension of other.", - # lambda: getattr(torch, func)(a1, c.reshape(1, 2, 3))) - # if func == "remainder": + a1 = ntnt([a, b]) + self.assertEqual(ntnt([torch_func(a, c), + torch_func(b, c) + ]), + torch_func(a1, c.reshape(1, 2, 3))) + + result = ntnt([torch_func(c, a), + torch_func(c, b) + ]) + # if no_grad: # a1.detach_() - # self.assertRaisesRegex(RuntimeError, "tensor dimension of other must match or be greater than dimension of self.", - # lambda: getattr(torch, func)(c.reshape(1, 2, 3), a1)) - # self.assertRaisesRegex(RuntimeError, "tensor dimension of other must match or be greater than dimension of self.", - # lambda: getattr(torch, func)(c.reshape(1, 2, 3), a1)) + # result.detach_() + self.assertEqual(result, + torch_func(c.reshape(1, 2, 3), a1)) - a1 = a1.detach() - a3 = a3.detach() + # a1 = a1.detach() + # a3 = a3.detach() self.assertEqual(a3, getattr(a1, func + "_")(a2)) self.assertEqual(a3, a1) # The constructor is supposed to copy! a1 = c a2 = ntnt([a, b]) - a3 = ntnt([getattr(torch, func)(c, a), - getattr(torch, func)(c, b)]) - if func == "remainder": - a2.detach_() - a3.detach_() - self.assertEqual(a3, getattr(torch, func)(a1, a2)) - # TODO: This depends on https://github.com/pytorch/rfcs/pull/3 - # RFC-0001: Add method __torch_function__ RFC. - # TODO: This causes a segfault likely due https://github.com/pytorch/pytorch/pull/37091 + a3 = ntnt([torch_func(c, a), + torch_func(c, b)]) + # if no_grad: + # a2.detach_() + # a3.detach_() + self.assertEqual(a3, torch_func(a1, a2)) self.assertEqual(a3, getattr(a1, func)(a2)) # Cannot apply in-place methods to regular Tensors given a NestedTensor as an other # TODO: Only sub doesn't adhere to this rule but with irregular behavior if func == "add": self.assertEqual(c + a + b, getattr(a1, func + "_")(a2)) - # test autograd - a = utils.gen_float_tensor(1, (2, 3)).requires_grad_() - b = utils.gen_float_tensor(2, (2, 3)).requires_grad_() - c = utils.gen_float_tensor(3, (2, 3)).requires_grad_() - - a1 = ntnt([a, b]) - if func == "remainder": - a2 = ntnt_nograd([b, c]) - else: - a2 = ntnt([b, c]) - if func == "remainder": - a3 = ntnt([getattr(torch, func)(a, b.detach()), - getattr(torch, func)(b, c.detach())]) - else: - a3 = ntnt([getattr(torch, func)(a, b), - getattr(torch, func)(b, c)]) - # print(a3.requires_grad) - result = getattr(torch, func)(a1, a2) - # print(result.requires_grad) - result.sum().backward() - if func == "remainder": - c.detach_() - result = getattr(torch, func)(a1, c) - result.sum().backward() - # print(result.requires_grad) - if func == "remainder": - a1.detach_() - result = getattr(torch, func)(c, a1) - # print(result.requires_grad) - return _test_binary @@ -246,9 +245,8 @@ def _test_binary_method(self): TestUnary = type('TestUnary', (DynamicClassBase,), {}) for func__ in get_unary_functions(): - if func__ == 'fill': - continue - for nested_dim in range(1, 5): + # TODO: Currently only supporting nested dim 1. + for nested_dim in [1]: avail_devices = [torch.device('cpu')] if torch.cuda.is_available(): avail_devices += [torch.device('cuda')] @@ -258,16 +256,17 @@ def _test_binary_method(self): TestBinary = type('TestBinary', (DynamicClassBase,), {}) for func in get_binary_functions(): + no_grad = True setattr(TestBinary, "test_{0}".format(func), - _gen_test_binary(func)) - -TestBinaryMethod = type('TestBinaryMethod', (DynamicClassBase,), {}) -for func in get_python_binary_arithmetic_operations(): - # Not implemented yet - if func in ['divmod', 'and', 'lshift', 'matmul', 'mod', 'or', 'rshift', 'xor']: - continue - setattr(TestBinaryMethod, "test_{0}".format(func), - _gen_test_binary_method(func)) + _gen_test_binary(func, no_grad)) + +# TestBinaryMethod = type('TestBinaryMethod', (DynamicClassBase,), {}) +# for func in get_python_binary_arithmetic_operations(): +# # Not implemented yet +# if func in ['divmod', 'and', 'lshift', 'matmul', 'mod', 'or', 'rshift', 'xor']: +# continue +# setattr(TestBinaryMethod, "test_{0}".format(func), +# _gen_test_binary_method(func)) if __name__ == "__main__": unittest.main() diff --git a/test/test_nested_tensor_reduce.py b/test/test_nested_tensor_reduce.py index 185cf8e9..6e8089b0 100644 --- a/test/test_nested_tensor_reduce.py +++ b/test/test_nested_tensor_reduce.py @@ -1,69 +1,283 @@ -import traceback -import functools -import pdb -import sys import torch import nestedtensor import unittest -from utils import TestCase -import random +from utils_test_case import TestCase -import utils +from nestedtensor.nested.nested import native_is_expandable_to + + +def ntnt(x): return nestedtensor.nested_tensor(x, requires_grad=False) + + +def _flatten_list(ts): + if not isinstance(ts, list): + return [ts] + return sum(map(_flatten_list, ts), []) + + +def _flatten_nt(nt): + if not isinstance(nt, nestedtensor.NestedTensor): + return [nt] + return sum(map(_flatten_nt, nt.unbind()), []) -def ntnt(x): return nestedtensor.nested_tensor(x, requires_grad=True) class TestReduce(TestCase): - def _test_reduce_dim(self, fn): - t0 = torch.arange(9).float().reshape(3, 3) - t1 = torch.arange(6).float().reshape(2, 3) - t2 = torch.arange(9).float().reshape(3, 3) - ts = [[t0, t1], [t2]] - nt = nestedtensor.nested_tensor(ts) - - self.assertRaises(RuntimeError, lambda: fn(nt, 0)) - self.assertRaises(RuntimeError, lambda: fn(nt, 1)) - self.assertEqual(nestedtensor.nested_tensor([[fn(t0, 0), fn(t1, 0)], - [fn(t2, 0)]]), fn(nt, 2)) - self.assertEqual(nestedtensor.nested_tensor([[fn(t0, 1), fn(t1, 1)], - [fn(t2, 1)]]), fn(nt, 3)) - self.assertRaises(IndexError, lambda: fn(nt, 4)) + def _test_reduce_dim(self, fn, associative=True, test_keep_dim=True, test_multi_dim=True): + pass + # Currently only supporting nested dim 1. + # t0 = torch.arange(9).float().reshape(3, 3) + # t1 = torch.arange(6).float().reshape(2, 3) + # t2 = torch.arange(9).float().reshape(3, 3) + # ts = [[t0, t1], [t2, t1]] + # nt = ntnt(ts) + # if associative and test_multi_dim: + # t01 = fn(torch.stack([fn(t0, 0), fn(t1, 0)]), 0) + # t21 = fn(torch.stack([fn(t2, 0), fn(t1, 0)]), 0) + # t02 = fn(torch.stack([fn(t0, 0), fn(t2, 0)]), 0) + # t11 = fn(torch.stack([fn(t1, 0), fn(t1, 0)]), 0) + # self.assertEqual(ntnt([t01, t21]), fn(nt, (1, 2))) + # self.assertEqual(ntnt([t02, t11]), fn(nt, (0, 2))) + + # if test_keep_dim: + # t01 = fn(torch.stack([fn(t0, 0), fn(t1, 0)]), 0, True) + # t21 = fn(torch.stack([fn(t2, 0), fn(t1, 0)]), 0, True) + # t02 = fn(torch.stack([fn(t0, 0), fn(t2, 0)]), 0, True) + # t11 = fn(torch.stack([fn(t1, 0), fn(t1, 0)]), 0, True) + # self.assertEqual(ntnt([[t01, t21]]), fn(nt, (1, 2), True)) + # self.assertEqual(ntnt([[t02, t11]]), fn(nt, (0, 2), True)) + + # Currently only supporting nested dim 1. + # ts = [[t0, t1], [t2]] + # nt = ntnt(ts) + # self.assertRaises(RuntimeError, lambda: fn(nt, 0)) + # self.assertRaises(RuntimeError, lambda: fn(nt, 1)) + # self.assertEqual(ntnt([[fn(t0, 0), fn(t1, 0)], + # [fn(t2, 0)]]), fn(nt, 2)) + # self.assertEqual(ntnt([[fn(t0, 1), fn(t1, 1)], + # [fn(t2, 1)]]), fn(nt, 3)) + # if test_keep_dim: + # self.assertEqual(ntnt([[fn(t0, 0, True), fn(t1, 0, True)], + # [fn(t2, 0, True)]]), fn(nt, 2, True)) + # self.assertEqual(ntnt([[fn(t0, 1, True), fn(t1, 1, True)], + # [fn(t2, 1, True)]]), fn(nt, 3, True)) + # self.assertRaises(IndexError, lambda: fn(nt, 4)) def test_cumsum(self): - self._test_reduce_dim(torch.cumsum) + self._test_reduce_dim(torch.cumsum, False, False) def _test_allreduce(self, fn, with_grad=False): - t0 = torch.randn(3, 3, requires_grad=True) - t1 = torch.randn(2, 3, requires_grad=True) - t2 = torch.randn(3, 3, requires_grad=True) - ts = [[t0, t1], [t2]] - # nt = nestedtensor.nested_tensor(ts) #, requires_grad=True) - if with_grad: - nt = ntnt(ts) - else: - nt = nestedtensor.nested_tensor(ts) - t = fn(nt) - a = torch.stack([fn(t0), fn(t1), fn(t2)]) - self.assertEqual(t, fn(a)) - fn(a).backward() - if with_grad: - t.backward() - # TODO: Re-enable under autograd - self.assertEqual(nt.grad[0][0], t0.grad) - self.assertEqual(nt.grad[0][1], t1.grad) - self.assertEqual(nt.grad[1][0], t2.grad) - - def test_sum(self): - self._test_allreduce(lambda x: x.sum(), True) - self._test_reduce_dim(torch.sum) - - def test_mean(self): + def test(ts): + if with_grad: + nt = ntnt(ts) + else: + nt = nestedtensor.nested_tensor(ts) + t = fn(nt) + flat_ts = _flatten_list(ts) + a = torch.cat([x.reshape(-1) for x in flat_ts]) + a_res = fn(a) + # print("_0_") + # print(t) + # print(a_res) + self.assertEqual(t, a_res) + if with_grad: + a_res.backward() + t.backward() + nt_grads = _flatten_nt(nt.grad) + for a, b in zip(nt_grads, flat_ts): + # print(a) + # print(b.grad) + # print("--") + self.assertEqual(a, b.grad) + + def gen_ts(): + t0 = torch.randn(4, 3, requires_grad=True) + t1 = torch.randn(2, 3, requires_grad=True) + t2 = torch.randn(3, 4, requires_grad=True) + t3 = torch.randn(3, 4, requires_grad=True) + t4 = torch.randn(3, 4, requires_grad=True) + return t0, t1, t2, t3, t4 + + t0, t1, t2, t3, t4 = gen_ts() + test([t0]) + t0, t1, t2, t3, t4 = gen_ts() + test([t0, t1]) + t0, t1, t2, t3, t4 = gen_ts() + test([t0, t1, t2]) + t0, t1, t2, t3, t4 = gen_ts() + test([t0, t1, t2, t3]) + # Currently only supporting nested dim 1. + # t0, t1, t2, t3, t4 = gen_ts() + # test([[t0], [t1, t2]]) + # t0, t1, t2, t3, t4 = gen_ts() + # test([[t0, t1], [t2]]) + # t0, t1, t2, t3, t4 = gen_ts() + # test([[t0, t1], [t2, t3]]) + # t0, t1, t2, t3, t4 = gen_ts() + # test([[t0, t1], [t2, t3], [t4]]) + + def test_sum_all(self): + # self._test_allreduce(lambda x: x.sum(), True) + self._test_allreduce(lambda x: x.sum(), False) + + def test_sum_dim(self): + # self._test_reduce_dim(torch.sum, True) + self._test_reduce_dim(torch.sum, False) + + def test_max_all(self): + self._test_allreduce(lambda x: x.max()) + + def test_max_dim(self): + self._test_reduce_dim(lambda x, dim, keepdim=False: x.max( + dim, keepdim)[0], True, test_multi_dim=False) + + def test_mean_all(self): self._test_allreduce(lambda x: x.mean()) - self._test_reduce_dim(torch.mean) + + def test_mean_dim(self): + # self._test_reduce_dim(torch.mean, True) + self._test_reduce_dim(torch.mean, False) def test_prod(self): self._test_allreduce(lambda x: x.prod()) + def test_var(self): + # self._test_allreduce(lambda x: x.var(unbiased=False), True) + self._test_allreduce(lambda x: x.var(unbiased=False), False) + self._test_allreduce(lambda x: x.var(unbiased=True)) + + def test_var_dim(self): + t0 = torch.arange(9).float().reshape(3, 3) + t1 = torch.arange(6).float().reshape(2, 3) + t2 = (torch.arange(9).float().reshape(3, 3) - 9).pow(2) + t0 = torch.randn(3, 3) + t1 = torch.randn(2, 3) + t2 = torch.randn(3, 3) + t3 = torch.randn(2, 3) + + ts = [t0, t1] + nt = ntnt(ts) + res = torch.var(nt, 1) + self.assertEqual( + ntnt([torch.var(t0, 0), torch.var(t1, 0)]), res) + self.assertRaises(RuntimeError, lambda: res.sum().backward()) + + res = torch.var(nt, 2) + self.assertEqual( + ntnt([torch.var(t0, 1), torch.var(t1, 1)]), res) + self.assertRaises(RuntimeError, lambda: res.sum().backward()) + + ts = [t0, t2] + nt = ntnt(ts) + res = torch.var(nt, 0) + self.assertEqual(torch.stack(ts).var(0), res) + self.assertRaises(RuntimeError, lambda: res.sum().backward()) + + res = torch.var(nt, 1) + self.assertEqual( + ntnt([torch.var(t0, 0), torch.var(t2, 0)]), res) + self.assertRaises(RuntimeError, lambda: res.sum().backward()) + + res = torch.var(nt, 2) + self.assertEqual( + ntnt([torch.var(t0, 1), torch.var(t2, 1)]), res) + self.assertRaises(RuntimeError, lambda: res.sum().backward()) + + self.assertEqual(torch.stack(ts).var( + (0, 1), unbiased=False), torch.var(nt, (0, 1), unbiased=False)) + + nt = ntnt([t0, t1]) + self.assertRaisesRegex( + RuntimeError, "Can only reduce across nested dimensions of Tensor compliant shapes.", lambda: torch.var(nt, 0)) + + # Currently only supporting nested dim 1. + # nt = ntnt([[t0, t1], [t2, t3]]) + # self.assertRaisesRegex( + # RuntimeError, "Can only reduce across nested dimension 0.", lambda: torch.var(nt, 1)) + # self.assertRaisesRegex( + # RuntimeError, "Can only reduce across nested dimensions if given nested tensor is of nested dimension 1.", lambda: torch.var(nt, 0)) + # t0_var0 = torch.var(t0, 0) + # t1_var0 = torch.var(t1, 0) + # t2_var0 = torch.var(t2, 0) + # t3_var0 = torch.var(t3, 0) + # self.assertEqual( + # ntnt([[t0_var0, t1_var0], [t2_var0, t3_var0]]), torch.var(nt, 2)) + # t0_var1 = torch.var(t0, 1) + # t1_var1 = torch.var(t1, 1) + # t2_var1 = torch.var(t2, 1) + # t3_var1 = torch.var(t3, 1) + # self.assertEqual( + # ntnt([[t0_var1, t1_var1], [t2_var1, t3_var1]]), torch.var(nt, 3)) + + @unittest.skip("Not implemented - needed for autograd.") + def test_sum_to_size(self): + a = ntnt([torch.arange(2).reshape(1, 2), + torch.arange(2).reshape(2, 1) + 2]) + # b = ntnt([torch.randn(1), torch.randn(1)]) + # print(a) + # print(nestedtensor.nested.nested.sum_to(a._impl, a.nested_size())) + # print(nestedtensor.nested.nested.sum_to(a._impl, b.nested_size())) + # print(nestedtensor.nested.nested.sum_to(a._impl, [1, 2])) + print(a) + # print(nestedtensor.nested.nested.sum_to(a, (2,))) + # print(nestedtensor.nested.nested.sum_to(a, (2, 2))) + a = ntnt([torch.arange(2).reshape(1, 2), + torch.arange(2).reshape(1, 2) + 2]) + b = ntnt([torch.arange(2).reshape(2), + torch.arange(2).reshape(2) + 2]) + print(nestedtensor.nested.nested.sum_to_size(a, a)) + print('a') + print(a) + print(nestedtensor.nested.nested.sum_to_size(a, b)) + # self.assertRaises( + # RuntimeError, lambda: nestedtensor.nested.nested.sum_to_size(a, b)) + self.assertRaises(RuntimeError, lambda: nestedtensor.nested.nested.sum_to_size( + torch.randn(1, 2), a)) + print(nestedtensor.nested.nested.sum_to_size(a, torch.randn(1, 2))) + print(nestedtensor.nested.nested.sum_to_size(a, torch.randn(1, 2)).shape) + # b = ntnt([torch.randn(1), torch.randn(1)]) + pass + + @unittest.skip("Not implemented - needed for autograd.") + def test_native_is_expandable_to(self): + a = ntnt([torch.arange(2).reshape(1, 2), + torch.arange(2).reshape(1, 2) + 2]) + self.assertEqual(True, native_is_expandable_to(a, a)) + self.assertEqual(False, native_is_expandable_to(a, torch.randn(1, 2))) + self.assertEqual(True, native_is_expandable_to(torch.randn(1, 2), a)) + self.assertEqual(True, native_is_expandable_to(torch.randn(2), a)) + self.assertEqual(False, native_is_expandable_to(torch.randn(2, 1), a)) + b = ntnt([torch.arange(2).reshape(2), + torch.arange(2).reshape(2) + 2]) + c = ntnt([[torch.arange(2).reshape(1, 2)], + [torch.arange(2).reshape(1, 2) + 2]]) + # Both NT + self.assertEqual(True, native_is_expandable_to(b, a)) + self.assertEqual(False, native_is_expandable_to(a, b)) + self.assertEqual(True, native_is_expandable_to(a, c)) + self.assertEqual(False, native_is_expandable_to(c, a)) + # Shape NT, desired T + pass + + @unittest.skip("Not implemented - needed for autograd.") + def test_sizes_equal(self): + a = ntnt([torch.arange(2).reshape(1, 2), + torch.arange(2).reshape(1, 2) + 2]) + b = ntnt([torch.arange(2).reshape(2), + torch.arange(2).reshape(2) + 2]) + self.assertEqual(True, nestedtensor.nested.nested.sizes_equal(a, a)) + self.assertEqual(False, nestedtensor.nested.nested.sizes_equal(a, b)) + self.assertEqual(False, nestedtensor.nested.nested.sizes_equal(b, a)) + self.assertEqual( + False, nestedtensor.nested.nested.sizes_equal(torch.randn(1, 2), a)) + self.assertEqual( + False, nestedtensor.nested.nested.sizes_equal(a, torch.randn(1, 2))) + self.assertEqual(True, nestedtensor.nested.nested.sizes_equal( + torch.randn(1, 2), torch.randn(1, 2))) + self.assertEqual(False, nestedtensor.nested.nested.sizes_equal( + torch.randn(2, 1), torch.randn(1, 2))) + pass + if __name__ == "__main__": unittest.main() diff --git a/test/utils.py b/test/utils.py index d768c0fd..4ae25246 100644 --- a/test/utils.py +++ b/test/utils.py @@ -4,13 +4,8 @@ import sys import torch import nestedtensor -import unittest -import random import urllib -from utils_test_case import TestCase - - def debug_on(*exceptions): if not exceptions: exceptions = (BaseException,) @@ -189,7 +184,7 @@ def get_unary_C_functions(): "nonzero", "real", "reciprocal", - "round", + # "round", "rsqrt", "sigmoid", "sign", @@ -221,7 +216,7 @@ def get_unary_functions(): 'exp', 'expm1', 'floor', - 'fill', + # 'fill', Not a unary op # 'fmod', # Requires extra kwargs 'frac', # 'hardshrink', # TODO: Not part of aten @@ -239,7 +234,7 @@ def get_unary_functions(): 'reciprocal', # 'relu', # TODO: no relu_out in aten # 'renorm', # TODO: Requires extra kwargs - 'round', + # 'round', 'rsqrt', 'sigmoid', 'sign', @@ -260,6 +255,7 @@ def get_binary_functions(): 'pow', 'atan2', 'remainder', + 'floor_divide', ] @@ -554,3 +550,15 @@ def get_functionals(): "upsample_nearest", ] return funcs + +def cuda_benchmark_torch_function(iters, f, *args): + f(*args) + torch.cuda.synchronize() + start_event = torch.cuda.Event(enable_timing=True) + end_event = torch.cuda.Event(enable_timing=True) + start_event.record() + for _ in range(iters): + f(*args) + end_event.record() + torch.cuda.synchronize() + return (start_event.elapsed_time(end_event) * 1.0e-3) / iters diff --git a/test/utils_test_case.py b/test/utils_test_case.py index 713e253f..6342319d 100644 --- a/test/utils_test_case.py +++ b/test/utils_test_case.py @@ -20,6 +20,45 @@ class TestCaseBase(unittest.TestCase): longMessage = True precision = 1e-5 + def safeCoalesce(self, t): + tc = t.coalesce() + self.assertEqual(tc.to_dense(), t.to_dense()) + self.assertTrue(tc.is_coalesced()) + + # Our code below doesn't work when nnz is 0, because + # then it's a 0D tensor, not a 2D tensor. + if t._nnz() == 0: + self.assertEqual(t._indices(), tc._indices()) + self.assertEqual(t._values(), tc._values()) + return tc + + value_map = {} + for idx, val in zip(t._indices().t(), t._values()): + idx_tup = tuple(idx.tolist()) + if idx_tup in value_map: + value_map[idx_tup] += val + else: + value_map[idx_tup] = val.clone() if isinstance(val, torch.Tensor) else val + + new_indices = sorted(list(value_map.keys())) + new_values = [value_map[idx] for idx in new_indices] + if t._values().ndimension() < 2: + new_values = t._values().new(new_values) + else: + new_values = torch.stack(new_values) + + new_indices = t._indices().new(new_indices).t() + tg = t.new(new_indices, new_values, t.size()) + + self.assertEqual(tc._indices(), tg._indices()) + self.assertEqual(tc._values(), tg._values()) + + if t.is_coalesced(): + self.assertEqual(tc._indices(), t._indices()) + self.assertEqual(tc._values(), t._values()) + + return tg + def assertEqual(self, x, y, prec=None, message='', allow_inf=False): if isinstance(prec, str) and message == '': message = prec diff --git a/tutorials/README.md b/tutorials/README.md new file mode 100644 index 00000000..13e60bfd --- /dev/null +++ b/tutorials/README.md @@ -0,0 +1,7 @@ +# Tutorials + +All the tutorials above are best consumed through colab as provided by the links below. It allows you to follow the material and play with it at the same time! + +#### [Whirlwind tour of NestedTensor](https://colab.research.google.com/github/pytorch/nestedtensor/blob/master/tutorials/notebooks/basic.ipynb) + +This notebook illustrates some of the basics of how NestedTensor works, using padding and masking to demonstrate the value NestedTensor can provide when dealing with dynamic input shapes. It assumes you're already familiar with torch and related machine learning concepts, but nothing too involved. diff --git a/tutorials/assets/000000006040.jpg b/tutorials/assets/000000006040.jpg new file mode 100644 index 00000000..8eefe6f9 Binary files /dev/null and b/tutorials/assets/000000006040.jpg differ diff --git a/tutorials/assets/000000017714.jpg b/tutorials/assets/000000017714.jpg new file mode 100644 index 00000000..b1ebfff9 Binary files /dev/null and b/tutorials/assets/000000017714.jpg differ diff --git a/tutorials/assets/000000026926.jpg b/tutorials/assets/000000026926.jpg new file mode 100644 index 00000000..221c1281 Binary files /dev/null and b/tutorials/assets/000000026926.jpg differ diff --git a/tutorials/assets/000000028285.jpg b/tutorials/assets/000000028285.jpg new file mode 100644 index 00000000..9f4dc1e6 Binary files /dev/null and b/tutorials/assets/000000028285.jpg differ diff --git a/tutorials/notebooks/basic.ipynb b/tutorials/notebooks/basic.ipynb new file mode 100644 index 00000000..96b86da8 --- /dev/null +++ b/tutorials/notebooks/basic.ipynb @@ -0,0 +1,2262 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "name": "Whirlwind tour of NestedTensor", + "provenance": [], + "collapsed_sections": [], + "toc_visible": true + }, + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.2" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "4f85dc4ee9b249aebf5adba798180649": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "state": { + "_view_name": "HBoxView", + "_dom_classes": [], + "_model_name": "HBoxModel", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.5.0", + "box_style": "", + "layout": "IPY_MODEL_ad71b29df79b49198a4be3b6b569c4c7", + "_model_module": "@jupyter-widgets/controls", + "children": [ + "IPY_MODEL_f23446cc75a244248681bed4530f4a93", + "IPY_MODEL_91922f02bf794a2fa764a7eccc0f5481" + ] + } + }, + "ad71b29df79b49198a4be3b6b569c4c7": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "f23446cc75a244248681bed4530f4a93": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "state": { + "_view_name": "ProgressView", + "style": "IPY_MODEL_50f69fcac83f428d985180e00a83128f", + "_dom_classes": [], + "description": "100%", + "_model_name": "FloatProgressModel", + "bar_style": "success", + "max": 46827520, + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": 46827520, + "_view_count": null, + "_view_module_version": "1.5.0", + "orientation": "horizontal", + "min": 0, + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_b6c744f5b41e4614b48761c2d7a72e79" + } + }, + "91922f02bf794a2fa764a7eccc0f5481": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "state": { + "_view_name": "HTMLView", + "style": "IPY_MODEL_d93c351644a74e6db583bad2dda4f2fa", + "_dom_classes": [], + "description": "", + "_model_name": "HTMLModel", + "placeholder": "​", + "_view_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "value": " 44.7M/44.7M [00:02<00:00, 17.2MB/s]", + "_view_count": null, + "_view_module_version": "1.5.0", + "description_tooltip": null, + "_model_module": "@jupyter-widgets/controls", + "layout": "IPY_MODEL_e969b63218dd480c97f837824eda12a0" + } + }, + "50f69fcac83f428d985180e00a83128f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "ProgressStyleModel", + "description_width": "initial", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "bar_color": null, + "_model_module": "@jupyter-widgets/controls" + } + }, + "b6c744f5b41e4614b48761c2d7a72e79": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + }, + "d93c351644a74e6db583bad2dda4f2fa": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "state": { + "_view_name": "StyleView", + "_model_name": "DescriptionStyleModel", + "description_width": "", + "_view_module": "@jupyter-widgets/base", + "_model_module_version": "1.5.0", + "_view_count": null, + "_view_module_version": "1.2.0", + "_model_module": "@jupyter-widgets/controls" + } + }, + "e969b63218dd480c97f837824eda12a0": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_view_name": "LayoutView", + "grid_template_rows": null, + "right": null, + "justify_content": null, + "_view_module": "@jupyter-widgets/base", + "overflow": null, + "_model_module_version": "1.2.0", + "_view_count": null, + "flex_flow": null, + "width": null, + "min_width": null, + "border": null, + "align_items": null, + "bottom": null, + "_model_module": "@jupyter-widgets/base", + "top": null, + "grid_column": null, + "overflow_y": null, + "overflow_x": null, + "grid_auto_flow": null, + "grid_area": null, + "grid_template_columns": null, + "flex": null, + "_model_name": "LayoutModel", + "justify_items": null, + "grid_row": null, + "max_height": null, + "align_content": null, + "visibility": null, + "align_self": null, + "height": null, + "min_height": null, + "padding": null, + "grid_auto_rows": null, + "grid_gap": null, + "max_width": null, + "order": null, + "_view_module_version": "1.2.0", + "grid_template_areas": null, + "object_position": null, + "object_fit": null, + "grid_auto_columns": null, + "margin": null, + "display": null, + "left": null + } + } + } + } + }, + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "Gx_mk-nZVgDS" + }, + "source": [ + "### Welcome!\n", + "\n", + "This notebook illustrates some of the basics of how NestedTensor works, using padding and masking to demonstrate the value NestedTensor can provide when dealing with dynamic input shapes. It assumes you're already familiar with torch and related machine learning concepts, but nothing too involved.\n", + "\n", + "We're currently most interested in collecting feedback on the API design and general usability of this project as per the [prototype classification](https://pytorch.org/blog/pytorch-feature-classification-changes/#prototype) of this feature to decide whether we want to move this feature towards a Beta. We created an [issue template](https://github.com/pytorch/nestedtensor/issues/new?assignees=&labels=&template=prototype-feedback.md&title=) for feedback, but please also feel encouraged to just open a free-form issue if you like.\n", + "\n", + "### What to expect for now\n", + "\n", + "You're not likely to see wall-clock time improvements in this early version of NestedTensor, and may run into bugs or lack of operator coverage. \n", + "\n", + "But if you're interested in using NestedTensors for your project, get in touch! You can open an issue with your ideas, and ideally a code snippet that we can use to verify coverage and performance of both forward and backward ops.\n", + "\n", + "Thank you for your interest and for contributing to this project!" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "LwZM_uuaW_Cg" + }, + "source": [ + "### Setup\n", + "First we download the binaries. Currently the nestedtensor project is built against a recent nightly of PyTorch. As a new feature that is tightly coupled with the core of PyTorch it frequently requires features (in particular around extensibility), that are not available in releases." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "-sFUtFHKViwO" + }, + "source": [ + "%%capture\n", + "!pip install https://download.pytorch.org/nestedtensor/whl/nightly/cpu/py3.7/nestedtensor-0.1.1_cpu-cp37-cp37m-linux_x86_64.whl -f https://download.pytorch.org/whl/nightly/cpu/torch_nightly.html" + ], + "execution_count": 1, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "BGZ6Vc9fXbKo" + }, + "source": [ + "Next we import the necessary packages. nestedtensor is a separate package, but upon import registers itself with torch via its [dispatch registration mechanism](https://pytorch.org/tutorials/advanced/dispatcher.html), which ensures seamless compatibility between NestedTensors and torch Tensors. Let's also download some images for our presentation here." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "02IGFZq6VgDT" + }, + "source": [ + "%%capture\n", + "import torch\n", + "import torchvision\n", + "import nestedtensor\n", + "import matplotlib.pyplot as plt\n", + "from PIL import Image\n", + "!wget \"https://raw.githubusercontent.com/pytorch/nestedtensor/master/tutorials/assets/000000006040.jpg\"\n", + "!wget \"https://raw.githubusercontent.com/pytorch/nestedtensor/master/tutorials/assets/000000017714.jpg\"\n", + "!wget \"https://raw.githubusercontent.com/pytorch/nestedtensor/master/tutorials/assets/000000026926.jpg\"\n", + "!wget \"https://raw.githubusercontent.com/pytorch/nestedtensor/master/tutorials/assets/000000028285.jpg\"\n", + "EXAMPLE_IMAGE_NAMES = [\"000000006040.jpg\", \"000000017714.jpg\", \"000000026926.jpg\", \"000000028285.jpg\"]\n", + "EXAMPLE_IMAGE_TENSORS = [torchvision.transforms.functional.to_tensor(Image.open(img).convert('RGB')) for img in EXAMPLE_IMAGE_NAMES]" + ], + "execution_count": 2, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "BFXBqrCMW8O2" + }, + "source": [ + "For this tutorial we handselected four beautiful images from the 2017 Validation dataset of the [CODO dataset](https://cocodataset.org/#download)." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "kJIro8nTW4q4", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 567 + }, + "outputId": "691b90dc-e65e-4810-ccf5-29bd4dc6421d" + }, + "source": [ + "def display_image_tensors(tensors):\n", + " fig = plt.figure(figsize=(10, 10))\n", + " for i, img in enumerate(tensors):\n", + " fig.add_subplot(2, 2, i + 1)\n", + " plt.imshow(img.permute(1, 2, 0).numpy())\n", + " plt.show()\n", + "display_image_tensors(EXAMPLE_IMAGE_TENSORS)" + ], + "execution_count": 3, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "9svJiUQ-VgDW" + }, + "source": [ + "### Concurrently applying conv2d to images of different sizes\n", + "\n", + "Now let's say, for some reason, we want to apply a 2d convolution to each of these images, but they are all of varying sizes. Of course torch's conv2d functional does not accept a list of Tensors, but instead a regular torch tensor of shape N x C x H x W. Let's apply conv2d to the first image to remind ourselves of how this works. " + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "oHQSy3jJY9oH", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 288 + }, + "outputId": "f8dde205-8bca-4aa9-eca6-d1e53fdea7a3" + }, + "source": [ + "torch.manual_seed(1010)\n", + "with torch.inference_mode():\n", + " weight = torch.randn(5, 5).repeat(3, 3, 1, 1)\n", + " result = torch.conv2d(EXAMPLE_IMAGE_TENSORS[0].unsqueeze(0), weight).squeeze(0).permute(1, 2, 0)\n", + "plt.imshow(result.numpy())" + ], + "execution_count": 4, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).\n" + ], + "name": "stderr" + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 4 + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Y6P6ljR_idag" + }, + "source": [ + "### Padding by hand\n", + "\n", + "So, we want to apply conv2d to all images at once. This commonly is assumed to happen for performance reasons where most notably GPUs benefit from being allowed to process a lot of data at once. Many PyTorch users know this as \"batching\" and most do this by hand. Let's step through what this might look like. \n", + "\n", + "A common approach is to create a single Tensor that contains the data of multiple images by padding the images such that they're all of the same size. These padded images are then merged into a single Tensor and fed into conv2d. \n", + "\n", + "Since conv2d is applied locally one image patch at a time, the result can then be divided up into the results per image by carefully calculating the region of the output that corresponds to the input.\n", + "\n", + "As you can see in the code that follows, even this relatively simple operation already begins to make the code a bit more obscure and delicate than we'd like.\n" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "V5Gcf4A2VgDX" + }, + "source": [ + "max_h = max(t.size(1) for t in EXAMPLE_IMAGE_TENSORS)\n", + "max_w = max(t.size(2) for t in EXAMPLE_IMAGE_TENSORS) \n", + "data_tensor = torch.zeros(len(EXAMPLE_IMAGE_TENSORS), 3, max_h, max_w)\n", + "for i, t in enumerate(EXAMPLE_IMAGE_TENSORS):\n", + " data_tensor[i, :, :t.size(1), :t.size(2)].copy_(t)" + ], + "execution_count": 5, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "1DIyqEDUqnjW" + }, + "source": [ + "Let's look at what these padded images like." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "-2hTRbGDquc2", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 595 + }, + "outputId": "326aa13d-63ac-4217-8751-aaaf5858a2e6" + }, + "source": [ + "display_image_tensors(data_tensor.unbind())" + ], + "execution_count": 6, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAk8AAAJCCAYAAADZWSOwAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOy9ya9lWXbe91t7n+62r4s+MrKplsUskkXSliUDHBiGAQEaeGBDlgWPNfLQA/8THhsQYU888cwjCzZgQ4BoQhIICqSKzKrKqsqMzIw+Xnvf7c45u/Fg7X3ujcysktJiQlXlt6oy4sW7555m77XX/ta3miMxRm7kRm7kRm7kRm7kRm7k307Mv+8buJEbuZEbuZEbuZEb+XWSG/B0IzdyIzdyIzdyIzfyFeQGPN3IjdzIjdzIjdzIjXwFuQFPN3IjN3IjN3IjN3IjX0FuwNON3MiN3MiN3MiN3MhXkBvwdCM3ciM3ciM3ciM38hXkawFPIvJ3ReQnIvIzEfnvv45r3MiN3MiNfF1yY8Nu5EZu5JeJ/E33eRIRC3wI/GfAE+DPgP86xvjB3+iFbuRGbuRGvga5sWE3ciM38m+Sr4N5+lvAz2KMH8UYO+B/Bf7zr+E6N3IjN3IjX4fc2LAbuZEb+aVSfA3nfAh8tvfvJ8B/9PmDROQfAf8IoKyaPzy6+1A/iIDs/Z1/tye/nCv7d2DSIsQvXPOrne/Ljo7pWSS+eZy8ccy/CwMY0/kEHxz4iCmKN8cx6ueRgHeOGCNGDMbqcXr53T3EmO4vfXd/Wr78ieVLfvfFLwxHp5P5bknfrijrCbYaI3T4boH3gRgNYCiLQIyRrg1EIkVhIOiAxqj/dj4QAsSgYxHD7sLGCDFC1RRYAyFGthtP8BEREKP3HnzAFobg9bsh6ucgxKA/GyvEoI9rrcH7gDX6dx63mAdsb/yGORjGWn8uK4tzgRAixEhVFfS912t+iU7ke91/vuE5rQz3bvJx+X6Gwf+85r35OxEoCkuMETFCMyqIAZzziKTzCxCFEAIIFJWhMIa+88QItjAYI/Stp+0cIYTPX/BXXf6NNmzffjWj0R++8+47ajzkiytB8sSja3DQqc9dVEQ/z9/THwKu7ynKEjGGYZ72v5QXawRJ10HkC7M8fIU3l6Wg9iemvyV99837i3t6K8P6fUOf9u5///nj3gLIz9+1LcZYikK3oDd0fTA8+cfPG2V9Zr18JIQw/IcI1hjEGIzIMA6RqP/eu9c3lsWblwWg7zr6vmc0Gut5vmxA37CbQiQSQ8SHgPOevu/x3uOc1/tLUhSWqqqoyhJrbZq33RgTY5oT/d0wPjFijMEYixhJc/HF9fzGcH7+wb7wrG9+5rqWvvfUTYOxsrP/X3KeXy5f0PBfcIx8yc/gvSOGQFFW+mma677v2bYdvXO7fStdylpDXVWU1f646ne99wQfgIiIwSQ90SUUiSHgQ8A7T+8c3jtCiDx78tlpjPH25+/86wBP/1YSY/zHwD8GuPv2t+I//O/+h/T8u4GIUZU9EkHCnrJnSxEh6WNeC3E4S1rGw+axP5E7hRR5c5OK+eigV97/fDh3VGMYY9RbyAs0RgVfcXfFGGVYYBKzKdVFjQ+7NZy+GyNIDLsdNsob19u/z/2dOQTH6vQV5WhMPTvQY9MhASGK0F2fs7m8wNqK8eFtbFXpgk5KSZS98SLdTLpfvIKZ+Pm5iDtgFsMAPkO253tGTkiABBAxFIXw9If/B/3FXzE9mXHn3T/kev0Jl69/wvVlxYP3/ogH8y1c/yV9ETh91RE6g7GW68uWJy+Xeh8G+j4QfeDk1pSL8w1VbbAibLcd62XPaNbwH/yHDygsvHzd8vzpFYfHJXUhXC+F1arl9oMa7wxPHl/iuqhgJMB4ZFheO0L0FKWCm/G0JiSD2IwKysLw8P4BL15ec3a6pu081ppkcCLGWHrnEBGsEUQMYsD7yKgydG1PURa8894R602gLksef/QKH/ww49bahIYCUpX4vh+MQz5fMBC95/DWAd4F1usNxJAAnxBiSCDe6NxkgCh6fmstTVlQVgZTwYN3DhUktoa+79huW05ODnn14gofIlLA/Ljh9kkDDj79ZAEi3Ht4wNmLDT/+4MmXrv9fd9m3X9/5re/G//GP/5golqooMZa0vj1RoDIWsQXG6gZclBU+g3yEwgjWWDBWjTlqA9rVmvMXT7n91n1MPWVUl1S2wIdIHzzeexBDaRKgMQabHEApSp3XIPhk56xBHSZ0o5D0vRiEEJ2eD6GwBSEEYgiD1eydI3hPVVXYBMyNCCF6NMopQMDYghDVKGcAE0JapMm+xRgorOX1i88IwXL3/r3hOB8VfBgBjOp0dpQyNMt6G0GBSdfRdh3ee5qmoqprqqKgKAp0rwyYBDSCgAlqf41AQNdGjDo2YtTxePnsGc+ePuW773+fsqywVp8l7u0JMdnzQEwPJnR9T9t1rNdrLpdLFos1i8Ulz1684OLymuj1/Ecnh3zjnUc8fHCf48MD6moHEHST1/n1ISTw5QYAV5YVdTOiLguMMQoWSSZZDD56HfMQd8DdGIi8MXcKLrOZT8A/OUXLxSk/++BnvP2d73F0PE2A2uzASDpHnofd/vumSN6/87/3QWKMhLj7tph0DYT16orF1SX3Hrw94CkfA9vNhhcvX/LTjz7ms+evcW3Q5/UOYwvqqua9d97m7Xcecuv4mKouyA/ZbjcslivW1ytCiJR1zWgyZjIeU5cFIXjWmw2b9YarywWXiytWV9f8N//gv/zky2zA1wGengKP9v79VvrdL5Wdc6EKEoZNegeCVAwZ4sgenaO6q4tUjY/+3qdDYvp9QkXpVJLYhR0dIHmBpsUakzeZgcTAHqW/g0AgYhJYkCh40e8JERMDQsQjICYxAek86fp5AEJCguqdJSgYo15EP9ALRwNGldIgbFbXdMtrpsd3kcIksJnVVvD9luXFa2LnGM1OqGYHgBoqvbQooxGVfVEorr8P+Xp5/CSB1zQ+unKiGsw0VAPPkDZmCZGYwebgUQaQCrfZsGlbbk8sLz79Zyyueg7v/DbHv/U+7eav+NEHP+GwqYhEytoSS/irf/0a74R24xiNKr0HD8YYnn12zp17R7jWs1p1hAjv/+CY1cqxWl5zdQ0Ujkfvjnn+comfjHAxgolgoN32lGVBXVmcdxzdayjEElmyXAWc80Bks9pydDSm3fZ455mMC0alMDuZUpQFz55eE4Ln8GjEdF7z4uly0CfnImI80SfjEhxiwJaGy0XH4mKF64ICpxj3xjpSVxWu73VmExOhxtwTfGLIDFxdLHVDsGCloAs9xpoBjIfg3/BaDWmdxEjbe1rnOKxHEAznFx2TcYU1BeB5+eoCH4SyFNq2ZzKuaEYl/SZgjMU5z3bjUaz3eXP6ayFfyYYJonYF6DuPLQtiiNSlAp1glYkTazHW4qPBB0dZFhCVhTDWqCMYPVGEzWLJ1evn3H3vEaaY4IPHiCEKGIlYkWQDVO+N7IFhk5wcCj0+qpNmEAh+WPcmOafGCMQCawuIQQHHsIZDUsFIUSgwKm0JMSrrWlQDVxaCKKBO9suKYK0BY/AJsAUDRIOPkbsP3ubi9CVPP/uMR4/eRozFeJecyAA+EoMMzL2CNbVtxhiC9xgRyqrEFAUxxgQorDookABSclYkIgG1VTEqoABlcSUSiEgUXnz2jIvzM97/3d9FjE0Mhp6HNNcxxuQghgHQOecIQUGotQWTZoTFEHxHUyvo9N4TInRdy6bd0nUdwTugpChKHcuyxGenVtEmIc2tSUBb7G7Odw6pOrDE5KincbJG6F1I7JHJSjsAp7zrhRgS8I1M5if8zh9O+OjDn7Bd3+Xew3uqwwMU2jGnu+1U5yeSAVr233fszvCNGAhvPBeYdNx2vWC1WHDvwVsaNUB3fBMFYyxVWVFXDaUtCOKIRtJEq052bYfv1LEVsWrYvFA3Iw5FKES4XqzoNluIQlmUlIXFmoLJeExTljSjEfP5hNXh+hcaia8DPP0Z8G0ReQ81OP8A+Ie/7AsxBJZXC0TAWktRVYi1e0aAZPRBjCrGjtHZUX6CIaiGkOiQwRPLzEccqEdJG/gelRizAu4AjQwKkFF2JCRFyAorQ4xLr6NGKXltCQSZBJqC0eMlBgTBG1UkiREbRe3ncD8m3UbybDI6Qc/ho2dxeUppR8zu3Ed2rDC6rAOrxRlucU3ZTBjfe4BYOxjDmFyFDLYyJRxJBmYAi5lRisNi27sMkJLnYoJrGUhKNny6qHfjH0EsiOHWo2/wydlPNFTElAfv/R6Tk9+mXf+QePmM29OCdee4fWdEUxuevlRgEaMwmVZUteXqcsPhwYTv/c6cV6drzl6vCWKprMXWSm9Pxg0X54HZ1PL63FEJSDS0m0BZBQ6Oaw7vlHRbnbnNasNs1jCbVxwejJjNDT/7yQLfBfpOw57nZ2vmhyNW11vK2vGjn5+zuNoiYhiPG7bblutlz+VFiy0kOYCGurH4LuKCwxjDbNbgXGC9bjl/da2MVvLorDWEEAc17XuXDI4aKjOwqDoXxmZDpfOnNtjvDCsx7RmyWydZNxU/UtaWg4MJm3XH88+WLJcb7t0/ZDwpsGJwHrq+Y3owIRihKAIhWrrOYQuD956yqpFxHMKMv2bylW0YYjFEjDX0bUdplUkqKktEiMYSMOrZx4AxBryyfcYWyYEJSBQuL87YXF5w/5vvYouGGMHFSNs7rDeJuYSiKLAiGDF0CVBbaxWkSXIyY0SMhqyc01AZSGIeDIGIC8nZCsq+WKNY0Im6ZwgEURtmxeCdH9TH9R22sBQ2h990OEIUTIQQFEhllkaS3UQEBxzeuovIKY8//hmP3nmXKAWKIs3AfGWny++xViT7VVoLWN3IJGJ1MhQYiWBEGZgYA5LOHaMHDM75NF6GrKafPX7M5fkZv/17v4cxBRCTI2uJe0ApM06SnO8UdUfQca1Li0jAuW4IoYcYlRESQ996tuuOdtvSdY6qjthkfzMrlPchMaJpDKj9kBgJyYs3KeqRgYjaXUMU3V/UdiRmJ4+lyBC2GoBZIiNijPiQQFo14tvf/x0+++nP+PjDNW9/823Kskrh5TzZO0AU07wmXDawUbt9IzNPgDHYGJEQ8MO1oduuuTq/4M6Dh4ix+a4zpYExQlkWTEY1dVWw3XrdP9PGGXxgs23pug7nHN45XQsRxBrKZsQYcN6zWm1ou5b1ak1VFNimpixKCltSVYFRXTOeTn7hkv8bB08xRici/y3wfwIW+J9jjH/9y75jjGV6eAghELzH9T39dksIQRdzYbFFgS3KxDbtXW8Y2OSFSRy8wEwIenaIeQj55e/to+GsCMLAkOwTTSYtEtB8oRThJvn/gBqZuKdUgklhszBcPVuemICWboEKkvTfQYFTAiq68HcMGga67TXtYsXk8Ba2tMp0GUegAAm0mxXr89eYaJmc3KcYN7rZpg005Gc0u/yGaNI10uLR+dR7V4/lTfZI73Nv/PaGMI9ZBpCidKKOHQZjBeM7fv6Xf8J2ueX507u88/v/BVLU9NeXXH7yQ04mJacXG7D3OGiWXHWRq/PIeNxw//6Ui/OW0/MlvQucna+4WFS8fLkhenDecff+fdbbCy6uYDKruXWnYbNecPfemHYbcZ3HR0dz2xLE8sGfLQk4xlNls2aziu06sq0iZ683BK/hzfG4oiwtm9Zzfb3FiGE8q3n5ZIkParc3m5YQPXio64qu05BdVVqqquT2uzM2657gHb6DqoH1uhvyNpQmF4pSGI9qttuOrvX4mD3IFGYgsbRD/gNE78iMbRCwVhmpgGgYRET520SYiOzmMPhA3wXOzpYEH7EFVFXByxeX1JOCcVNDEEQstrIcjwpcD9u1x7m8jITVes28qd7Qh18X+f9iwyRGyrrCFAWm0jy4siiIYnAx4r3DYDV6FaPqaGKPxEes7vVcnp7Sb695+N67UGgoJ0Q19s55mqrGlAoexBiCCC54KAwF6pkLabNILFVIobCiKHQdZ390cEzVUsYYlIUlOa0GJOzSE9KKxwyks9rcECJBlK4SQVn7CD4EBeRiCJIZqXz9zKgIB8e3aEYNjz/6mIePHmHLEkQoihKElKMZMIUlBgVVGKvnSqy5hGR30zqwZlcLZYxJDkcAiUQxKXypwC6tKD75+WMuL8743T/4A4wtkrORHFhCcoAVnITg1XFBcyCDd4QEcMqy0DXp0vjESPA+EcjK9Dnfs1xds16t2c5b6lFNmQkDdk78AHyMgRCQGHQXiShbFlMILj1jNsEaScj7jZISeX5M0tccGbBIAnY58qEsWlEUIJa3v/0dzl894aMPfsx73/0O9SjtJZLZJ0lgNrFdyWnOvvw+PzGsl/RdMQaT7tN1W85fveTuW28lJ3+312fALWIoy4qmqanKEkyrwCnvTxLZbDesNhu63tH4QFFYRTpJz21ZMplNCQibTYtzPZvNBmMNtdE1Z8uCSozq4i+QryXnKcb4T4B/8hW+AehAFiKYoqQiJLYp4FyP6x3tdquTJGDLkrIssbbgi3NjBnJR2ae4lwi++32GPGoE9sJ52Y3fQ73ZIKjy5dh7/m4cridxl1gYEvgxgE8UVr6zoA+8u2VRoCKRnae2Fz4TouKp6FlfnlFIyez2PR2P4VkLQuhZX5zRL9fUswOa+aFulFE9mx2gyTAu7hijxD6J7IHMRKcqfQyYmDysDD7zvWcfYze8eRQZnjf9IQai59lP/m+2ywuuFlvikzMOH37K/OBtqsktTt7+20xMy8Hsp6y2Gy6uHY8fX3K+9Ny6W1I2kW/+1pjlv2rpXcS7wI/+cgESuX1vwtlmw7YwzG8VLK47YlxxfrllueiZHQuHhzV3bM3r5y3OFVy93tL2Lb6PbBYd8+OG2VFDPSt5/njBtoX5fML11ZrNtme5apUV8gExwrPHixRS2AHOk1tTRmUJYvjs6TmAgqC+ZzoZcXQy4uXLBYvLDcbaFBIM5FzwshDefvsWF2dLfAKeeZSDZ2APfAyUhU0GfG9TTHPgQ9ScGu+HUF9I60skIsaq4Q8K0vvepWUQ8V7wfWR+0nB0MOXyYklRGSZNrUxpVFQfY8/l+Ybx2LBeOYRIMyoGEP7rJl/Fhul61nVko0GsVeAsaZ1E1QnvlcWIwWNEHUINa2sI4+L1K0LYcu/t97BFqaDhcx6JmJjiIemqUXXAirDLY0mhjhT2tel3IQRMggo2bbbZ6Rzy4ATVA7ItkuF4QqB3PbEolDVL+eshRNbeYYylTiwacaerUTIjkkYrmY2Y2asYqEZT3n7vHZ599il37j2kqht99uxAVwUYg/NRneyo+VkkrklztDxRCkqb2a7dHBmxxKjjbmxKtUhhIomBj3/6IevVMgGnVDCR7FrMDm3O94kh2WVdewkHJhuXEtaDU+bHR3rX0/X6b7GJffSR1XrDYrnkcHPAeDTClRUmBA3hshv7TArExBTprGXCYBfaGwAJuuuo06v3rKA6f2OYjEF/Ey2uERBTYEy6TowEMRzffcRkesDHH/yIe9/4BgdHB0m/zS71JUlm10ImC9L42T1gKKQodRrn0LW8ev4Zdx++g0iRgGjSQ2EAR8YoqK7LhrqpMFZtFEYwCYy3Xc/1asNm3TJuRhRFxIpFJOK8x0ZDUzaYWcQaoWsdzjm22y0iQlmWatchMbhfLv/eEsb3JbMuGZxIpm1T6KEoqyHjXpLh973DtT1tv9GVbwSTwNQOZUckJR/6nHwuYVCi5CvtwEfc2/ITOsr7/QAHooInnxiCnM+4y10asDgW9dWCieqt75XyGbIDpstDUvxanb7kkSYCighBAq7b0C6WNAdHmKJJQDLdr4H1csH24hRbjpjfe0s9h5gNexyAo+CRmClRSf9XdmIIVMf4RnpY9oCGhyODx+xR7jylgW6WBCzjHtMh6VyuY3n6gnFTIO2E+fE9xgf3KQ9PwJ0RLv6ErYnYvqcoPU/PHY/erjk69Zy1jsXFhsODKQ/em/L62Yr10mErixHBu56To4rKXLDtIxevNizOLFWti1IWluefrCmrgtW1oxoVjEeWwtZcX3W8+4053gnbdc/zZ0vOT1dUhRClYz6f0p5dqbH0+lC986q3KYQbY6CuS5qm5PCg4dNPzhPppjR/UVmuFyuev7hk1FRst46mEcZNzbbtCcEBkbIs6FtHiOope3zee1IIObEOIloNt5stMvY2AsSAHibqMRu7N807D1WsrrkQgm4gIWjlEJqvslq2VE0FEhnNGx4+OOHsakGgox5VRNaMJzWzrefwqGGx2mCL3/yXGAhCWTZIqSEgi4CH3gdKY7DEYQPwIWJtSVEUFMYkVjly9uoldQXzk7eJRjSUZgQfcvGFUNdq23QdCRZJSc4KmrR4ZefY+D2vPYRA3nZDVKAcQsCWpfoyidGIISSGW9ew954+aN6mFaM5TDEQUj6SpLzNgOB8gOBzKlGywypGzHD9fadKouZthgimqHnrnW/w8vmnHB7cop5MhgNDjNiYTL01mksUAt47bEyMTXImsmO7e/rkKIomPEeJie1Q5/yjH/+Y1XrF93/w+wk4kdZPBkso6xHzv4UhHUMSw0akKKyuQRF8kHR/nnbT0fURpMAYBQWFUcO+bVtW6w3jyUQrxPYqBTN4k+yEK5odKoqHvSNdU59xF8YjkpKw4Q0Ano7Nx+RcJWEH2DJTlyMsINTTQ77zu9/j8Ycf0q7vcefB7ZQH9TmnWWAvQwyR/SQ60hjqN4wRXNfx4umn3H3w9lBMEQBiwBrBYpNDqfdTWENZFVRFiRVLNMqY5nvo+p7rq2sWBwvG4zoxaGoLjQgx6WzTTLC2YLPZao5p7+hMN1QzGpF9RfqC/EqAJ0HRv3rsKSU8BvZvW7KxT8piy4KiLAalCd4roNq29D4QCEgpFKbBlIq8EYNJ4bBhGUuuMks5UOligZT9H5MCoyE5yUxPMhCad5KdQWFndvKD6aKzabElrU+hxEBOr1PmZ49dEMDquYOH1dUFBQXTkzvqVeFADBKhdz3XZ6+JrWN6fJtyMtVJ9+BNzkHSsZWohjdXw4moD0YMO88lL8Tk4Q7PT6Lgc2gJpZP3wdKuHDcvnbC3qWcPsKPdnhLbJV3Xsw2O5Wc/xcyP+dYf/CdM+s+opluenR1x62DGQfWEs6Xn4ckB176lWXk666hqQ7vecPetMeulY9ValucL7r01Y9xUXC42GCK3bjecn284uDXl8uWG4CSFsgLN2NA0hlFp6LqKyajG2ILlquPsdAVGaOqStx5NuFx4NquNhg1iBPEUhcV7LXENIVAWJd47utaxWTuCX7Nc9cmL1xACCIvFBhGh7zvu3J9Sl4bFZYtzBu9VB7Zbx4sXC1zviRIoq0JDacbQdR0ZSRV2v1VCHAy/MgCB7G/mipkYwpBTsdsgAjncDRCT56V22WCkBAxXFyvqccXm2QWLizUndybE6IiznqpWZqRuBGMi29XmDY/0N1YEirLAmGKXJKs9MRQYFBoiMsYqCwRkBwoCZy9eUlaWZn5HQZML2NIkL7pLFWAQEn1r0n8kwG5F8KmKUrxJDHW2n5ISxGNypHSOO+9ol9ccHJ3sPLQYUqgKBeSJAtUNTEPtMWroxItXPQ2qb4URWh9oAWuhyOGYHMIJypTt0gESoxN2UYGQ2K/7b73H6ctn9M5xeHycNnPV49Lq2OmNCdYoSxBCyiNLjqxNIZ43Ja+BwQPhpz/6gG275f3f/wFGbBom/TwM7UByuHEHVgKkCmXdkG1Z4nxIYCoOuUZ937PZbnZ5YkTqsmQ8HlE1NUVV0rqezTrl3RgFeMba4Xhgr+AmsYDoNUICzITwBQc2H78LryUWa+/nGDOJMNADmhqQgFXOFybZElM2fOv993ny+Od89OE173zrPaxNCfnpHDlfMzvVCjL3mK49QOKd4+XTT7n94BFVM0okhIYQcx5UIBATKBRR9s6WBWVZUCb7S9Sq0Sj63evra84vrmiahsIUjMY1VVnsxgSwexWwrenoe0f0nr53SKU6H+Mvtl+/EuAJGBQ9qUpioDL9ujM4mR1S9Uml10m5i7qiqGo9n4HgPM57FucXBNczGs0oKkvft1TTQ8oiMVQR8BAz1Ttgo6RWSXF0M1F2wWZQKgo8opBoyrQ4E06KOZ8kARit6mAAMpJyDCRqO4GIeqLZ2+i2W7rFFdP5IVKVGiYBEDVcm8UFq6tLxuM5za0HiEkhv3SBPKox35cIkQJDCs0MFYBmt3r20fYe67YDkrKPA99gm5Tm3AHfYV5jJEaHX17QXr7i6Yf/gq6LzKaWP/ydOR88bhm7J3D5FzTzp6yjMCquqIoNIQbWq55Pn/c8/vSa+bTgvfdm/PDHZ/RbuF6uGNcV1kPTNDz7dM12e8VoVHD7wRH12PP9OxP6wrG+ignAWLq+49E3j/nmt0ZsVj3PHvf4PjI+qHn1esm33ztmsXYKoMaWmXI/TCcNZ6fX2Epo1049xfS8PvjMgOODZ72NHBzOWS3XbLet5qt1PTHCaFTRjAuODkd89viS0dhy69aU5y809y9KoO99CpMK3qWKJa/X0M00arhvDyhl4KQbSmah0uYZ4sAWGJvWj9jk0Sq1HrOnQgLdMXJ5cU1hLd47qqZkPCoZjSybZU890jwP7yOT6YTVsiUgHN6ZYT88/ypm4NdWxApiIj6vB+8pjEGsScUQu1wcm/Mlg+fs+UtGE8v04A5SGApTYI2yS71zamfSdu29wwehsGUK4wICnfMJLCjDqyX5UfOVMuuCJPuWWH0RmulscMCUcdRzBiLRa7VnYdXTt5J4dJ+qzMRQFKRNMTl8RnCdVpOFIDomJP9Wcq6kAR8GQKc2RIFgDA5MQds7jm8/YHn1msvz1xyf3EmVnsmuRnXCcsGP5lP6tCDMEGqJ2XGI2cdOdgxNaP/Rv/4h1ka+/4PfZ8ifihpZUDPoExhRe5rtXEDHSgFStoeyS9JH2VrX92y3WzbbLS70CAZblMznM44PDplMRlRVCUQ2mw2FtangQ5CqorApjJrYp91zKWNjjAyM4s5VzaOa0y9yv7odQ+RjHM5lJKaKzFRtlzUmg0ziAIxy6CxEeOu972vYBEYAACAASURBVHL24ikfffBjHn77m0ybRkPKe2BjCNMmiWnD0N8bnO948clHHN2+S1k1Q4sLI9pWQ6c7ERl7bRKsCGVRUFWlOhVpfCTtXYHIarPh1etTbGWxhQU7T61YEttrTcIOhqqssQityaxjwIo6AQON+iXyKwKekjciYBJq9QnB2DT2njwZukBysrdJNCbI3jxlj8BQlYbJeEowwqip+fTxXxN6R/v4A5rRIc1oysnde4jV8tAcKlQ4sUuAlLADP5GM8NmxWFEnVUImLJO/vwf8Yg7JRVJieF4QyQBFn8CYslybywtMMExu3SGKUQSeFLrfblmen2ExHN19C1M1ic+Kg9IxjNfO28rIm91t6X3KcMcDKMp9p7LBGUBS9kb2z5M/z5MQM7MX8a7FrRYYDNX0kNHhPY7e/m3c+iU/+X/+J5682uJcy9Pnz5hON6xPYVxbfN9x+tqxWjtuz2ZI0XP7ZMrp2TVPXy45OqyJRitlylHJiydLDo8L+q7g2ZNA09RcXqyZTip+9tNrAsL1oiXSUZbgA1TB0K49p586mrpiOql49eSCk4OGk5MJ9WFL13as1j2mtBQR7j+8iy0NvW95vQlUdcFmvdVKxeSxdZ2jP98wmY84OLJEX3HrpKbvI4urDowasOvLVvW0MkzHNe3WUZaaS+Gz8Q9ey729V6MpmrCt4T3Z6atRZiDr5q4HVJqSGLUlQmGTvmXwno2rVVBlNJwRYyCGXBYOne+Zz6c0TcWdexPW25a33zkmxI7NoqeqSzbrLaO6Yn2lIbu2dV/dHPyaSsz2SCCKhsRMYVNJubIHBv3c957L5085PDmgGs+pyoo4zK2GyyprsNWYPji8N4SgoKTtXGovIHSxo7C52Z8CYAJDpXL+X0ihHoNATGFmW9LHkJu7JGYdXIh45yhN5risWp3AwACYDNbS8wJUCL1x2iAy+NRTTMO/1mrOjU/5SsH51GohV6nEVC2s66fvO8bzY/z6itOXzzm5ey85PWmsMxJIm7ExBuc9xkcF/8n5BobNOm/mPkT++i/+ElsYvv3+77yZ15LMZtxjcrINjHkzj4lxC2HIEcPs2JUYI9F5tm1Lu23p216PQShtyXw65eT4iPl8ghHDerOm7VsWyyVa7aYAtCpLytIOoUiR7LT65ETr9UwCxjmNRIMOWqqUNpnEBO22yGync7uDgW3KZxXZ25uGoUk2Sffno3sPaCYNn/3kJ9x97xscHczZ2ZJ92DTM2vBXiI7XTx5zePse5WjMfr+okNiFEOOQtyVGIyQiqtvWWiajEU1Vsl71iQFV0B+iR0Lg6mqBLQvqoqYoLIW11E1NmcbJm/x0ltI0YBy960EUxJrMav0C+RUBT4mOBPaZHpLixmEhZM1OACYxK0FylH9XEps3fwSaSQNYuvaMP/nf/he6dYfFIoWhGU8omhG37r7F3/m7/5Ui0qAbl89QYp+N2d+U9oB2zhOIydPPpfv6lUx7Jhpf9FibvqM94ATEEBG6fkt7ecnk4AiTmqdJUloXPMuLC8J6y+TwkGY6JeIh9oQoO89hV+sweF1x+FNrBN/wUNJA54UzMHLkx98P8cTkmfBmflPGVRhEAr5d4zZLjKmpZreINs1yDDx7/C95/Bd/An3Hqxct83nN9eWK89c1998ZY3zPw6PAJ2cFr16v8dFyrxE2reNq2XK56Di+U3F4VGOKwGcfb9kst4znc9brjughhp7Vouf0+RVNXeJdoKoKwGLrwHxccP92xePHa9qV5+p6yXRecng442Qy4uMXV3SbnjsPTmi3l1ycXrJdBSLPmc8rLp70abHnxMyYaGRPdGqMfO84PKpxvTJUr19dUJSW6bhhs3HMZiXv3D+mmVgef3pJVVc8vDPik6evIKqxMMljKguLKSzTWQ0R1tdrNm1MnXh1rkJK+tb8jl24J28wstcxGDQ8YER2SeJoCJykszn51xiDtQVd52lMTzMrKWtYbdaEVri8XEEUphNLXVs2G4eN5o2qp99UyUyfoA5UxGATGMJYBdUJeEAkdh2Xr55xdOeYenyoeWmJ9chMQ7HXHbkuCoIx9CESfNBu+l43kaKwA9uk95IbJqY/YxjYCO0JpDY0hIBVun2XA5POL6K9p9IJ8f7NnmC5l1QO2Q/l8AnEGSKVFEMoTZA31ogxFie5WauGWWwCPKSmsBHoeoetZlSy5tmnj7n38BFlqsALIfWfMsoT6VN7DZ2ZnJycxkB2Vi96x1/9qz+nqmu+/TvfT2kE+d52HuVgz0SG/J+Y2I9cPUgCTgpK9WeXFptzjm3X0blOk+yd19zXGGmqitl0zHQ6SetKkGWk6x3L5VL3nQjT8Rhraoy1Q95qdoryNqc5RzvbrqOgFZE5RYDkMMdBR1IYHw2V5nwnk9jqN4A4aetC+3jtPDH9q5md8O33Jzx5/Al+23J45xj7uXCp7F0XIAbP62efMj+8TTUaKbDPub0p3ymmtxfEABS5Cas+pTGGpqoZj0YczKYsVx2bVlMjgolIn2Y7eNbrFVcXl4zqAiOGgxAxTTNUmefn01QgCwRcH9hsWhAo5BdDpF8N8JS8l6wGcVgMiSmMpGq3FLuV3JKAQcHVM0hMUaokAtJ4G4xEXBf53ff/DpvrS64uLyBsU0howYsPf0z7R9eMj+ZEDGUCavvx2aCQmdwmPtOMQ6dxIKaeXCGBQCMpJEdCVLmJHOqd5kRKDdhF1lfnEApmt+9rmTGRgAHxdMslq/ML6mbE7MGDlOCbxiXdQ/ZARMux0MT7iEhICY8mNbF8MzE0G5g8ZtkL2OWs7ADg3rSRAW3ctRTHb5f47QZbj6jnd4eFkZk8kcD27CmL05eMRzVVY7h7u+KtO0cc3ZvjbU/rPG1XsF1HRs2Itt2y3FS0XUfbOebTmutzh8SKy8sVhSkwtuTsVct25ZkdTNms15rEGR3bbQ8iNKOS7bYn9Ia46LFlRbe5ph4JjS9xfWCx3nJ+tuTqfEvvPMurLba09K3HVtps79nTBdttl8IYAe8Do1GtIEQEMRYRS1EapnXFduR5+eoaUxrmhzO6bcu7Dw6JEnASePJ8zdnZEuc9hbEpQTzQjEqCh3rccDDX1w60bUtVCqYYEZc9qyvNpyjrCum1GWZdFgoihxwCfWWEiXao6BRTaCPOBPh3rGtaixkUJGPa9z3OOTYLZcyqUn83ahqIMD0aY8rAtg/cf+uIxdmGstolDf9GSyQ1HDFqtGzevBKrK8oEBNdyffqa2w/uU1WTtO2ZlMQsCbCagcXIaQuFFATjCC4OIducQOy0bAmRBN72quVCTitIDKZYS3CJ3Y9+ANm6/gPWSqpMSg9F3BWRyP6Gk0LDaaM3KKukFdPJTKQu5ZjcXiBFCZK9984NrRXUEVY7PhTfBE/rO2xRcXz7Fq9ePuX27fuq54I6m3u5scqCpSqXHArM9xwjPjj++s//Jc30gG9/77c1xykV3AxpFLLbU4a0DElsnh6prFthIEBwALsQeWEtPjE5Lr1aR3MkA3i9vyBg0utZiqpQlkO0vYdzjn7Tsk6J0YXdf81MHBp+xsQUmQEEyMDeaD5jYp3kTSZomL/0U8x/xtywMjNryQkzOjBqGt5ksGIaVykaHn3rW7z67DHPP15z752HmvOWN++EgnyKybx+9YTxdE49maIO5w6E53BkDILzGknxGXhrvDJFlCom0wmHBwdcXq/o+g4XlUjxon0Tx3XJuC6JElhvN5TLQoGqNdRSacFG6j8RJVIYi63AiKN3XiNOecC+RH41wBPs0cx7lVkxU4igRmjwp96I4wokgEFqPgnZ9woD1wKTgzv84O/9fQVoPhD6nr5v6Vdbgg+MDw5TPD+i+J0B1RM1CTHudfXNipdw3JAot3vliSfikyEh3V+qrEsUvrcKanzfsrpaMJofUVRldhgAQ+w2XJ+eQhQOb9/F1JWOR0xPmSZYJIUDBYI1Q4PLhC3VgJqor5MZ2iIwUOCqn9rTKYcXBsuUEsVlePadJ6Rz5fCbBaGPFKMJxdE8bdxpEafFbYxw9eJDnn38YQpzeUpj+OY7Y86XW3zXsiVyMG3YXrdMR7Bctdybz7lue6KJlFVB3Vg2beTsdMVkOubsdElRQB0tx8cNL56vIAZsXTKdjVguV0ynY7qup2lKQnDMDka0y8jF5YbvfG9Gu3G8vug4bCLrrqd1gb6LON8DHb7X0Or6usMHTeAuS5Oq7SLbbTuA2dGoxrkOoeTsfI3zwup6zcHRlNVqxXbreNz2tCFQFgUikbbtMQa2nccWhulshOsDfdcT/Rq37cDA7aMJ56dbVquWoiiYTEcUpeXqYkluftd2PUUpOGcAlyYJcud97fmleRiZ8ibnNqh2DUnlWgK+YyV9qgacTCraNrBYrTF1gXeetoft1lPajt4FvNuB7d9UyaEWsbsClgLNbbJIyoQ2uHZLv15y68FDbFkrqEnzJexenbHvoOSfookUwXC5uGR2eEQXvJa8O69gyAtlVeCiT3181Cy43tH1DsQO/7YGDQelsvndzlrsGKaYCw+Ss5dDP3u7ib7iZfBgh2R4BeUhsXD6uhENc2k/7sJo6bgtds8rws4BjZklg7IoESNcLZYcHZzw/Nln3Ln3Fk1dJ3cz53bpA9uUNK4www77hfOOH/7ZP+fg8IB3f+t7GFE2xwxOn452TJ6ejoPOmwm6HjLABAUoLqR8oKEtgrIi+pobHRbnI13vE+tjCNETfYAQsMZS2ZJyZCnEUJQlbdfieqd4NURcCNgEHowxKey622eMKVIhjz6Dtv9MjFkIiCh4zVzQPpDK+9fQsTCNO6mKcngXYGQA8/sAbACcifu7/eg9rk9f8OSnP+fOu28zahrdk7KDHiOnz5/RNCPGs4M0jkUKNAV9O0ZM+cxpLfg9JlKfKc1zYWmqmul4xLipuBI0aT6kYgFjqKqS6WzOZDrCWGG7Wes8pnE0daUaklRYZ9amdggFOvG/2H796oCnzHwIKb8o4k0CB1G9spCYjT1d3yHptABzRlSUOCjHUOgWHYTEvIggZUlZlRSjEeSlGAxGwrAYhqETBgUjUaUDdzqADj3U2qQuUUGGltgmUjUqg+WjVgRGF1heXmIjjA6ONZnXObwRTAxsLi/ZrlZMDg+ppnNtf5A2s30tlsRqfW5Q0y1mpku/YuOAZ3bAhpzXZBKDl5SKsAOyIsMz5gR377b062uIhmo0QyblbhECcUBg+uqO6LZcnP6UW/ePebq6ZNJY/uO/fZuy8CyvA4vlhqvrLT94/z7na0/bRg6Pa676LfcezuAlvHix4eyqxZaWg5Oa+XzE4lIXxmReE6xWowmGtlsDlvnRRMdjG1lcrbFFQVG2/Pij15RlyYc/XnG92BIDdJuervPUTUmMgeC1UipER1MKVVWy6gIheLpOX065s8GqM+tNS1WWrFYdH398Nnh6F2cL5uMR46pi3W05OT6mrCLOg3fXuN5B1DYFAONJQd/1eCLdpsVaIciMdtulUugeEUPvHKNxjfeB0ghHd+b0XaCqDS9fXNF2GtqzokmoIRmZiPZ12oVcdcM0icHYbZiqY4fHE+48mFFWlvU28uSTCw5PRrSrlubOMfhI2DpC6fF9YIj9/ibL/twrBt05eMZi8fTbJdv1gsnhCRQVgknd1yU5VV9y3n1DFzVH7vad23Q+YFN+kLGGstDXovS9vn9ueEVGiNrIP7EixhiCSa+DMVZbHaR7UJ3QjUo3Y3Vi1XbsIDWJkSQxYhZBij12UXbFI7mTtZ4z0HmPj6qDRkifqXHOLV+yDTPGUFpJ7JAwm82IRcn9t97l7NUTpvNjxpMp4kU79afwc25irNfU1eg6x1/+8z/l1t1bvPvd9xGjqQO7Yd73ErPdisMU7DunmZEd0kNIlWEZBBtBvIK4QhIbh8XaCpMKArzzuN7jfW4CXVAYS11VdH3Ptm2xItRVlTrC70BrdmAkzdGbkQBds/sNL3VvUoc5g9tdcQ+JwZJhLsRoHtRg5/f/zDqRrxnzuQLpRV7MT+5RN5c8/ehj7jx8pG8hQPfny9cvsKVlcnhCfq2NyE6ncpd0s/98xpK7nud84zwntigp65q6Tq8ICtq7q2ga6rpg0kyYTGoOplPKqqDdbths1lhrKUWLORpbphzPSIgu9/oA9MXx7lc950nIxuNNumkXXtUfTNwtimxwsuqk9x5i4v73UiZUrshL35Vhc8/AjJSsDiYlXQdR6nBAXnrC3cJJ4CKblZx4t39T+mqYTG/r/aSXI2jL/X7L9uqa6ewAW6duwqm/1Xa1YHN2TlU3zO/e1woc52hTk4P8sky1YylJNRs2tP9IDoFKuvZQTJoS4DXWnZLaJZnGCEhInw2BiARG1dMiQtet8JsVxhTU0yPNfwi7+cjeG6RqDtQbsFJy+vFjXj35mNmk4I/+1n1++PMzrjcts3rE/ZOaw0PD2cWa66ue49sNL1+uEGPoV2c4LPN5yemrLfcfTanHFRfnKyazguVVz+mLNUdHY+rKEqKha9V7uTrbqhdktdGe945ua1hcLIZmplE8EgzOp5yJoJVsxhjVDStsfcRpnES99sAQ7srjLzGm8t2Adwoae98nPRcO5g3HhyNeXi6pykDnAlfnK0xigaw1tFuH2J6+0xdW5h4eEeHZszN9RQUR57R1get7ivEYEyIHh5q4XVQ1vQ+Mpw2stnSd4xvfOmCx0PBPu3V0vcf1EUTDAMmvoEjVR713iS1XbdpselZLx2bpWFytObo9YT6d4Kqaw0nN2fk1m03LZtNqdeH/D0RJBQ3XxOgxOWEbwcaI71vwPdPD2yBGQ7tG12hZlmkvymGLVPWVw/mZkhkKT1L/GdFeQQawohWUbYh0Tl/fY0HDQqXFJs/JJ2DlXcQWMVMU6RkEay0uJUF/3r4NyeF74CR9MkT1MgcRYWAtItqgNfpAIco0K2WuIcOscNnGW2uQGDBiKYwQE/iyRUmIkc55jm+/xfnpM/quY35wNCTZ5003JsdOQsS5jj//0z/h3sP7fOO3vo8mjsfhVUSZlt8Bojg8V97YSXtIDAqMQ4z0vfZLExPJHf0k90RKWMyKpawqRqMRdYwUtcVGgw+Bddex7TqapqawRpPDi4KyLLVztsgO5OZ38MW4Y5ZgCKeTfh4iHnGXn2okv9BYgdwAuAbfW//UFw/vRX7SNmbYnWvXjHMYoRTZyXuF2pBqfMS732x49ewprj9hdnzA9flLMJHD43vKfotJe7PqU9qZBoZs0Mk0L8EHXArrhaiRIwCxBWVZY0yB9z2mNIyaEQfzGeNRzXQyZToZa4VwU7FZrQnOsd6sMaVFjCbmS0qNgcyJqJ6kuOyXyq8EeAKGjTbjpx3u3yvD3EffwMAqsZcevacUQ8Q1JTYKKOWZLqVMkqJiXXR68qwQyoWGwfnbc80H72x3K2kBDqAuDn2iiGjlQ/Lioji2iwUmWua3biFoA8SIwfdbri9OMQ4O796nqKshFESEAjWAwaI5BYnCjS5oblHYS3IfDBOYnEWWazoTtRljwAzfGUzlYPwUhGkMORBp1wt831LUI0YHJ8S04ZMNT14MuVmoGAwebIFFK5B+8J/+ff7sf/9jJnXH5dLTt/C9bx6wXUS++85d/vSDT2hsxeyk5vpqizEFk0pYSaSelOB6ju80zOaWF08WHJzUdBGch9G45PR0ies8TWMpLIzqincezfno00u2rePgYEr0WvHRjBo2G+0s6zsNDTsX8Th6o1VCWQFDWrC+94nhhNnhnMXFFWQmIUaK0iYWIGq/HwnM5xPWqy1I4PDIsglr7tyb8snjC2KEW7cO8CGwWAij0QjEcH52Qee6N7yxGAJFaSnLgrbrAdhsekBYLtdYI1yvDH3n6Rfb1BhUnYimLlm3hvFkxOmra8bjklvjGU+fnOGxOJfrOVWXXfKo9YWhnsIWrNdbnn3WcXJnSt8FNp3j0DqObs1YLdaE4JmMx6zWS+azCc/D4qsZgl9HEaN6LvoCYJvetVIguM0CCZ7R/AjEDpXPMapXK8akjtJ7jmFUQKSb+471Ve9YO2sryNDGjFo2Hwi9bjLGQlNVFEWRcmIUtMQYkRCwxY5Z0OTvHQNVDOxE7g+WgzIk9itVdJLAvGQzk+3HruI28/YhsSFiRAFU0HJ/jG6Okq4zFKLE9B1TDNUOQkwv1g30znFy8oDV8pSri3MOj493LJZNG3wU+q7jX/yzf8p73/gG73z7O3pPEvfG8wsTuffzjonatTzYOcaZ2clNYHNFnE+OmLEWKQsO5jMqq72cXOdw3uGDY7Nes92s6ZqaurCQEvBL0bwpQYak5tyLKZt0nxPx0zPsWhYwvPtOb2PXdT6/UDlHeIzJe6vZkQtpXxteGB8jIQH0mOy/yXOV+toF2au6TM64MQYpax68+x6L1895+tNnjGdzTu49hCi714ANupNTOvbSBvIzZJbM6AvVXUhVjamRaIFobliZIibGMJ5MmR3MmDUNk/GYuqqVxWsaxk3Dum3VrnU9nbVEpwyuRp50lDOD59yvAXjK7w3KYTeVpC6SmBORgW3VGPfuOMmHp8/iPt08UKx5kYNCgoyidwyJoO/6iRlcJUZpYF3QHh7mCwsvP4fskj/z3QgYLAHo+jXtYsVoPseUVVZFILK6PKW73jA7OMTOponRVuASJXddZaBPozGpQjESrdUXLGbglhFfSOWlaXGFGAZwFYfz5Ti/GVhLQb1bEaH1PX61ghApmwn1ZIa+FdskHOaJ0SJ7LF1WfBHoNldcnX3CdvGcq+c/J0bPeAyhd1y2K9551zKxwrVx/OT5S7o+MJo41mvPRx9dM52W9LOaxaJFii3VuKBuDI8fX3F4MOH89Zp+E5gfNhpuqzXx29jIvJmw3Gz50c9O1fi6wGa1Ti2RhOM7NUe3Zrx8uiSYgrI2GBewhYKx4LzmhqBdgwdkn4zJer2mqIrB1PZdYqYGkB6Zzed45zTfxBqacc2j4xPWa8eresnZ+RLXCWI08fvyapGwqOqtvrcqpFdqBJzzdK1TpiKBsxgjtdVck+tFq6E3a9huO2KINE3NdNxweb7UKp/C0rrA4vUlfUgtDKy+NgIxuBiSruhsVmVJ7/wu/BMMDx8d0AVHVRZAz3bbsbhuEXGY1KNm37/4zZU9iiZRuFYi/foaEWjmx/pqjfS5NfldlkHfIYa+P2tY11HzILOzlzcXbV+h3neB0V5gIdIm3TJWGJU1xhjqosgNXXBBUwSs0WTwwpqhSmt3zThsgnpZ2VV4pQrNQBx6VA0vfJYdEInsjKKIDLlO2VHLOZOS9DgGT2bSYgxD5RxoY8/c7DLk6yAUxuBjpPOOyewWm9UVr1++4O69+5ryEAqiBLqt40//6f/FN7/zLd799ncgOcq7cNvefrAHmvZ71g3OuyTwECN4XSdi9H2DIkJZyFAcoF1FDGVZMh6PMQju0LPtW5ZXSxbLFcvra5bX16xnU6bjCa6uEGsHlkVSaD1Z8mRuhs1txxbGDIIYcq2MyN7j7XZSk8Z/aKKJ6N6S1mh2nvfoAnJ+lPf6Tk19IbM2ZM3gKQoppSG/1DgBc0kguhpRyGvW1z3z414bVQZR0DUsnx1QEpPLBna/H2ZIMqgyCp4KS1mVlHWp3fcrKAvDbNxwMJswbv5f8t5s57Iju9b7ImI1u/377Bs2JZLFanSOJRzLsGzA50YGbAO+0RP4tewHsO9tGIZt4BhqIJVUpyAVpWKxyMxkZjLbv9/N6qLxxYyItbNKlI8vDFD0Ikj+mblzry6aMcccc8wJZVFiCoNWhqos0dWEajKVjIKXVHXvZB52bshN36UIyP6z7Pl3AjxJeaSI3dJg0XFzC78VxyidEG6avPLSRzNIdoOGzEIpAi5OQEUYHbZRpBYnOgGmdxZDOTLLpORzSo1RopyBHdZJBrCOuWbZQx3N1RVKFSxPjqXXXZzQXbNifX5JWc85vnsv1b2SWme42G1dRzqadP9xniS6OT+DSPWrqCQ0SFWBiA0LKbNN9xqI6baQqengJTXY9S2+2wIaM1tKSwEVjSDDzrBWuz+mxXcEm5PpIU++/F/45vE/MptWlPWcvmt4+OMp9V5gPViev3F024EPTxY473n7tuX3fzxjMl1ireLirKeaKDZrGeiuKlABuq2laz31dIrzgbYdiBpJ5vOKybRmCI7ZvCYEy3C6oayEFp/NDPM9Q7MWLdyNexPQmqGzDL3HNwMEzWQyYeh7vFbgQ3Y71kSwEWlwH6uVxGspjTVYXW1iWkSzdzjHGcXp5TXnl5Zt0+NcwGhLsD6yESr2JfPv+Lk472IE5rKWJIm9lTIcn8y4vurYNH2s6pTDaIN3jvOLa7wXZ92qrrk8u5I0jvciEk3vLyCCzZzS0FKm7KU10uAGri82TOqCfvBsD1rmk32c9WzWLTdvH3B9fo3ri9yn63t/BEDHyFsF+vUGUyj0dMngPCbKCZSJVW8xaJH0q4+piYD3kq7zOuphYpTtIvuglDQFLpTCaXGWt32PQlGXFWWh8dYLyAli2hmA0pToUu+Un8eUjxpT/elIVcT590Nae5PZ57je5ebUO3rLXMijZG31EYhnO4AIYJwPYuqLjLtkVZME0IUZe2omuUCSIRilsd5Rz/dRSvHy2VNu33+AMhrXdPz1//Xv+OGPPuX+hx9IIB2Ze2GQxvtLmETtRt/xOiBZIuyCKGS+mgLpzkBOP1obq8WC9EdbzGZMyhofPF3fUeoCFzx9s6VrezabDc1iQT2pRdJQlnKOvK7LNSUNqbTGieL0uMbn/S7uSZkF4rcksGHc00YxuQB1+Tlkn7rUfixEgsGFtE8ErLdSUKpU7M2YAJ/KDBkIo7hardmuVtz96Pdpry548dXX3PzgIdNZHcmFJKsJ8FvX7GMvT8VYiGW07L0+BJGtaDHGns/mLGdzurllMl0wmU6ZTGpMUWCDJwy9zB2tqOuKMvhkRgAAIABJREFUSTUhOEfwnj44bO/o2obL1Yrziwu2257B9axWK7r+Ow6elFbYYUCXZU61jYLvWO+mGHOxGZAkEDF+Ns/NneAhRBZgly1SMVGfwJUcqYJtjMTSIkA6N+OmlCrSRg8kGQRa7VTCEej6hn7dMF/soQoxnNNAbwfW5+cYDwcnN9FVFQefj/NhdDXf6Zog0SSQLAqk1FnhkSoNHZ1ix7A/ArX4nYm2zqjHqKgnKzDB0Q09tusx5YTJ4c2csiPmniHE8luyU7DyVp61ym8sL7RBa37vP/tTjt9/TL++Yu/GHVz315y+/JymDVRz0VosDwu0qghhy6TWPH3Zo0uF6RS6hPbaUxaatnHgBubLKavLhmbbE5xi/6Bib7/GKOgahykLOt/RtS0H+wuaJgEJpJWI8rx40uE9nBzPefvymrIu6XvHjVv7dE0PSrNZNVRV6oul8gZU1BVVJc1xh8HR92ITcPv2Db55/prZbIZzlqIscNZSTCdopXj66JKHDw9oNxt0UaBCGyv1dseijLCsMYjjOou31ajtk8vxBErKymG6QdzI49dZa9GmjIumY7XeYrYdXe9yejWh38TESjpA507xXdchLNh4LVeXW6qyxFpPUUG36fIYKae1MLD/P6CepBJK/q002M2WSV1RzpcEREsUXEDruO5EcC+bYYzuvUMXUuUk7SbAO0tq1prBk3eSZougtB0GSffENIbWBlMV4gsX2Z9CJ6YpkJutxuvOLEVcS1L6ZGSRImhwsm54O6CUoq4nsu6GsYBn7JGWQH8MhkPIbVhStScqpris6EzKosgBrYnXK21hlDQDBrEhgHHDDeCtxZRTlgeK54+/5OTOff7hb/+Sj3/8Cffe+0G8hV2B9wiafJxbQt7onbkgwe74eSKA8tHzSoTfJAAaAw4d547RBlUKA+MruffCGGn90fcE7xg6C8FLB4l2QlWUhCKlrkIOnPMeFP2yUCr2SpTxluxpkldTumAX521K97MT6KN+GziOmiqtTQQqKeNCZkqTm3mpR9AEqfLQR3ZcMhDb7Zrt9TU37z4ADLODGzyYzHj+6DGHd+6zd7AgevegiGlFlKSX47nYBeGkZyFaNuekgKIoili9t+RIacpyitKiGfWFyA2sdRhd0E8nTOczptMZdVVSlArjHEPo8ZMStfIMfcvbN694+foNq82Wdui/dd5/N8CTEqSrCTilcpktjOAmT+UdQfbYJykCox2aD7U7VlSmJ1P3cxXR+66Pk0JhVKycyp4kuxdK/ns7v5XLa/NihICRXjnayysKU7N3fJQHa/CO9eUl3bZhvn9ENatlABEwXiVXgwwiVXb2VVkMauJmF7SwAYTkxh6rEpVECtmSQJ5uHoAJTKkYlTnvGZor/BCopnPqg6WwEmICQWIElTEUkNMQ2ZJPRjxJ/iSU/CCuyA60Mhy9/zHSTb7kzW8+Z3vuCEUgBMN0pjClh75lUSlu3Jpw1UBwjtVgadaeqixwnWcxLzGV5uRGycF+xTDEag+lmO8pHn2+YTEv2KxaNuuBYXBcuIbl3pz7D5Z0/ZZm69huOg6PFjTbntOLLUEpyrJAAZcXa5wL0gagLjk4nPD65XWOrPBx4TUab2EYBrQ2OOt5/eoUrTR932Gtzx42qSWetXK9WhvabYvzKaUgQ6soNIXWdIMVAKrHaDGQWq6IriyBnBACr1+dxQAz5LmRUjNdO8S5pnGDeNAolaLqHU+iNI5DWoCjHiakCFjlaNe7wBAsl287Cr1iOziKsqDZdBS1Yf9wzvOvzv4f5/+//EM2zEIFuvU19WxKOd2jKMShW7RBku7QqOg9NqbJ5HkqmVtKvstHpsA6FzdsWXuMlh5zSiuw0lOxLDRVJX27rHOivSLKB2K1FiFZpwiDBGMJeVo0E1u6uyamBbAojPhCGR37rqkYjMbxoxIYGftbpvGe1hl+6/+F9sIAqJF9yGdVY1XbSAqFCPzGymupLAvoasbx7Tt8+Ys/4+GHP+TWgw/yuXbvY/w58M5tpvU07FYKh3e+QxrGysPSSvaflGb67XtDKaqyFNbNybOfTqcchMBkOqVrGwlMQqDve7q+oyh0Xn/Ga9vR+KS1VkvQ7rwlIKxwUMjYgdxrU+1Yyshdj6J4pUJmC5PeTXrljRYl+alFys2FgIlVjek+d8eKRsZz323ZXF1z4/ZdGWsR/Oh6zvuffMTzx49pNvvcuHsSNVlpDMb9NvmDKRULL8h1WGmP1UZSpEZr6rJkLxqOeh9B7tATvPzd7XrDtu2YTqYs9hYsFp2wgtOKsjCYsqL2joP9fZyzNJsVV9cVlxeXDE3Ltx3fCfAEYvDX971ENISRXWLMwQYF2qc0W3yYIZnLxVLXuFGNm0CIWutED4/gSqnEDjG+uCBVFuNnVAZlOrJeu5qhhIwzHInsVNNtGLYds719dOpthWe7WbO9vGYynXN0+17MjHicSnYMAgJwI9WUmJy0u/qI4gIBXLonqdDxMWoxgSwyzDqmIOI/AajynGzf0TZbClVQT/dgoYh9ZICACTrzYMRNOzF4YWfAh+Qih0EpL92uid9FetZSHhrQLA4/Ynn873HG8uabLTfvT9ifa5ZVSbhj6F1Jc7XBD4HJJODmBjw8/NGSZ19vuLz2vHqx4aNPD3j6eEtVa5prz/lpz3bd4XrPpz/c59mTa9atweNYbxuaruXGzSnVNNB2mqJSDA78RiCrs2JN4L2V1IaG/aMFl1drGQdJKGoMzbbFuxprBwET0ZN+GLxEOp2jrAvmU6Hut9uetuk4PpqxaSxPn19C0GgjFXUCzKWVR2r8KrhlJ726s+CHzO/vRMeRFfJeihSKoohjNFHhPi4yjhCS6DRR9wKgNCGXu6sEwmOlVPLRtL1l6AdMaVitW14+vUBpxd7BjIMDSedtNt++8HyfDgUUeIbtiulyQVHNIlhSssBGEWpmlAJU0UHcI/OpMGZsP5LSIEqYUhPndQ7cdlIl00pSPSbqTVyKXrTok3LQGQQ0FamFD9LANvkiKQVGEYtIZMz5mBIujNCNikKE0BFM5zV0l/VAUnlJwKxUiNV++p3BG5DNPpgiNjVO3yHrl4jgLYNzWUgsQYQeEVl8HsoogvN8/eWX3Hz4EcpohqGjrmsyaHoHkci4Nu9cdX5SmX2FETxFsUcsIJEb11rlPw+JIU6flgcu81gHyrKUd200s6mj6yZ0bTeeLwirJazbyPyNY8Jna4tkIyOjS56TV9EHSsW0ZwJ1mV1KbMIu45Se+BhMg8/VxwlchRCr1ONeqNh5WkrCcqMNikDfNVycnXLzzj1QJlfopXXMYbj7wQ84e/ENz796xr3370FR7DBL8k5F35lsICIDlR9vykbJPVdlyWIxxyOm1FVVUlcFwUE3DPR9Q79uuXpzzWK74fCoZeiW1E1NUZdURSnfZwy6LJku9lDmFYMd8G7g247vBngKxKoT0WboQvPOrEc2E7cz+IEY0Y+VKlqraG0pHxEMOla8pXOlX4QIvMbS3B2mKYwDd/QtISMmvzOChCECHTQ+WFbXl9TFjOXJIlY+KPq+YXN+SaEKDm/eEkCVFjqlYk+/CKAgR1cm7GiwdPz1DvU9CuC9aJnYtUhgp1+UGm8gBPq2wXUduqqZLw/igiyfTbUdGhHMZzG/j9EFPhomhN0RHSdAMjULqKDfAaFSeqoxxvHq9S+5eN3Qtp6yNNQ1TEzJTGu+fN1xfb2l2zpmR56Dgzkvnq+4/2BKs+mp6gnTsuP0rKdrNVeXHYvphPWmxbnAYl7T9D2PHl9RT0tU34PXuGHAW8XXjxoOjyfsH0w4fbNlsV/TNRajS6bzkrevrkFBXRf03cDp60vK0qCUtFJwzmGMkagyt4lQsRWKYlJP2W62gCd4iyk1k7Jis24JIbDdDKw3HYtlzXbdxbReGNmBoOhsiIAsPtuwG9mKHsQ6H8H0qAGMmFc25iA9xojAK+12SY+m8uo6RqSgYnPbMTDwseejNkVmtbQ2ODdIU+KYljGmoG17VLXErnsZQe9E99/TQwXaq0uWxweUkxlSeZmKOVJiQtqsDP2AK8BrYXxDIPa0E1CQTH2JaQyxyRDtJNFVOvioQ4nviJA2Tp3HJKhY5p9ScdKGJETWQSlZT523cu4Y5adNTNq0SEA2LnthrBaM16l31lNIxo3yfampMcg1p6rnlIrWUoMc83chp2ryRuudFNvho4kyAjKSNUgMAkMIfPmrX3Jy84T9W/cotKHdnBP8PpPpBEjB7c7iDu+sXfm/ane9H8FVCOBDSpfvAiV5Mio/6/R0UtAT128tDZ2NMlAFiqKgiEGMLgzGFBLYxuBMqunIICEV8XtiEBTNdV2sPkvFAaniTd5/zDykdilxvr+TbVGp/Ux6CjsgN26JIbqXFoXJ4CadS36pMQr6oef89C237t6L7GbIYyLo5CIu7+743j2qs1d89auvePjR+1RVlbXHaSUKO+eQuDLeWQz8pUOHQZuCyXROWdUoZahKI70iga5tKQvQBjarhrKoKNE0TUvbdRmAaa2wfc+6WXN2esqrVy/pesvwXfd5Si+jLku26zWT+Sz7e6QJKsNH5VSF2vl9YVbGKa786JqaXmEaJGmGJNpcABZjlb5cUB5AuWQy/VY8l87hfhrg0G7X+H5gsXeEiXN9GAY2qxWh71nuH1JOJjl3HLRsasnjShZJchSWaHEFKD9O2LBzLypeuwpS6eejvbCKnxPkI0/DOYdtNgTnKaczqtlcnqWsDBk/pue+m97TI8lBaoMj6dbdCb4zodCkpo7eWagmEdT1PP/V/8b581/ih4DtAjfvl/g+QFMwTDSvXmw4PJwwaJiUNX2nObm5oFYeN8jCPl0WLHrDF//wlr7zFEvF8fEB56eX+KBYLiZs1j1N37Ocz/DOMqsD28GzXluuLx1922BtYHXZMZlXNCuL1gWHN2ecvd7QNC1aFVhnCS6+bgVHx8esrq5iuiwHotH/CTbbNQooywJrHd55Nq00DnbWsm0Gjo6WtG3DYjahqEr6vmMxn7Da9HRdh7UupuRGN30ZhB5daMqqIHQ2+kjJn2XDOqWoJyVd24mgPUOrca6NC2j0TkntF3bRTiyVNlqRStbTBmHtQAhSeRSUop6WGK2oamkEu5hP2P4zYsvv0xGcY+/mCXUhlW5DGJ93iK00kv5el0bM93wg8dHBg08NUCNBkMTiKaWlQxCQFWBwLkdsXiVYMEobjJEmqM57sh+UIjKNkKFQzrGPZe8h2ZaQ47XdO5UKW/K2GDWAMOqfVBLhsVu9h0YqtOL6G/loDAGjC6no8l6yCJHp0kqhzQhs0nrkvEMrEwM6x5Mvfs3d+w+Y7R9KKhlPPT+may5xbmC+2BsXyni8GzjE0C+QwaPcbojn8Hmep/tKV8TO1Y1bfgwWUbEqTQIhoyUw0SimdQ0hMPSdGHzqMUWVgGzSUKWUKNFWwAay91Nq0JxctdN9jCBpTKMmvWZKFSdyIAGi9HMyq0wVld6HTFEkY80UDKddehhaXr94wd17DzGmjI9vhKvyznY0YsDyxj2q+oInv/6C2w/fY7En7VokgIztg4JU88k6GCU1CQTG+y2qiklsVWa0tL0xkRCpK0NdFswnC/ojG8dfYBgGtk1D07R0bS/Vj01D27c8+vJL1qstQ+/Eo+1bju8EeNqdGBSOl4+/4O4PPs3VbKOin4ikd6rtgvxdQdnxC/WOkJq0QJAHTfpvmhypoEnFiSQ2ACTUFedFyAvb7qQJKuAHS7NeMZnORCQaPE7B2TdPuH7xgnsf/5Tq6FjOF3zWbWXOTDE6qJNKSeM5iSyX/DJP02jpFO99BFBJkJlBIWD7Fte2Uq45nQsMJ7IJxOqaTJkyvo3IRqR0YH5b+Vn7bI6ZJqAUkqrIXml00Gyun3L+8kvAsz1/wfXbR1y93eB8oDCKi9ea5bLi4f2CRy9a/uDTI56/7YENzx413LqzEO1H0FydNSyWNdfrjpObU9Yrx2btaDvPT390A+96TKHZrHtQPXVt8Hi2Tce9ozl25fnkRwd88/Qa6zyHJzXblRUgZy1tayhrzc07C5rNwGbdsdyrmcwmXLxds9ibcHRjQduu8K2P1XfgbIyGYyokIN9XVCXX1y3OOcroyTOfaEAMKhfzgqJUQMXe/oz1dpB0Q+jwyZg0U1BxXDhom15ehVE5lSZpIAVKM19O6bthDAJA5k1KeaRNImOlHZ3DTqoivX+pxIxzUEt6KKXH9w9mVJXh5s0l19eDRP6+Z7aYU9Wr/5Al4F/0oU1BWdQSDKHwg7Sa8IWKzLEEHFLWrXGDlZSZ0nktUJAUxzKPo64lvSCJuFVMy0nlZkpt9N7TDAPTqpLfQ9aZ9O6U0tHiIFZrKZ2rRAMBG2zURqpsOBlXFjH/zUGbjMC8XgfZjINSSNZeQV5L0t+PGzWiz0wQLzH+IcRPamFJfYjBrxY7YRt9q0zQsUQ+4DwMyoF1vHz6NXcePGCxt5cwGzoIg1PPDmg3l1xfXrLc34fY54/dtSwCuV07BLFZsJF1DeSOC8nqOKQ5ksBXzBXEOZhF8kQAmUAmkp51TkT/VSXO2EpJOxBdmPj5nXRgutL490MQvWtKOSaAqqKoO8T/pMDL7QAY71xmc3I6MI8VtbMUxOt3ohNQIaBMzJQYyAau8ePW9Zy9fs2dO/cwRYmA7HF+xOVG9oZdgEhgsjzkox9NePTrR7TbEw5ODhFPsqjrUzKnrBWGjhCr7+JmGAKY7Gcm925C1IlqhakqjCkpJzXeS9NfrWCwPbNpzWaz5eLykvX1wIvXz3nx6g3tektve7quzd5+/9TxnQBPkAIDxWJ6yHX1BrteUy3mka6GMWcWUX1iZbQ8rCFObE1MF6WFRyB2pk+zqWaaKIzU83iaCK4ibnoXwMUFAoUKnvVmjXKB5f5RfNGertmwWa2ZLY648YfvgR7Rv1aRrk8XkkoI49zMk0ZHuwYfcv8gF+l2fPithYgRQEUw5YJnaBr8YDFVRb1/QBx5Am0CWW8BZONQFcFmckaXS0v9AvXuFEOSpiEzvSrdRyAuVIGgPMuT93j+yz/n2Re/wtuepKdYLhegFJM6MNnTvFwpXrxpOD6e8eZsTaGldcHFaYP3nsXJkunygP3Dkum8YTJ3OD9hMpuzWb/l/PQNtx4sWF0OtF3LYjGhqhVtG5gsS+y8ZoKiGQbKqcJt4PK85c69Y6YLw6bZ0KzFJHO2qHDW0/eavnf0Q4Nz0LQ9b96+lf5V0XtLGU0Rq6i8lrRFciG3Q0xrxZlujKYdHIezmhA0s0XBdtWw3Vj84RRTaEpTsJhPOT+/xlpLcu9NgMeHMRKW8RoTdxkMec7fXv4O+JGtItp0aIkodwFUNqqLY1wzAjIt1srCrFhJHwmbEGj72DutLnG+ZzaRapyDmzWPv9hZRb+nR4il+AXS8sQUascIMAZ7KWz3EKoCPzh8oUX3k/Hs7tyKm/bvnMxn80uprJUU2eAcTd9TFEXUzRjwIhz2weFCoDIpgIw0KsKhq1SBS0y7GRODIFnPZP0zcXUlb67eu1wllXrZpaowo3W0biAtDhFEJbPetFSMzLY0svF4L8wmERg4J3pCF0Ks6PME53n9/Bl3799jOlsgDI3ognLBg7XockEYWs7P3nB4fIJWRQarCZbumiarOE8Vkp53LhVf6JyaS+s8IbZjye9MxbVyZGoF3IAN402r6LFVxnellMKURXT/HvcalKy4PoTYR2835R73iRDydwTIKVvxg/NZbE5K8yYSIYQsyt6FkulIWZnBi79TWRhixjX+ufzs/cCbly84uXELXZYjkEzPNsj8cF6Kb1KQnYcFgbKc8fGPf8iTL3/D00fX3H14j6KMadCs04zvPQJ072XxK01cBKOmLiCpQeelv2RIVZtVLangQgBhWZdMJxOmkwllYVhdnHN5ek67biW4sY6gpP3Vtx3fGfCEGlNytx58yBe/+Cs++dd/LANIJdqSjIe8GisvAimFp7LOwO58L5kNIUdRmVgKQYCMkohHAqp3Rdpa7ZbuQlCaYWjp1w2T+RwTzS7bvmF9dUWpCg6PbkA5aqZ2oF+ONkO+vvgZPd6f8WPqLU0kE9kppRXGR04iRYUJxPQ9fdOCUlSTKXoqxmZxmx+tFdjtcRdTg2MwlbZdMnuHQ8wwx8ea+/XF8sgU+WWPpxhdaF3y6R//KTfef8zrL34Gbo3tzpjMSi4u1niv6J3GKk3vwAXF0X5N23qGYWC9Hnj/kx/x4ON/g/MD07rk2ef/K13nWK029NsVaHCmwA6ep4/PqWrFyckCFwZckB55b16uODqZs1m3kqIzIm6/vN5wdR24vmgIXp7V+WvFdF4SgmY6nzIMlqJ2uMHReY0d5HlOZwX9MFCYAucCOPDOU5i0wAWG3mIM7B9MafserRQ3b0xpSyi0ZihLTB1onaNte+bHE87OVjjvfocNSiXJecFOGFypdynt+FljDAcHB5ydnWfghZYS32EYdvfrXKGXovMUYadNIHZjjCkhhyklGl0sJ9x/sM/1xZqma7HMmC9r7BaG3vF9PxRwfX7O4Y2bYqCr5A0YRj2ajkGZUjKHnVIM1kGhKeJmmEAFgczyJaYgicstUISk9RQmq4z/H5xj23bMJxMxPdUaOzjR1ShpC+KVjDkVI/qgVG58m5gLnTdoEPAt/98NnTyeZHGWQH0qpklMl8o1L0n7lox6Y9CqxjUnEmoCHiJY0bn3nVQdoqIZpQo8f/6UO3fvUk5ncW+QNShdK8iccHhUWVMXitM3rzk+uUlhKkb9VwQSYafSNK3/IbFNSRwuL0ieU1rb40tLzNSOf1F6nT4xXhFxpCpuZYwI0OMlp0qyzGqF1JMupeMklZbtfCALqtM4SSn+XV/CzE752EEgXUe8Gx31ZGmfketWucGxcy63g3KB6EKvCMHx4vkzbty4TVVNZXXYWa/yXhEH1q79D0rFikAZMwTN+x99wpvnz3j59XPufvBANFYmx3YyNYKMDRPlDB4o0QkVjmuWD7jBYqoSAtnFP4nejTIQdWZv247Pv/iS602LHyzWDrEllgTG33Z8Z8BTDoAVaEruf/gj+qYRXQ5x4MUafkPI6v88oEKK1uSjov2PkCcQU32p8EU2BK8kukuAIQswgZSmg1TlEqPwYNlebyhNwf7BQVwEe7ZXlzgX2N87oqgrQcdxwCRaOKHxVLW3m1LJUD7HLBlXjX5S6VpA2CwFhQsMymPbFt8PFGVNtVySUmii1ZFJLZEGIyiLrFdKv+TJE1+EACov1x6iJ4cSQbsPYi2xO0nim0TFCFeee0lQnmK5x52PP6U2GzYXX3Hx6oyLyw1X5w3XSnN/7we05T0++UnP+vxXqLIkuI79w5JyYjh+731OT3/D6nxNt91ycqDpbcG9BxNeP1uzWvdMK8Ppqw0Bj6kN26YlaI8yJUcnE9aXG5Qa2FxZbt3a4/Jyi3WKZt2zXrVURZHBqLMDVT2l7wfW64ayLARwdAPe9xgtFSJtOxCcx6l+hNdKtpoPPj7BAC+eXXDv4QH9AK+eX2IHy+qip+0tTedpWsdyPmN7PeCd4+z0mvmsptWKpukginBdbmYaN5+48HovbEQykyMErHcoL2mHi4vLvMAS0wLODphCC/tEZKFIm5+cIy3QyVOHGJV7pHTeOSkpvjxfo5Vhf7+mmondSHCezdZGzdX3+9Cm4PL0JXaw7N+6RWWEgZJ1KD06EXOn6FgqxBzWBWnei7B7yT9Nm1Fgm2wkEqPRDAMmVWbFxd17MbjVuiAEh6fI+hZlRB80OCsbrikoTbKkjAwCIfYF1THlIRuaSmxJ3MxlgdXZdy7p/kjBbN60k2YnbaSRkdkBYiN7EUYz2Nh3zsRqRBjd1j0B5waePXnCvQcPojifvFCKRUMab3KdpYI+OHQxZbEseP3qJTdv3qaIwF90RCE/axU1VkGJD5cxsdJPpYrDsBO4p2e3Y/uQz57FrAC5CTcRZPrEGGkBVsmxO/WQVPG6ktjbREPU9C68D7k4KrFIaf6rIM7syXdLqtzkXSfPpt2rzYAj70GiU81GmigGayPTnSoGHC+fP+Po6JjJdEqCYux+u4qERuw24EO0O8jBusp7D1r27hv3H7K3vuKbp885vnuH6WySIXt63iECvYDHO3BGAoIIHsBZWclUoB96SlNCvBelQw76vbJcX1/zs7/5W56/fB2rpuXPpUpQpYqdf/L4zoAnHRCxc4ysl4fHbK6lL1QwIvDOhhBBJso75pSkAZA+EnJGzCcgkZF10kKNAEVWHlBeRfff+HfUuKE0TYPrBpaLORiD95b19TWu6Znu7VNE47gU+cOuzoro14SYvcV7iETkDjMVLyf9egfY5bYvQeFVwNuBbdtCCFTVBLU3Q4WAHdnl8T9KBOrZlSRS04mCf6fkFsb7CFETEBXTo4esfGe6PsXIXOgAXXtFMd1n6C5o1qe8+PIXYFsuX37J3lzRdI71VUNVFbSt58k/fMY3j55w98Eh80nHajWwf1hTTRVlF2gvPwc/wa57lvtHlGbL1SXsLffYO3IEFOvrnrZxVKVGWVhtO/reMdvz3L5Tc3HmGQbNcjnl6rpj/2jCZHCYQuGewRCrL+TeNNcXW2n5MHjKqaGaSguEofM4b3PUqAsTq4JIASP1BCa1YX3dcePWAW9PN5zc2uPhB8dYG3jz6pKuHSIICUxP5lxerKR1QfACmtJCpVNvRnm+eaGIi91kWmEHJ9F0XreS0Dyl55KQdMd6wsrni8KgVcj6iHeixyh4LQppUCrVPfI9Usmn6TvPm1eXFOaIsipwXeDN1TXGfGeWl/9PDx8C7//wJ7x+/pSLt2/ZOz5mUlSUiV6JDI8KIheQIhEvHmEueqkZk9e+EKAfZPMq1MgwBaS/W1AG7zzODigX++ppcd0uNQwehq6nAMqojZK9IDB4J87csTw8i1Pimin5FpyxAAAgAElEQVQfjKA6uFilF9BG1i8pEglRVxX/Yh6ZQGJuxogzBoIjewJqlGNEtkSYJj/KCUjreZF3zGAtz75+wv0H9zBlHRGOzAGRx3hhhOL5tZJCPuN1dOcvOTw+4fWbb7hxcpeyKrOTdWpdkgIFpdTYzSIHgmkTVyMwCuNmPK7hPv8sKUxiJwCkEErKcsd9QWmicTwqBbfRUiSEID0mUYhLgsLZlMKMQGhsl5FBnawNPoPe9Hs+nzOyT0m/FEZWe3yH8v+i0LJ3eY8qZA94/fIFy70DZst92Sfj/SVwF/J+nZgeYT5D1F2hxn54aUyIVsxRz5d88OGUp0++xh2dsDhc5GpUKbKSuzReQLlWZKCoEKbOqYDRnmA9LlicMShFNLCWa7q8uuTP/+Iv+fyrr+iHPhq5+lyliE/2EP/08Z1Z3YJOjEgcRCEwW8xoVmtme3sysUdgDJAHtSxOMgBiBh+V/0nCNhUZgehZEVNgqbRT/Coiss4+UvKz6y1ts6aqZkwPhCZuNtd0m4Z6vmB58wgIsbfczgXKRcYBHEVMIepf4rmFMZXFI1+mH6usgpbvE22S+BUNQ4PtBoqiZDKbk/RFSViu00MMKsO41FQ5BwUpEoqActf8M6cZdyil1F8NJVqv/OzzZB+Jam3g8sVjvvny5+A23Dy6xeXXv+by9JLppGTTa2azCUPncEZ0EnU9p9tc0rU9ezcq9oqCvcmCznr2905YtR17xx/we3fuM9ubEV79FQNreuvYO56y2W755utLIEWR4lZfGGiuet6+btEaLs5ajCnwOK4vHW3vObox5eT2hOsLTdcK+wOBqi7p+x5QXF9tuDlfcHxjwcXbLcPgcvm/VvJe0vPyIXDz9hHPv75g6B311HB50VAYsT6YzCcMg5N0XqFZLie0rZPKxTgMum6I38XOpupRQXQIptA5jeJT9RVE5+qCvh8itgpx0VA5vZEiTRBhpYtsR0orBaQyCCKjESl2F8e21pqDwxlXl5v8+eX+jLLWzPZrlvOKZlXE8vRvX3y+T8d28Jzce49nv/5HbNtwfPc+VVEDMh50WnwYQyuxCJA2ER5xqpeNyGNtwBQaGxwFUpWWcI7y8p2lKShj30WlFYP3eBtT8lrFojUV37+A31oVWO8Z4iZWGbFUUJH5SRu2dykIdJKCRr4nee+Ma5wAcxWD2RzIklKD5FRNSGtMBEM+fVzJ5modsT26yrEB8SPBO968fMnde/co6ykpdQPRuT2exwdGxg1h85ySfpCSbtIcH9/l7Owli8UR88UsN1ZOmYzRlVvlThQp/ZBL5zOrlNJ5Ic81gXHEqmm5SRWrxVBQVSV92+Gdk+eiBUiYHNfuaA9JovVAas0DRP+rlDUQ4CzP1O+Ak9REOL5XEmMj12vU6CLuow1GCqZlfI6SmBCZhuAtF2dvmc+XLPb3ohly2k9U/o7EcyQQmf5N60gZmUUVA3KRS0QtHcKqP/jgA968eM5513N0+wRNlOWkPUeryLjsKnHlWmRMGIKJ+2j0tQsEfBhYr1b8xV/+Jb/45Wf01kohgvU4F+idi/IGtdOT8neP7wZ4UhHVx90/LfpSHTalb1qq2YQs6IvHb+doQwQwsVo/zagx55omR+oiDZI+gx3RIBDPFLyl22xRaJZ7+wQUTbNhu1oxmcw4uHErM1RpoESmWa4pjqAQKwTT4qdVqlVIJ1R5QMQPpMeSr8e7gaHtCCFgJhOmyykJk4WYetEhof+QJ7cOaQKMbFhI1HDc/POzSpNGj5RxirwS8yGLbG5HnC9SAGi81qA4ee9Tnn/2M+x2TXX7PoNVLJZzgnOgDcMwMJ2UeD3FY/mjP/mvefab/4PZvGd96XGq4JvLNbVXdMMzBmt4+JM/ZaJfcn36My6vVhizYT4PPH98RbvyLPcXWG/ZXG8xxtN3QuvOlxXBOVwvLEzXttSTgqtVz2Kv4vy0IVhJQ4mfSYk2cHyr5uVzRwgDGs3F257FMgEbWTTrsmIYbP51Op4+PuPu/QNa3dF1jrosKUvDetXQNivsIA2HB+e5vNoyqR2TaYEbgrQEiM9VKxmbZVFgh2GnTY+iqEq6psXZ1GhWNothsBKN63d1aGlu5SgijbmwA5ijiDQDqjGEzmNRF4Y+Njm2zvGT/+g95suK1WrFYq/G9pbpvEZrN6ZxvsdHCKJza63l/Y8/5dd/93OcHZh9/AmEgHMeH9tWDN7n+eoI6EKPDLl3WC8u5HVlhGGKKS0bhJEcrBV2kkARjTCVUtiAjA1NTtmQNr0IZJQ2YsaqTd6QUWIHoL30Fk2FLSDrgImmmqLxS5uvpExSms77EJ23yeuEyAzGAG1cy8jrZdLWiammbJpGm6xfTdfvhp6Xz59xfOMGZT1FMbabGcPjkA1sQ0iBp7AHBCnUMEoE3kFrjk7u8erFU6w9ZP9gf1zj1KgLhRiYAKnhbVq539mt8z40AqzdcZ9+ypLCEFBaY600oTVFkdOFSY2bizmQHEog0FsB2i4EKRryTlLkQawKXEzLqmgtEn5LWJ4DrWimKXvjeCOZAQqpfyf5/QZEOH91+pa6njDfO8j7RQaOBEi+YPHvp0xFYsEKbSIDajEo8XaMYz9VerqYgvTAzbv32azOOXvxkuPbt0R7FZ+1QoEZgVOqJvXxGYgGOs2v9Eyh3/b83d//PZ/946/o+4FhGKSa21t5hjaSA1r9Tjp29/hOgKcEYpI+MOWUQZzHm34tL92Y7CuRNgt2QIGWP5LvVJAzvTtOu3IKPUYOMRoSDJNEmoq+bQidYzqbo4yi7Ru2VyvKsubo+JZ4duDjoJDT6LRIqLGwf4z40+TJ0kyBeWpXEJ8gdYjMlGfoOxG+FYbJfC7XnunVpFWRI7dlIVofJECzQz1Lwc8obPQGdAKtKaDcGS+7W9/uAuNTlEKiumXC2a7FFAVFMeEP/5v/jpef/4xgT9k/nFFUMbUXoN86Dm9VbFYtN9+r6dxfU+1bqplh8I7FoccOBedPe7bbhunhDeb7+zRvP4P2NRdvLmkbzfGNmvVqoJrVlBPN5astKmj6NqZDY0Vc33qcAzs4rPXiPeWhKg2TOrC69ihlmM8qlBJ25/xNBz5wdGvJ9VkDeLrOkQxHgxe/EFMUBGtxTgCnKQLzWc2D9w44O93y8psLTGHoth17B1Oa7UC7FYBUlgV2sNx775ir8xXXl42A0Vhu62OFmw8+9p2KJogh0DWSsnV5wwtR0i1DyBhD8DYPc5JpZV704n1kMWsqzNkNIWRMehdQWkqtg/e0bYfWmv29BZNJQd+1TCY16+uGYXAU2nBx0Qgg/Z4fgYALnkprHPDpH/zH/OoXP+Ppl19y6+FDeYrRykIMgON26B2mqgQAeNG5eC9shIobXBLuOi9A1JgCh6fQYacoQZgZfMiMYWIKktbGhQDORTAmG7AKgWAMBDHYVdGgl8QgKQ1xHbGRqRol3ERGi7GJdE6/jMx1ur5knUsQJsPuVOc5H8BIVVQRxr8XQmDoe775+hHHN29FMBDHYLTdyGJpkArD4LFuQKEolEGq7UOuwpNGxvJ3bt97yPnb1/hzy+HRcW57RHx2gi9UngOZiVcRFISUqhv3oB2EKM9ixxohLfEifZM8v7VW0mFlmf2exEhyZK3SM3WDpbc9xpQxHe8hOnsLqZYA5whc0/fZEImD+A51TOulC/Je0oOS1oqV4dGlPHjR6F1fnKOLgsWBZFpCZA9zPJYAcXx2kg4UNsGHGJziKcoCo4xUxVmfU9raJDDuJN1qNIN3zJdH1HXD+cvX7N+8QV1XotuM9612gz/iOwsBrzRK+0gsKJzybDYbfvnZZ/z7v/t7ukb6CzrncNZKgY5O4vLdlOI/fXwnwJOzA+uLU8p6QlFKN+Sccw0wXyxYr1Yslku8Smn6ESXtVvsn4zZIbJQaAQ5J9BwHWG5vIYMKpbFDT9+2VFVNsT+l7xpePnnEotpj79490UWFERAlmlPG7ggqVAR1I5Urlxxye4EQwdrOteqACh7rLK7rCQSqqobJlFwy/FvvUhEXvJ3qQx8bA0fWfowAdyaMir82PoEhH5mjUZwpMzQxaiOdm6ow0hZLXGAKXaAXS7SXXDpGc/+n/wnbL/+MX7295uReYDqfcH3ZY8NA38PNu/tM93pePn7DZFaxWnUsD2quzixlpen6ntWqpe0u+fn/+T8RguX2cYVyNTfu3OLJF3+HDorryy37R3OClZfbRefr6azEaBhaz/7+lKKGs9MtzdpSVoam9RwcTunaS7xXtL4DBXVVYgrDcq9kWpbUt0uurwKL4zvc//Q+8/0DbNvw5uvfcP76OYQhaiQ8e/s1H//4Li+/ueDyvKesS05u7TM1BmsdzfqC+bym6wbcYFEBXr+4EHO3wqAHG0cyEbh4iqLEBRcjwJFKDkBhZPP1GdTFBTuE6IQuP4fITKZ3LwtgfI87G1HeKNLYjHtjYqQUIvSspyXeO7rGs7puub7qMAVM5hPqKrDdOMry22nv780RgYgpjJT5K83v/5v/lM//7uc8e/SI+x/+gBCFxz6mOYhpGZ8qryTqkuDC+8iWC0vlnRUzUqR5bWE0IRisD6CcpDO0aOFSSjYFOIG4UcYNWGtwbmzN4ryLTFXSVonuJCDgzXoLceMlSJHJbm8zF6Q/oiJkB+j052lcpQhsF1fs+hYlFiStxQEIztE2G75+/IT77z1EBPdBNrlYfi4kqUVrEwXm0tVqLIDxGK2lqhHp/SceS8mOQ3F88zbb9RVnp6ccHh/H5+BzykxSq/HC1cjgjPqSuJd4nz8GYzCc1v4QWTTZA8jX50MAH72blHxP0uuayOApiN0EYDqdRfG2iNmlCCEyNwSUMdg0d4OAcGPAWUlFeWVIRT6y3ke6EgfeRg2UykDUx4a/28tz+s5yfPMW7baJINwJ+LAicwje463HepvlMz6yZd47vAvUswmHJ7dQpYA+rcSLynuHsyEWxYjVRfIxG4JHFTU37tzg1fO37B8fMl/OMtmXQd5uUAgQXCZYUIpgPY8fPeJv//YXrK43dMMQdZ7RkFUh5sQ+gCb7TH7b8Z0AT6Yo2ds/xg49XbPFDeLxYYoSUxqKqqaaTWjaLfV0lt1pE/OSF3zIbIhE2TIBcrfsEM3KAqCi741KkaOj3TRU2jBfLOiGjsvzUwpluPfhD1EmGnT5pJEKGcjkxSICpRDSFyeGbLxXEV8zLhbpPXuLbTuc8xSmZDqbv2OOCYz3GRJQEyCYnMhjsjFWGiZGL513FPTpGEImvx8IqOib4QlE1WYMkXZsIiBGvybfb7omFRcHHUKelMprgqlYHtwBp9BFYDL3nL7sKScly4MaVXu0Dly+aKj3LUWp2Zsorl90dF2H0hNwLd224dWv/p7l0V36w09Y3Dyh0s+5/96SNy9a6mlBsx7o20GqbrRicNJP7tbxko3rWF23YGC+nLJcFFycbVhftNg22jgEcag1WrM/3+P2nTt8+OEP+NGPPuaMBW/8HuXeAudEBzcMHe//0b9le3rK089+ztnzLyiUZ/+wxHYlwe9RmJ7BtnhfYrXh7dkGO8iip7SJkXCgay0EzTC4aDw6jiVTKCZTw3Yr3jJ1PcHajjAEiVYL0UJUWtP3lsKYuOiF3SEmWDguqIkdSHq/FC0mHYpK4WRkhNOGJ+/dE7xhfd2ijOb5s1OGwbJcTum7nu26ZSgMk1nJ9dV/4CLwL/hQSlEVJUYXoAxaCbPzyb/+Q37z2S95/ugr7rz/AUUp7TmEUZLE1247Ew+Rgdei3QmymQhrorO3k4pMii5M1lJpHZlQ56MVQQ5tIhsRUMrHICeVjaTGMQrnUuiFXIsPeE9kb3yu0kr3G3K0n/9W2qMkEMzgO+/SeW3xxCrEGHQlXVzwKeD0dF3L108e894H76OLStZt57m6OEcpOLlxA5BiC5Sn8D4CzDF9oyBv8MQm17Ksyf0YY1AoZosDhn7L2dtXHJ/cjt8TMqMTkh41pqaCT+DHjYEpIadjic/HO0eq4vPe450ExiGCQLy0mrHWjY28A+BSkCTSEU+gb1qpzNOaoe/IrSlcwPYteM/Q91HzFAXpzsa2ZzD0HdYOWDd2fXA2NtAdBqzrcdYSYouxxHh5K0aRQ9eKc3ja90LAmABBWjSVZY3XEFyJmdUEVYlXU3eJ6z1tN+Cc48bt97j3wb/i4U9/n3o+He8zSGA2+jMGyTZFHagCHIZ7D+9w9vot/dBzeJjaiuWNDBAC4p2gIaa7v/ryK/7ir37GxXqF9YP0BMzMYPpXMjPByXf9c7z5dwI8gVBlha4pJpPMcgTvGbqebrPFecfQbmmbFX2z4ejGfTEW25l4MDIxstiPxkmJYE2AwodELcrA8C4wnc2wduDy4gyNZn/vQNopJH0ACh0FQioCMGG2hKshnSGxWTkCS1GIliqbiNq8d/R9h7Piw1JVdez/pHK6Te4JQEfA46VlwU67lsghZONQo0Js/gti5BhFo16Wy6Cj1UOcBMFJ9BghhJxNp+dHZvGT3mHEgipG3ekeIyVPKtH24IQ+/Vf/9r/l6u3PGbavKLTBdQN9qZhMDJOyoipKKlOgwpLrNxoTLKvra4wJlJOCg+MDTu5/yp3f+yMC17x99udcnZ6xXQ30vWUyrbl995DXr88wBtqtxWhNWRku3zZMqpJyVtC1A1dnTVyYPLP5lNlsxuH+EQ8fPuAnP/4Rd+/d5fDkmOlsilKK123gH5+10Xcp7glG4Z3G6YLi8IQP//M/4Qf2v6DwPaWUpvBBCHjn8c5JmtBZPggDzvlI1zuUk/SN9w43WLwborZJfnbWEUJHu+3ou5a+7Wi3W4aho2sb7NDjB4cLTrzNkngvvriU/kk97mRTjSXPcfOSCpiU0FaJmopf4bMWEeLG6UHF0mJnLet1x3xe4bxltqyZzSqCckwmNW9eXPy/XQr+xR0qAp7ENGglxSg2BH7vJz/lyeef882TR7z3g49QRZnFLxoILrIRwYvWR8tapQNYJSmqtIGbECD43LojQSClJK1qI+Psg88CYmE5ZAdKWiQVoMzXG9c1JA00xBSwjwxnQJG8vgLChmhtcCFKIoKIe/Oe5wMutpoha2WiMNkHSdFFz6QEqZxLQEd0O33b8NWvP+e9H3yIi1WFohDztG3DMPRMJxMRXKsUiMQqq1hiLzYQVuZebHXkCdihx9k+n98PkrbRwWL7NV97R2lqeitApx8GfHC0/YAdPH3fY+3A4Hp87+JGLT0CrbP0fS+MkndichyBgA0eFZykqoJHOzDaUxrw3uJQaFVQVdJEfFIY6lJKHLVXKCVgy6IIPhqC4kRoHcSDTSGVYkZXYpBpJBvgg6dNBS5a1mWlDaU2KBy9VRRlQdd2BERsX8XqWhHgK8qqwvaD7CWVwTrZT0yAopziTEldT3BoBlXhKbGDo2LGdFHipjAzFYubD/Bm4PmXn/HeJz+lnM4ySFXRzd5bi80RnEIHE/c3j/WKkzu3uDq94s3LU05uHccWPmP1oo6MlYypwGAtjx8/5t/9+V/w9vRM1nEnKCE4G/fSsbwsRFKGGIB+2/HdAE8qrs8xZys/KrxW1JOaup6AVvhwxPXVOVenT5jN9tF1hbctZy9ecv/DH4I2kvoiJehSlYKOZpgpohCae+g6+r6nnEzRhWN7dYVSir29fdGxkCI2Nf4cLznJg7IGK+6qOulFlCQ3cgQTZPqjxD3X9h0KKMoJ9Xw2IuAQ8saUophd6js1gPSZcYrXkvdLQe8aRNflkzA8Lqw+VcuM9xBfgfwbQVKyUIiXNKZ3VLrfMcLMW6sS8GgCok9TGtRAWRiWN2+wOPpjmtOf0bfPMFVgeVjRbyzXK7j5wZxm6/C2oZgfcTJbopdTjB6YVh5bGHQ15fD+Q948+u8J6jmLw0C1kFYkr5+1vHzxFlUouiZQ1AWogPayiXStpyg9B8tjbn90m3t37rBYzvn400/5/Isv+C//qz9hu92ymM2Y1hNunJwwm85p2pa/+ZvPaTqhxQfvKZV4LjkF1ihCbDocgqINJdoHqkLLRhnddeX9OHDyPo23QlFbJ+Z1zqLxGKBWkpZQkVlUwWGAQklLHeUtzlr6rmNotlyevebtq2+4PHvDdrOKBm+ir6kraZegB0U/yIYnrzDk9E49mTIMPd6FuBDFeaJk4ZT0knjRoHV0oCYyn/LZybSkbXrc4NmsRZDfbIcsNP4+H0pBpWPVUGSVdxmY9z/9IU9/8xu++epLHnz8MQZZW1KZvAoh9jZTUeEf9YoIrNEZ4ERGPZ10Z01LaTWjpSJpFCxH89TgY1AZU7XxGistLPLgRKzuEzgLkjY5e/uWl199wfbqHOUtKrjIuADOY8MgbLzvUT62nnGWgPSqS+mi1ArKGBPBXJB0j3e4IAGG9h5H1Nwoy9d/JXIFjUMRKEwBQdz2PxssQzcIeAkeH3QMQqINghLpQHK2LiLAtUGCiMm0pu0cwQ0URUE1KXEo0BXBDRH4Se9Og6W1nq6z9FY0k511KKNjy6XUv9DR9o4QTOT0xI6iKgpK5SmNxgcjaTccdWnorCTpfFDRLNhSGGnpomOgPChP2/ZY63FBCgnSdlkYjwoW7yA4hzIlpRnonAVtZD01mq6XlidSgunRFKAsyih6F1BtJ6mryNp1SqMtVEaKbgKKojL0jcd2iqKe0Aw9OlRoV1CXBYNVDMOWolaoAkpTUNWHuL5FMVDNJrz55il9f5cf/8Ef8vLJY+58+BGmKjE6uWEGdFHmsa1IzZJjukRLILg83qPedpy9PuXg5JCqEhbRx70rBfvDMPDoq6/4s7/4S96cvcU7SzfYWH03srNKebQIs7I3nVJKctzfcnwnwFMIoJ3D6UCz3WBUgTGFdJsPLqoNRTW/XOyh3/+YxcEB7bahnh+wPBxQpUbFSpbUviJ+uyz+EcwoJXl+2zQUVYnSntXZayaTBcv9fTGnS7LIWBqeg/EQUMkPRytpAxO1S/lcQbYeFwI29GB7gtJ46xgG6Zeki1LKbQWp4Hwvue6QsUmqZRFxd1yUk6FnEoNmJi3rfWO5qY+Zt5xCixGjksljjMnX7EjEfUiXI4ecKq7lkaqOfkGZlmfneuJhbcv1+W/YO/oQozrefvOPHM/g4vQFff8bvHdMT6TS5Oqy5eJFC2XFZGHQRiq53r54iR887QD1TFPfmHJ4+D7H79/l7bP/mc36jLISQ8Ftr5gtCqaLgmHrpXWIDxzuzVku9rh/5yF37t7lwcMH3Lx9m9l8hjJw+uoNLgR++OmnvPfgQ37w4D1msyl7e0vm8zll7DP1+s0p59uBzg4UGLT3NFo0bTZ5mwA2TVxrcYNl1TY4a5ke3ZCHGgGrcpENiFR+ovtD0JKCCB5ve4a2BTz1tKYoagqtKDCgxZNJG4+aDph6n+P9G5y89wl+aFhfnvHq6WNePX0kIH1wVFUhIeJg5b2rVHou79EOfW7xIISnVCdV1YT1akPqIj+6MUdPmMig9J3l7Ztr5vMJZWm4vNiw3aQ2PN9/8CTTUYCLaCcSIySamX4YeP+jj/jm8WOefP4r3v/4h3il8c5FSwE9pu8CwpggFZZGeXRI7XlUZA4kbPNEVgmpBivie0p6oKSN652liM1VtTJRpxQYIltfpJJOuWqGQfoTfvPkGf/7//g/YLo3hH7DbL6HR9qKFIXB2R7bbwlAUVXUZUXbdfTWYnsxkvXeYYqCvusoCk1hpJquGVqMNoSgGJwGU0HoqasJ2hQo5WnMhspUUR9WUU/5v7l7sxjbrvS+77emPZxzarjzyMvLsZvsQbLakqwhcizJGqJODCSK4jhQFEGB8xADeYzf8hADcV4MCAgQwEAEx0gQJ0BgOIkVS7YFa2oN3Wr1wCbZzWazm7wk71TjGfawpjx8a58q9ihoStubIO69VadO7bP3Xmt96//9B5QWLydlKpSVYRWDIDdDkMzAVEjU4oGZWQ8eYxy1U4WJkOn7QI6JytZ4pek24EMkZ/F2U1oKO2NqYsj0oxfUKQtfLAUZT8txgzYWYwxORzZDIoRBfs5q9BCpdC/rUjEXbStLzOLlBQa0wqlEWzu0Nlgn7bF10OgkRqp976WFa8Fsx1WmEugKlCVpwzhmTBZiuatqrNL4mMUgNSqih2ykM2C0RidBpiIZlRKGgLOaoR8wRgo6Yx19v6KpGnwWjl3ykTR6hjiSDSw3gpBa11Brg+57KucYVkdYq+hTjbeK2WKH46MjXvrMK7zw4Rc5eucel+/cIesSCaSKErBs9Ldk+FIMhRAK0puxbcXV9gqrkzUpVdjaoFLeIkcxBt740pf4zd/+GPcfPCKExBgi0Y/EwrGS4ZvJscAchVcjqBXnVJBfe3zL4kkp9UvAR4GHOecPlq9dBP534C7wZeBncs5HSrY7vwj8O8AG+M9yzp/81r9DVEe//7Ff4ZWP/Q5hDOxfvsLFK1f4vh/9KFrZbYq0ypmqrlifHOPqiuhH5vt7JB9QCIFxikKQxV0ejIgMstB1vPnFl9i/cJV2bx+VYb7YRTknipIYeOeNV7i4f5V2/9IWmpkQlnNNEWI++/vkk5SLk2lKmeQ9/WYju6aqoW3nKKu3ZPItcK0KVDQ14DLYUhHFXLw9dDGTK622lCGGkdInmO6VqBuU3iJUGUGg1CQSK0jYpKqxJdNDXnfW9ZmYDJMze9bT55s+9NQ2nJSR8h7OOjSJL3z8l4hDommX9M6CGgkxye4kB04fBGKv6JcRVIfRM1LSdMsNKcHQSa5UDoqDmLhy6zHr48/SjQ9YnXTEIbM3N7Stoj/SPP/MM+y3V7jzxG1u3b7FlatXqeZzlIF+GEljwBlLU8+4sLfHi899gFs3bjBftCij3lNMTEcm0XUdg0+omIlGMpNUVsU0LpfMKqZam5gSwY+QEsNqxfHjB1y8ebcUSNK+yyltn7UYQ2kxRLFxSGnbs08pcfRgIBOpmxZrrdqz8JMAACAASURBVBBAldlmak3J81YrnHE0u1d59sMXeeLZ9/HW65/n3a98iW4YzzzMOCOO58lET00KH3mOYmnjrsY157l5U3G1DcssE5pSGT94mNe4Sm/bSGJC2H+r4f9nfvx5zGEyHvR296soHEktRPKU4NoTd/FvfJHXP/c5bj3zLJVzlDROUZ4pmbyNMuLtVGTfCraWBD6JWe00tuW5PVNQZYQHpLQqvlwUJExt77+8XlNBaTGVd1JF6JLh3bff4pf/l19ChSO6fiD4gKozdWU47nrCpoNiRKhURg8e1EbCtbs1ORkG76lqEQBlH6icRhNJ2RGIWDxKGXxUaDpQuhQFBmUdrnYiHx8Dth7J1GAtKSqSHxmGNev1QBcSMaqCdpVcPWPERTyCMQqnB7ydDEUtrpqCbhMqBlJy+BCLRUfAGfFdW8wsFI7guu8xpsIajdYDvc9oPGEYiNYx5sgYItrVOJdwWjGmQMxG0GcEuRu8B1vhu0RQidYqlE0sVyNVrbHRohUMXkx5s1F4L8rfHHsyAZLBVhk/mC1NxWgRcAQj/LD1ekNd2bL5FwEPUXipSUurS6tEzhGDpcT+4ZUGbcUjSxf0M8Mw+WHpRErDVsCSg2XvwoK+6wkxkroNKQdmuzvEXua5vXlFn3t63+LHgaY74ODBASatGcaBJ97/wnYdganTcdaBSRTKSpmrTPlTG83l6xdYLTu6ZU87r0hJ4YPn3ptv8rHf+X0ePn7EmAKjH8XfLAEhQYJIOpsPUxCOKQo15cJ8E73LHwV5+gfA/wD8w3Nf+9vAv8w5/12l1N8u//6vgZ8Eniv/fy/wP5Y/v+URyXzghY9w5/Jdxm7D6EfSOGJthatq4tbdFRpnxSOl+FnUrt4y5A1w3hxSk6XK7HucNrQXLnHhynXm9YL9K9fkRk2kc8FuuHrjLtpYtNVbJGdqWUm7ohRm8q+CvpTPkSfuSkRry2x3F63M9v1JUfr+iq0yT2tNiIWkpwzBe4Exiwvt2d5dpJ8TYTOUJHUKkW/qz+ZtvpKcZ2bq8RXpaHkiJ+heSHkTyXJiPpXrrdkq7oBtCxOt5b20SKwpk7vOhvneJa7f/BAvf+LX2LhI3SouXK0Y1ol6YVjdD2QPq0cbclRoCycPB0YfsUCzcPicaXYsV29X7F9s6dbHnL59yM4ly86i5cSvWY+gVcXTTz/Nz//c38KPPX23IcSMsxWVrbl04RKXLl3kyuVLNG0tSebbCAThfHx1W3vqlIKmHz19KLarSQrV4hQgz00ScuF07VVhoowxEK3CrzY8eOMVmr2LJO9l1zOOpBAEpQqeHINI1IvSZns+k6teTvQxlcgIs70HCo0oSgR50EaLcWptqZuKa089z5Ubt3jlk59geXxAVVvhKRUTwbMiKm+RE0GdDCFO6G3e8sNU2cBoo4UnNxXSpVV+erxhZ2fGxYt7HB+vtmjVt8HxD/gznMOE85K2iJ0g3XJtVBTJdUgJPwZu3n2Kg3fucf/LX+Lms89BFBdwpfTZOC+cprMNzJmhr49J7AhM3t5DU8bhlDU3td+nn51KrVSUxmpCqpXwZSbSrSlE8n695p/+r/8T3emb7M7mjH5ElWf1aL1G24z3vfBFtAaV0Dkzjh7Z6ym0zuToCZ0n2ophzHjEfFPbDQ4nmzolCsMYI1XtqHJxXu979EbeO2NQa8Xu3i7aWSpdEfPIcjNycLJhjBld1cSgcNrS1plVHzFDxlqFSYk+GdCZtm6IYcSNwjtcmohRmaRaNAbXKBSWvvdUzuFDoh89wxAJPtN5z6yGMAR6H0lZ7B9aJxubSlmUARgYx0yMCusM2tX4kFFxxGhHQyZahdPgkAlFZ8+wSXirIRe+kQKVLdGLR5UxEJPBViLkQDmsVkSKdN9Zgh/R2qFVJOFwlSVHidMSrY8m25pspF2olcZlwIgdSiyzWGUMxBFlMoYWbSK2ckQMo09oY3G1AwxWOVwdiaO0UV3tSCFRGSdIp6to7QzvA1WlaLQmpZFxCBw8eIU7z78gY2Y7s8kmLHLe/T0Rs9padCgkckiPhtmsYeg6jh8fM99f8PDd+/z6b/4Wb99/QPCBUArjHGVFldSRMoeVnW/WAjqkXBAwncnK8I2Ob1k85Zx/Qyl196u+/NeAf7v8/X8G/hUy8fw14B9m2b7/rlJqXyl1I+f87jf7HdMOeufiJfYuXi4XrajisnxYlfOZe7eC2WxGv1mhYkbVDSEHLLZEmEhlnXIs8SWatpmRNWzWK67eukvTNOc4UWrrc2IzLPb2hCSeIsrarTpEWlu5OAGfITkpSksu+4gzBtfO0MUN9oxiPa24MrEkMipFYuz45G/+S+699mXme3M+8F0/wKUnn8VZgbe/Wgugtoxlz6M338DceIa6qraWHYVpcQ5Bmfg2ufC+SkXPZM8gu91M2hYSE2l8Wy1Ot6G8fpIlh2HNo7d+m6rdIfmRnDxdfwShQ+uaJ55aMOYNxkGMimbmaFLDo/UJepTFXlXgKkntbheWFBKm0ly9MqdeaNqZ5vBwBOXAG1J3kZ0art+5y8zscXS04oXnPkBtHdcvXePSpQvs7ixY7Cy2YZBMj805ZEkWFt5TOG174Oe+9vDRId0ohUQECY+m2EHkhEpCiheu2fTeUvCEoSflzPLePWy/RqeIjjJZn0eNlFVo5c5x0Ep+YJEDp0Iq9yEyek/0XozkYlHwZHl2c2nZKK0kCd1VVG3F5VvvI4TPMw7HZBQhiDLpfEEcY6KpDDGXdm8+Gxs5Q9NUpJQZx4irzNa/6axFJed+9HhF3Thq5+jH4T1I3v9fx5/5HJYpiiMrYoAsJOm6iE18DICmriqSSlx78mmMe4u3vvgFnn7ueaw+U8duexSwncTFEiBKayFLbqGenl1dCvfi+WO03rIIzmxQIESPVRaNPpcvV3DjPEn/ZbP2W7/2qzy49yq3r14ghpGuW6KMYrk+xdmKPHpQnkxA65r1eoDkUSqiVE3jalIYyHiGaAh+wOeMT2KlYEOiy4moDSomcJrWVDhVEU2LUom69cQEzjR0oyclxXoYqYaBdThiteo5Wg9Ya2krMJUiu5a60oxjRIWEa+ShVNkUBWMWnpOIGxmjRwV57lMOuEZT6QpjFDo3QKbbdCQj97EyFq2TKNv8iI+elDU+KGIcsE1NWzmU8XSjIypLDB1hHARRqmqSbkg54gGnPIvKQPKElLFVjc0RayV7cPSBMUo7q7aRrAxWywZbG0UIQsDPCXQlaJVVCreoCONA1ra4x2uS1gTfgzGlWHfknDAIao0Wrqq1lso5MIpxHLFWUCxteqxyzGYtPlvULNN7zzBK7t3YrzFVw6yKWNeSlBWVnrH4cYMbI35YUy9qxuOe0QfC2DP4DQ8fvL01/qSEVk+bDw1gBJG02G1HSQqqhLHiZbcJmcX+Dvk48alPfJJXv/hF3rn/kOi9eNSFiAYCGZWKGrX4SuUoBf8WatCmzO3lPL7B8cflPF07N5ncB66Vv98C3jr3unvla18z8Sil/ibwNwH2L1/l7BSlJTURryfTP+GSTzYDGZSmms84vPc27d4uJilqnenR+DzilxuMdcyqhjT1/rsNOiuaWgonpYqZpCpBldtWlPAAEiLT1UZgS7W9wKLQ8MVLyChNbR3JVVvDy5yTmByWVpuC4j81weYKZQzazHjhO36Qp5/9CwTvmV+8RO0qafGoc2yifGZQpwAVI6/93q/z4b9ymWY+ZyshpdgolJ+Bc4WCEgXe9OfZzTivoCs/UYrWqVg6dxqlfs2gMkf3Xuf0+IAYxUNG54Gq1WyWgTQortzY4+rNKxwfL2nrlsNHR+zszFnlnsVihqkS7Y4jjbDqPCpAvx6Z7zRYZegOM/vVZZ68+yzPPfN+5vUOP/qjP8zFS5dpZzOMVjhXySD/qo+wjZw5hy4VUFiK0W1x8I0GSObhowPhUSmzDVJmur8ZiBS+WixNcrnf0Y9cn2m0qciXnxTVVIm5MMhklbeIAJistuRfgxZBQGmwqnPtm4wqBN1UHKcjcfBsuoFu07HpOrq+J8QBomfY9Cjj2L/5NKcP3mB9eiC7fWOENJkEwTCFVBpzpqprIfqmMwh9HNPWXDENElmj1JkgIgPznRn7FxoScOP6Pp/91L2vQfW+jY4/0Rx2fv66cfMmKMUwBlCSBVabonIsHnNGF0WUEun0zdtP0lY173z5S9x5+n2YSrZn58ctSMt9TEK21kYy7HKC0Xtp4WZRtyolG79pgpA5c4qmyOispfA3qnjVyf962kGUornve37vY7+NiZHeD3SrjtH7Le80jj2LRQ2DYUwKExMeizWQksNQsfEacsWm85jWMoQeHwSdc9R4A6RMCF6K+KjYhEikp3GjWG14GSNe9dK6C+BzYFSRbghsfMbWNRdnjqaqsJUh6xqD59GQsSpAlPyzxEjWDq2lkDVa47PHIhvt1hiMTdhKsRlWaK1om5YxZIYE/WbAWoWrQSVDrS2mjagBcjaY2hDJzGY1ISlCAO9HIgljW3LsiQR0iDTzGd0QicqhfGZlNQZLitJyrK0hZ9iMAzFVZKMZQyJHGWtZy4LukohXlM7UxmHdZEVjQDlcPXHqgBQZIszaOUp85Ml4dE5YU9FWiradE/PA4BOEDqtn1JUmJ0POnpwTflgRFQw+4KqKHCI2xOJ4X5GCpZ7VoKCuaroxcGl3h1EFdtqGPni60zVKWYau4/TkmKrVrJcbCfN19gxpnebZMiqEUD6pRwvgoo1EY6WIQeH9yLrvuP/gPi+99BlcMxcHq5RIKpJCltacyoSJFC4E1JI3W3wRJv8t0jc1+f0TE8Zzzlmpb1KefeOf+/vA3we4/fTzEq1YBvKU1CLwszrj4ZwjSYPEt1y8cYuxH6iaiugHxn4EbQq/yCDsg8wwjFKc7Owg1HFKm4qzhanA4xN6OLUxQrdBOyfZSzkRvUcZS93UAq1vOUyFS1Q+x9luMpffpbY3n1wyfJRm9/IluHxZCLZ58g/JU8NNEInz1Y0C6yzNfI6rLei89QWakBYJyJx8XKYzyZw5127nzHPfg8k1d7ql5x1kt8WYUkBE+RNaW0Fb04cRp1p27XXe/77nee6Z93HzidtcvnSVP/j0p/l/f/XXuH7jCR6/+yo2J/YWUF+s2d/bYWdvzmuf/xK1DezOW3baliefus37X3yGO088w/ve9wEuXr7CbN5g7bkEze25bB+qc3+n1IDnCr9zxdIZ+fns+2cxNNvLSDcGwlbqzXaRyTmjQrEiyEXFGDzR98y050c/cpujhw955QtHKKPJMWOUI6ZRyIxJyK05J2KRy24zrPKZ0kRpkYZbbUrKu0FrW1zcDVXl0POafbV7pjCN4h0z9D2r1Qmnp0u6zRp9+Ro5errNKTs7c05PVmUiSWeE8JTp1xKQjE445+S5jLE0OrNkXSkEmaUsxsDgI5eu72B0put6bOE/fbsff5w57Pz89cEPfUjCApQqxW3Cx0Twwk+qnZFWZxKeRVaCPF++foO6qXj49pe5fOtJaa8os93MpNJm0FpTWymudM4E4hahmrigE0ckpSgRJ9MclJKQzNNZsT71B8/PTylL2v3ydMnR4SNuzDXjZlXUSxGlKomICh6lkixacWTcQDu3oGak1NENI32Q8xKieCREsWixxkqnIGWcq2mMYfS9PExa0DmyEb9Ga4U6YTRqFHXeMIzC1VEWoxMVYlOw7FZUasZmM4r4JogyUTznShu9HySjMScqK5shU1nGEBlGMKPieD0wRINjYL3p8UkW5sZWhOjpfUGbHaw2AzElqsqRiTgg9RtGZUFX7Cwc3WZEN47G1Ni4RCmLM5YQPNr2GJ3oh47KKsYxUllNUzustcTRyzqQNU3lGE1CaQchofBgDCqpQmNK6KTLuiYIi08QvSDfuVrQVJrBjxhbYVRFNhZDpHJJhE8pYEGU3kpTW0XjakKM9ApOu44xOlKE2lkqo6h0ImlpF8YMwQTSCNktMHVNf3LC/fs9N/cXVHXFcr0EbWlnF6itpe88Pif6zQljCNTWyTNcxti2HlATKKWLiejZ9yeX85wijw4O+O3f/m2+8MXXme/scvjwIdQ1la1kCQ6RrM5a7ORpzj3boKapTViQrW+2+fvjFk8PJihbKXUDeFi+/jbwxLnX3S5f+5bH1uLqPQWSVJ0CUadSfKgzR6UMjbFscmDY9GQ/iiJET0WXfPIQAuPQs9jZYQrR3Rq7lSVhaqNMAcXCGVCYBD4r/BhxdS0IQtMwZe9Mq6yiUD9L4DBq6p2KVHiba5S2P7ItiibeCQg1Sag1anvjpsy6Qk94D5dkcledogVykvMWVUrBWKZ20gQbTcWH2lZP26v93q8VlRVTsaK2rQWN4/67r2Dtmn/3R/59nn7qGS5evgrAutsQw8Dx0Qknp0v+4A8/g0KxPh34S3/xe7h27QoXr1xib3+P3Z0FKQTuvX6Pp597mrt37nD1+lWatsaYifMgGIwqVfTkhA7vLX6+2XG+WPpGPJz3SlelFfPo+FTc0rck3fJfGXSZiIoBogc/cK2Fv/6DL9Itj3jj1SNiDDjt0Frx9lde5/XXXhWlTjELnNDECROTWyDXOqsJPVCgJJsLZDE1VlyVtTVUNlHNWmbzGfPFgtlsl7adMZ837O7d5NYthYqB1eqUx5cv8/JLn+D4cCnTlCpuwhMZVEHdWEIIxKTR2vDE3Yu8+/YhQx8IYTpViQIR2pPCWU3lNP2QmNWGd+8dozHfzsjTn94cps7gfpAxHpLw5DSivE2xOIFvi35Ra+5cuIyrKx688zb7V67j6hpB9VQxbFWC/Nj6DC01Wha6CfObntuy4cz5bAGSCWaafyYSQZlEtNpuFJWCHCXyJ/lATiOb3uCHDT4mUt4QbYWpRJKeVSCl4kwdI1mPxGTRKuJUgCTFhsqR2hqstlR1WcSUEKitVSzaXXo/YJQs4spoXHG5JotMXmmLrjMuGIYS8Fs5QGtizgxj4NHpKWBorGZWST6lL5tdlzM5eYx1KDJWgbNKlIzW0Q2jFD8orLKk4Fl3A95LWzLUAaWiCCmUolsHXPJYlck+iQdSFERGuQrrFK2LUI2MPtDnHSpdM28bUoa6rSAGGpsxYWTTK7RtmLuEzbl0YBsaK2hjKkV3SpkxCTKsc6RqHDmLSlBjSEr4XTmIK3dUFUlFbOjwqSJnsZIwesAoA6bF2gofxc7Gj2JlkqNn8CtOskE7i7GGmBwQCD6xWQ/M6pq2dlRO48NI2zqM0YxJkfOASSO7i5qTwzXV9QukGNlpHcsxAVHoGU6JKAjw/UDdCP1E1r8zU9bJw3Fa/KZ9/EQxiSHy8OEDPv6JT/D5L7zKMEb6caS9sM/q8Ih12mDbOakQwlVxxBe/p0JRUGWjwdmYiPl8JfK1xx+3ePq/gJ8D/m7585+c+/rfUkr9I4RkefKt+E7ToZXa+t1mlZhA7OkinU0V08cpZlYkTHlw5zsLKSSQ65yAGD0H797jyvXbIt3dksPPt6A0OXoevvMmD+/f4+TwIVpZrKsgZ5p5g64ralfTNDNmu/u0sx2qZrZdUKdd4TmqtdgDwJafMCEKaTLaLCehgaTS9qym1xs10bfP3jWXwkyVNp3Wunwu8R0qc2X5dKLsk8o9Tx+2TExyHU35Xj53Pd6DQpXrcxaMKec2LN/AD29y69YTPPv8+zk9PWHz1luMw4A2srB7Hxh94ODRAVcuXuQ//bn/iP0LF9ld7LC7s2B3d0FVOfFv+dHpV6v3+FTlrRVgLuf+nrv3nuPMAftr0aSvLrK23KdtIZW3F2ByufI+8M7DR2QulZpSxAFaaE5A4a0l8Wu6vd/w8z/2IpVK3FufUlVWiiscKMXR48fokJkpM22woXiBieWdLJqytomMewq4VJMztZoWSUVWEtHh10uWy8csa4VRLZ4dyAatBuaLOfv7O1zY32PvwkWefvYum80xL3/us1uU0RTDsIkseeP2JR6+e0TXDVibefDuCddu7LNZ9zx894ScFdpo9vZ2ODpcCkextP/6daCupOiazR2Hh19zm75djj/VOUwX751ph2y0bPQml37UmTpoUsWpLPEVVb3g5q1b3H/7XfavXKVpZ9sxbIym0RUoWSSVUrgyr6R85tWlzmWiwYREFXuM7XMl84mZLJvLqeVy/klFTk+PQQUUiX7Tk5IiZlnMlBUbBaMSumTtaaMZYib0I8YaaueorcGoSEigs8U0FQqx5ugHT5Q0c0YP2XhyjHgU1ipmzpB8IAaxl0khojUSXUSi1pY+SFaatRGqGq2lkNdZI8C0yPtjURInbZktHJWpsJUlRC+WDcVjCWdoa7FM0CRCtIRxJEThYxqrMVULvidEze7+PnlcoaK0zbVKJdXB0vkNmwF6ram0qGq1S2TnWAbPvG7Ym1vikMgxMasqWu2JqaepKlRKjEOPqRxkRUyBlMDHzBAjKmX6TryghOzvyCaJfxyaSCW2JNmhbeFmKouqNb7zOFeRVMDiicNATyhk9pFxWJWnDkxuiHQQDdZVpFT8+lpDrhegwRpNCh0mJiwBq2SzMBrN7v4um3cHdhY1KUX6MKJSwCmFDh11ZTFWs+48xJFus2G2Mz/bgJynVOTSh1Fnyi1VzJ99DDx+fMDv//7HefWLr7Nei7Fw1JCGQDNfsFkeszo8ws1nqFgECcDUBkqxrL9lw5NSMawta+A3Ov4oVgX/G0KsvKyUugf8N2XC+T+UUr8AfAX4mfLyX0Ykvl9EZL4//63eX34HZwhHwYHOzBflU+SpUZ+3OIQ4p/YDrXPYtqbfdLR1vd1lKWDoeq5efwLtzLZllsnosnAkBX7sOXz4LhcvX6eazbBZsTx8zN2nXqBqRVq5XJ3w9uuvsnx8wJ1nX0DXjt0rV7h+686W+Z/VpH45t8grJfLzqSgple1UEJXysDhyl8IhZ5ISo7TpFaagLjGzDblMCNnPKiWO12HAmIZcXjf15XKZvLdFVS5TZpZw44mYTiGeCkciULuaRaPIY8/nXn0F7WrJHmTgwZc/jg89t+4+x9HRMTlKjllWMJvPqKuG/b099vYv8Jd/4C9z9fp1Ll7a307cMZd+fLmX025CT6jcBMSofAbRfQ1SdlYcyel/fZjjfKvu/NemY4qZmHbmco8Eidn4gHJSCMcykKfCUxyTQcXEU9cW/Bc//iEao1gul9SVY2dWYRHDQ6sUi/kOq8cHzE2FaSvavT02x0vGvsfnzKZEK0gRIxCyyiW7kW1aIe8xbdUa6yp86LGVobYKmxsSLdGfsl4tOT1Z8vJn/oBm1vDM+17g2eee5PDoLcn5KmjjetkTfGLoI29++SFVLZNYSpnZXOD65XG/VaaaIitf7NYYrVmebug3AwcPjiBfxBnL0eEpX6/I/fM+/lzmMESgopAYFUzZPGXhuk3PdEjgjGLCU2OWNoKuWq7fvMXrb7zOnbtP0zRtESXkrTO0KWiUTCZi5jY917KnUtton22VXY6pYJPhL8o7jdrOJShF1orNZo3BkKJHkUW1ZTR+HBm8tDskbiRTkQjAGBTOgMoGH4Rk7KMnZ/EY6k4VprIoowkpooxC54QyUnAMoUxJPjBGiu1GJAfZuCnrcG2NI9P3EYjEIaCCZhM7vM/4FNFo4gg7izkpBKpKF3NlXVIdMjEMhJCxFVRO1GtrX0jZlYJs8MljiKCgG3vSMDJrJQnCh8xag8liVGuyYkhncSaq3K+QDZWp0HnAxA00V3BGY1JgOD0lYoghoY1hMa+I44hSgaQ0lYPeh4J0GcYoKrOUoTIKjYGoSCoUc1KIMeCjpnLi5WVUwGrH4CE7sBiqYhyck0UbQ8iBPmvqHMlBnt/KVQWJCUQvAb3JZBQOZTTaVaVxoUkkXN3SWMtssUCnjGtbxmEgjmuauqbd36GthQvm/Yjxa/zoCU1LqyNj9mIns9lIp2ii0kxt52nORSxScinks5L1//GDh3zs4x/nC6+9hh8kbsXHIBl7WQpPVc9R4ZTjh49p9/dwxYA0IUHrGLGeEeFF3q6/oP5kVgU55//4G3zrR77OazPwX36r9/w6Pye8j69qp+QCLU9EMTXtuLNk86RxZN7WMpEjrrHD0NM2LSlDt17R1LLbmCwHVEFe5N6oLRH8+s07ZA17tWP+HXt0p6fE0PH6a5/i6tXb7O7scfuHfxJlDFXVkgkcPXjE5nTJYn+faRs3IQdn3BmJDphaZbkUP5NEMk8oD1NRBxTDu7e/8ClCbrn9/PuRwknk6mK0GNE5CgKlE6ujT9OtloQxcPHW9wJWDMO+5moXWez0VCiZYKxSxa1Xc7U1PH2p4onrl1mvT/k7/+1/z+PHh4IoWcfe3j5V5biwuMn7nv0g83nL5YuXuHj5Mru7e+zu7VFVFZUxIrHe4kdlIKh0JsMvJqCCkpXdeqmTUOcKq3zeWuDsU329gunrteW+HiqVC7IGipASIUX63nO86ThZdbx9/4BVVKhq4qoJXyOXnngq7brnb+/xCz/+YRYO+r5Da6irisW8LXw9KVDnOzuCKGrD7t4+YwhcvHWNozffEUVLFiO9tnYolemGRNZKyORaba0CzsaJLvl4DhslsyzGAecGfG7AOPxwQFMv6KyEXn/5C6/x3FNPcuX6Qu5HghAzq9Me66RN1PWBnDLWasYhEGeZbtPTdSNkLa2oEOg2G57/4E3GIbFadsSYMEbz6MFjZm2D+Ap9453bn9fxZz6HZcg5iWKpBK8KyfXcpkCB1rbwKSIxawIRpzVm2nQ1LXeevMvrr77KM+9/P7PZXIqVEv6LLbtySkGVCgKtzraduRRUWnGWYZgn8EteJ0hzZrIXAcTNPosjs0SoWbTLOGvoevH0cVmctEevqQ1F6ZRpK01TKZRJ5KTpR4hJF/WWptIa68oGzUzbCUGsDBHTOPwQRTlaojKIgVZrjLEQIsOmQ2lDt+kxORf0KQsaoTXG6mmb3Y4bAAAAIABJREFUSRc1bbugahqs1SQ/4seBfvAkMiFEqqjIFjI9MVUc9IqLO5bOj6xWIyF6ciyZdNqQskZpi0oDeVgKUlzI6JtBkK6qtjhnqKwWxE5J0VFbg43HaGWJKaJ1hCwh4eOQWW5k3LlKYxTUVrEZBDe0FkDm3Uolcugl/FhZsk0oqmKcG6mMoXEZZ6XtktBop7DWkLShUojfUYpUBJwSN/RW14LGuQqdFSGBMpakLWPfc9wv6brEtZs3id2ATYGcDUpFbJLnZbXxGNcwG6GuNE5HLuzM2BwfEs0OKVrmiwWnhz3WKXIYWaeEqebkAEPXcY7czHssW8ozn+Jk3SNcpcOjx3zsd3+Pl1/9PH7wpJwZY2AMfpuYlnIiJ4Wt5uzuZ04OD1js7kNtz3W28oQlSLejKFZNUn8mars/1UMphbW2XKwzFCHlJPyPJLuAVBApP46oDLapAMmQIonEUzczxnEkRk/tHLaWPjNwFm+QpMdJKcaqRvKE/DBirWY2m+GHgSs3b/DyH/4uz/zgT5CMeJRQoPiMYv/q1XM8GbU9d5hQtOl5KJ+ltIZyuanlBwUpIovkPU2mSopxsyYau4UsjSrqGC3ho9nAyeNXsYsnuPfG7/H4nXfReYZyt7l04ylU8VzJW1fwREoKa2BmNXObePj4MY9OVgKXWs3F+Yyf/Le+izfeeIOdxhK8QRvLtWu3uH71KnfvPsmHPvAiTz/9FLfu3OTK5cu42omXlcqS51SKn1SK960ofqqXtu1A+ZxTZXym61NlgpU+oaAjJbAiF1+paZBNiFJpS26ZaHm6K4UoW+7B4APrYeR0teHR6ZpHxyseLTvuHy856gaWnWcTMqGYYB5tElU7FX7lGhLJKUIMfPczV/jZH/kQlTPEsQc02lhs5dhZzHFaix+bgnY+3xbAq0dH2LaiunJJFlpKUQLs7LU8cfMCx8cbHh6s6HohCBsjhe6UVyfkAIOiwuoaSISYse4UaxxBNYhTylCIrUJQ7b2nrXd4+PgBZDDKMps37OzXnBx37F1uCT6zPN6wuzsnhJHTTdzybYwV9HCxNyP4jK0M+xdmDGNksxmkQDSjpNf/6UwR3/ZHRha+sm3e5ttpCdIkapn2J9q2Kq7eU37kxJGsZ3Oeef/zfOHll3nuhRelANC6UBrKLFN4GqaMbzjbrOWcSptDb8dbiLHYYsh901qeNnJEUjwK6Txljo9PICUhA5Po1rKbnztBi0mZRgs3KURRbtna4KqK6BMp9BAsEUfMgbHXJJNp1IxoMl3IBaX26KywWUKsrTNkq7eZbjElKqvEQsAkujHgQxak3Spi1liTiMliDCS3zxNPf4DnX/wwV2/cYT5vS8SWIsfIOHScHBzy1huf5ytffIXTgzfROaOpGEIkoDlYSuBu1g5tFC4m8ujRSnydcoo0NtHUtRgUYwhZUbsWVwWy0mStyUXtFGJi3jicDmDE52leSbRJHRO1Vax6GVMxRBa1xnvPMAovQBW5v8qyWbOVJSqNMYmsAlpVWF1it5SjdYbKGppKEZQmxESIBk1CxQHnDNYvhYSvhOWltWIsG1lXpJxWw3ocSNnhtWXwGRU2HL99n6NZzW6tcGpFXbWYukYsCae27IqUdqC1WD1SNYq4OcFHR9cdsVoPXNmxNO0uOgU2g8fYlq5bbwOClVbbmTvnjNZiBMo5ovfx8SEf//jHeemVl9l0vvjmiV2MLu3pGMNWzEMGZWfsXTacPDyk3t2jmdVl757Eu08XD7ucz61d3/j4tiieQHZmqSyswBYxU2iUMSRK+GI3Yq0pcntVrAESr7/8KXQy5EZz+vgRi90LVG3DrN1h/9IVkWYX1+40ITxIYREGXzKd4NE7b1LXc7SyHD1+G6cqlt0pxhb71W17R46vRT7Olv8zAEQV1/NzjaFy3lP7zqCJOgnsbw1Wa1xdobMtv1GSoVVKxAz95jH98pSvvP6bPDqoWMwN3SrQrTq63/stfuijt6gdNFXDvXfucfnyFR4dHrKoDR+5e5mbNy5z+PiA737mOf7Of/eLnJyuSSFy/dpl9I98J88/9yzz+YJrN27zi3/v73Hp8mUuXryAqxxW61J8qu0EvS0iz+bscrkmblch0+uJ+F2MJ2Up2dpATMWm+M9MD++0ry5FVJbrtP2dRWkYs0hQx9Gz6nsOVxuOlhveOTzhYNnx+LTjZDNwMoz0MZNzkf+qor8sC19WGqwShMnIwFVZ/q2yhI46Ej/2kaf46Pc+V8j9xbdGK7QB50yJK3GMo/QlmqZGmTOjyf07tzh959E220zMSBNaib/Thf2Gvf05Bwcb3n10Ki3dEgEifDdAF75K2qLbBO9R+hjX3sRYIXCSE9FLS3a1XrNZaeJoePzwhLatOD5es1n3XL0q3KZuCBhrSQSMk0Vublsgc+nKLqfHHfN5zeq0p24aQogl7Bj5zEPCjxHjvgnu/W/KoYq/1jTZlmGhBYwiqolzWJSUWVryruQ/hiTRP0prYkxUzZz3feBFXnnpczz93HO0O7tYMkYbQpKsOKtNQexTsbhIhYzNNuJi2lVvEadp8dGlWa6Kl1iSgN0YIqvTUzQRNNRtzUm3pALQEPqAHyNaj7QYXF2RooR89yFijCZGQZtjUpz0huNeDH8v7FoOlivaOnOhraltxcQHm4j0uRQJOULWFp81PnrGkEFXVLWYN/beM+SMj5oLF+/yPT/0V3juAx+mHwJffuM1PvY7v87xyRFDLxFBRmvqtuXqlWs8eecZPvy9P8Tm5DGf+K1/zv03XsWQ0M4xBEWKxTU9Z0KUTL3GUtBy0GicrQsya4m9R2kYQ8aZzDBEUlTk7JjPFdYptKmwQFU5mloLFqAiZE1tAyhLu9sQiaikaawi2ljEUYYQIKfEMPbM6gqtHcbA6DNGIWNcjego2X3JLCBnujQVzpraZIbBM7ManSR43GgreYDali6vwziNyZFKZaqsqcks5jV9BWOSCDSloDIWpw2VEdFA1tBt1vTKUFVrRiy2mbM5PGRWOU5ChWIg+w5f7zBPCWVn+NMTQuzolqdnc3BZFUTVLC7gMs7kOTk9PeFTn/4Mn3vlC4xjJKQgCSNl/k4IlzBOk2JMoqKPmYhm98oljo4eE+KcxbyVcavTthujlDxnWaUt8PL1jm+b4knoX3q7eErhIR8mhJHl0THaWgkJRloZKUXGmGgax7Mf/C4UmZOTQy4sLrJz5RoP3/oKu/uXsK6S1pES6wKNLMDee8ZNh3MOV9Wg5AK2ix1igoPHX+aJp16gbRfbs2Sr4jsHKxbC9VQZxwKBT3C+gCCJMzmMfN6pytAUy/nC+8tREu1iiGQjvB+jDbayHD7+NMa2XLiwz87eDqS3GfuOtW/Yn13mI+/7IM89/yK3bs4Jw5KHj9/iM//8/2Z/f4+D4yNUhuf+k5/m1o3L7MxbFrMF+3v79F3PR/+9j/JTP/FjPPvCszjrtq7jV67dYEJ6pmMqdr62NC/hyHl7+85W9S0qe6ZhyOeuiYL3+E9NhWZpSAgPKEnQbjcOrLqBw5MVD5cdj46XHJxuuH+65rQPrAfPmJIYmpbW5GRRkZQV0eX0/qUQz0oMUKXYUyUVvaBcJV5FRc+tvZq//oMv8sKdq4hjfNzu/LfxD9Yxn81oGstqkKT12jqsc4SUqOYVyVjm168R3pKQX0rb9/HjQ9bLU27cuszOzowrV2ZsuoHjzYguj9G0QEsbVBZp7yOjjySnyQzM24TCkuKA0QaPLE4nx0t2d/Z48PAtLlxsOT3pySliXc3OBU2ImiEARrOz07Bc9TQzS9s6Vsue1bIDshBSQ6TreozT5FEK0WEcISfqqqZfDn+0CeBf40PcmHUZuxGVQFvhl0x+NbZkB0qxO908eZ6NFp5USsXNPUPdzvjgd3yQT3/yD3n6+RfY3d+X0NyywYzTyCivnzZrEzp1vucxte6EKZDxKYjtBZJusM1YVMJ5CqknUzGsN6SgGUlk7UXFXGlJNGgatNGMcWTW1IQwknFoK8/hSd9z2Cm6oLnQGBptqI3h0sxyZc+gcdK+TImxFJTOOGytGIaITZoYPD5GokriFB4UYBmComr3+YEf/im+83t/kAf37/PPfuVXefOtr9BvOnKOZV7SWyQOlXjn3pt85jMfZ2d+geeefZ7v+4n/kJNH7/Cv/p//k9X6hEpFuoJSjDESMltysTNicDoEw7ju0Si0kkBiXxDvYZR23BhlrtrB4EcR8hiVCb0GtYNSimGAWVuhvRdukEmsQqaqgARDL6HAdesYQyAbS1VprFGEmEA5nC3WFMZI+z1pNquA1iODbsm6gXQixa0G2+ygtKcyIhRyzqBipEsJrMIQRZiCojLSAp45Q84Dfi5ooLJVUUsGTF0zZo21NUoJ2V/pRKO18I3iClPX+ByxLgItKOjHjuXaU+/tU80Sbn6R9elp4TxN8G1RwWVp1+mCtq/Xa1767Of47Esv04+9FEglz06Vcx6HQRTEyIY6K4gpMtFnc8zMdi/QL084XG3YuXyxbOjZtvtUMT3+tkee5DkvcR+l35NUFl5TCOSs2L1wEePcWcutTAS1Ah88Y9ejtWX/wlW4qMg5cuPOk+hKdjjqXAso+JHl6SlN0zJfLJj8UZytuPHks4Q0EkfP4f13ef+HfqAgK2KImTOk4MXksJDMRPmSzn2aCXtRZ5NakV4qNX3dlPc9uw4ZhZsKR6UkEbwx1NZCFvVJ371F6N/m8VsLErBoak6O1lQ7A9//kR/jydtPMgbPyeN3SCnx2udfEzUb8MyTT/LEjdvcvXOX4AM3bz/BnTtPcefpp3j0+BHf933fw4sfekF2qmUizpMycEIE87bLdnbvkPM994/3iBSmSJisp8ba2bXa9p3PXYuYM6MPdKNnuek5OF1xtNrw9tGSg2XH0WrDUT+y8hEf0ntaH1IICaqktJF7o6fzUVuUairKcnmOZJGbcLDJjkDMCYkBUmLHZn7kO57hr/6Fp5hVZhuoOV0HsdUQlNEZw6ytWbQ1j483W6fcumlYLzvG0yWnL39eyLnnkDvhrWi6buTk6ITFbA4qspjXHC57QpFvTn6d4gkkyh3QRI9wKtQUWm1KGnvGWEVKmuPDI64+9yxVY6krQ9M4zO1dHj045eTEc+HSgpw1y+UaPw5bxejp8RrvxQw1RYlJqFvLu++sCCHhjORojT4wmzV88MNX+N2PvflHmQL+9T+UxpDJxkpxNKHoSp4/ya4rL5U7RlTg1MRlUxITUnYRRoFtZnznd30Xn3vpszz51LMs9va3e5icc1F6nfGqtsq7YiKsUCJWga0BK7kodJWodEMIguSWArzv1jgdCSGh64Zx05GzwocayBIWmzWxT/Q2CrqmNU3doo041Dt6blxYcG0/0/tA5zMNp7z/Zitu1iVTLhtpaVPIx0pDSJkuW1TINNairEbnSO0aYoxo47hx/Q4/9tM/x2Jvl9/8jV/npc9+mq7ryHqS11i2I1xNqkctpsNJcXx6zCc+9fu88sXP8b3f/f389C/8V/zTf/yPeOvLrzEkj7Fi8lglUaK2lZC2lZZxrcmQY3Fk97JkRbGeMOVzaGDTRzEP1Y4pUcKvNgw+ERLU67UEAs926VzCqoy2EFUiq4FZs0NSkaYR2xSdJTIkjZ7Re5wRS4y+ixhrCElBTgxdwrmeMRmMqiR/03usHiRQWXkql9mZzxnGTBxGsrI4ownBY52VkGBlyQpCFDQ9a0vIPQFDZWtyEksKlKNyDbaCEDVJW1w1pzIeYzPW1ixMxZAtYbVif3ef3q8ISym2Z23D+uRAYI08IaFnQ2uy41mv13zms5/h9z/5hxwv1/gQClJZuKjlP6slASEx+TVNYIdsIiKKGBJ1u8Oglxy/+5DdS7soZ0HZbbswqSSRXN/g+LYonia2SiaK02qIwiHQmqoSx1JSJGUPgM6alAN+HFkvT2mblqZtAZHsJxVJ4yg8njhSLh0pBsIYQSV2dnZK3yNukS4fRhSZcRwgRsJqQ91YYhCVkR977t/7Eofv3OfF7/5+XLuQXCKVMcV5ZTqm5l4+N9ltSePlQ5/HVSjeExOqpTE4J3CqMrBe3SMmjTWWg6MD5pUjBk9SkcWegXHBlSvX8EVCvLe3z2K+4Nq12/zs3/hZbt++xd7+Hk3T8PlXPsPBwWOscQI5Dz2KzP7e/nuQpLOy4NyxrZEmz6evvZlp2v1OKNsZzATI3BlLOO6mGznpBx6drnh8uubgeMPBuudg1bEeQploMqHsIDJs7yelpTv9osnHaosMlolz2nkr8pmKL0+6OrbGhZMxhDjci0t4AuY68Zeeuc6P/8VnubbfoJKY7Z37iOcujrh3S86cZbGYodVRGdaanb193jw6QmuLihPnZTpPaQvEHGhbxXw+Z7VeY7Sh73rSOBK15D5lbcjFMFAbhcLhoyTcxwjGImMpW1IQlFaQDc3y5Fh8tLTh+pMz9mYNy7Vn/+KMxw9XnBytxWE8ZtZrEXIYq6XdVKIttBFVz8MHK1ana3b3Z0wt6NvPLGh2FbYVsua/6cd2FJexkQpSqVTJDQO0mkxWinVGeSazZlvAlz9QORPLFthVDR/44Id4+aWXuP3kXWa7++IIr8XIUBabVAJbz8jqAnSfhZ7Gwhs1Wm1bvzElQRO2K1Wm7wZ0jMQYWY8SkdLUikoL8pCyxPuoGKmUgZzwvUdbTRw2QqqWioimjjhjmbnIrK2YNZbNMKCUQSFCGus02khUyKLSbEbFYGIhSntc0ui6QSlYVIordz7AX/2Z/5z1csW/+JV/xhdeexU/Sii8SsKZyZxtdNU0QMtGAxAvzmhYnW74jd/4Dd599z4/9R/8Df7FL/8T3nj1JfZmgnaQFZt+ZDV4alexO6+IUQrCrAxhjNTOEhGnfpsVRkGjxBvQWoraMgMVyiT6ITMqhUqBbBTrAUJYoXdqXGvQ2YDW7O615OAZ+57KOFEmq1BCuVUJ9BVPqIwijAFtMion1qcjrm6o6jk+r4khUzcVlavYjOJ8HkJkCEusrcna/n/kvVmMLdt53/dbU1XtvXv3eOZ7zp1HUiI1XNEmJUWyKWqyjCSKIcswECAOZAQQAj8HSZzkIclDHozAsRFDMeQ4TmQ7gawBpCZKMkmRlkhxvrzzeOahT3fv7j1U1Zry8K3afS5FxgiQhxuqXvrefarP3mdX1Vrf9//+AylAyAEwRPGmIOcASigkPkdQmdpYog9EeiprUCmCEo6YzmBSRNsEaU4GDAFCT4wt3oNPNbO2x+VI29+mHm+jrGG5OilZmak8N2rdYucsVIOXXnyRP/7il7l/fFzCywM5FL4VEqcSUyyGvqwRVfmhwEAOudB3ELWxmzLZ7rh75y5bu2cYNQhvrYAcQ2bptzreG8VTTvTtCqXE/G/UjFAUH5wsuUE3336Ve7f3ee57nierzPL4hLoes72zK6OtCEmVh0ZBDIFq7EgxsVotyDFgq4q6kbFfKl0YaNaZbmX1M17T+gWbW+dwtcMkA2jquuHxZ7+XJ56hZCUlyIa1S1Kpik4J2qeeVPJDzjvFptbuTeX3h1dBqcBzj11Gp8wf/OavsFgu6dv7bG7tYNQGPgUa7ZjqK1w4f5bnnvggH/nwD7O7u83GdMp4MlmHlA5H4bpz7cYNtAqYAnPG4LFas729RfnKGT7WuggcVDlrdc4A/r375io4lSzYMdL2npOu5Xjecv94wb3jBbcPTziYr5itPIs+0iVhVOcy8x4+clLIyM2UcUR5z8F8FIqaonzFsnAOaqNhkyoM9mFKui7CMiprIgMhE1KKkAI6RhSJennCjz57kZ/5we/n8plC9i4jVQZ4d+j88wOycS2Fk3OWzY0RleiksSrz5JNP0a5W9F2HMQrjHNZV1NaJDN2In5Y1FqMFrQwJJtOKh0dTBuw5FTi7D0Hm+2FDohRsS06Bvo1kNSPHSEqBGMp3phTL+RIyzGdiFxF84mh/wXwZuH93zmTkmEwb4HRDTlGyD60rafQorl+9t/YPCyHz/T90gZu3jnj42QmTLcXibkJ/+1zN75hD+CKDlDev0xHg9PmI5VlSxS1XI1DPsEGkKKNf54zc/8VxHgDjeP8HPsArL77IuZzZ3t5d3/8yhi6bTRbWaxwsDIrvxyCeWHM6ynvGJOG41rk1st51S1KI9H1H6hMqaWx2JB8hR4x1jCpNbRIbVUXOYT1KT1GxnK/WyKOraqwTj6dVl+mCZzIekUIkIcaZ5IizGp0trfe0PgCxpDsgyJOSYnJ67kl+8ud/gcV8yVe+/EWuXbuK7ySNQUQcQnVYnsyYH81oF0vJeMsKZx2jjTGbe3s0G2O0NWit8b7jpVdewvuen/orP8vHVyfcufEaVhlOFhIN42xitYrgWyZbNWGVsMbQNEJ21ygmo4plKxxJiOioUNrgPcRexqwhyLqyM3X4PqFTAp3ZnG6htGHR9oxdJiTxKgohMxk3GKWIUaF1TRcCXUgYk0lJlRw+gxsbut7TBUXMHqIoLp12qNjTqERaHaF1oo1AbSH3VAmqUcMqSTxTNaqorKFPCZ+VZHemDMYQA3RZYYwleouyjmwzvdekLDY5pnK4FKktdMtlQfAjMfZU1YigA6pXUFtytvR9ZNUu6OZiBWGdWHGs+XnAarnk5Zdf5nNf+FMOD45IIQiCFIYCMhQLlaGZEOrM0B1neUgkR7EYG5NBaYE8MGPOXqg4uHOHvLklflA5QyxI8Lc53hPFU/Seo3u3iTHy5ksvsL17jq1zZzi4e4fNrW02z57BViMuXrlC362oqobp7hYqF/JtKmo2Zeg62Rh0pWmXC9CKcVOjrPCWVNHciR9HLN10Yfev64zM/u2rnL10CfIQGxDWsJ+gWANIyCn0MPCcFKeFUD4tlk41wzyAPMnYb1wZFifH3L57D6UUH372Ebb3LvLOjVtcf/kV6tGEi+cu8swTT/PEY4/y1FOP89BDD3H23B6jyZjKufU4c9jQH1T0DXhQiIkXXnyRz37ms/zif/KLbO+dZdUKT6Bu6tORXC4LfemEpSh9wFMJIZuGlPA+cLxsmS1b9mdz7s6W7J8sOJyvOFp5ln2kDYk+RyTFu5CeywaitF0XTRmKskjJSCqVQqecoEiiYGIA8rR01QU9AoFw01CQFt+qlCIqxuKLEqnJTKxmszbsTUdsTUacmWxwdneLyahiazpldjxjulmxt71xmrVUNsj1/PyB4lFqE0EFKNEpTe1IObCaLZmFni549s6fJUZPDIG+7/FesulSjPLw5/RARIB826pAkEqDUUZsI7SRBcBqJuMxVb2DqWrqyhU7DOi7ntXyhOPZjOPjGV3b4WPPqmvZ3pmyMWo43l9wcrhCK3jk4og2gI9SvE5Gln7pmW5MOXfmAhuTDY4OZizbBSeLBfPFCmM1excaomrZvdTQd5Z4K3JwT6wLvvMPueZrfhPFkb7cz0PYkgZU6Xp1VhjAl7ULMrWzgnAHKSgSIjROWcawz7zv/bzx6ivoDDt7Z9aE7zVRNid5FpDX12zX8rzl0jxlfepZJkHCBRXLgkJrq1E6Y1RGpwi9KF0ra7BK1omUIsbJeLzvI75PtAH6lLFZEzqPtxlNJKuapA0+aaoItbUoY8hoqmpMF6QwgzHGelTKKBXFm88LD2yydY6f/hu/AEpz9erbHM4O8L4jpZ6YNL5dsn/jOvdu3GJ5vCT6UPimao14K6VQRlNNJ5y/fJGLV65QjcZoMq+/8Rqf/uyn+di/+9f5p//o73Hv6IjeCyI80RU5RmI2+AWSNdcLd6cymc2RWGRWztD2Aa+RcXkMRG0JORGDFKtbI8vmyLEMLUkpKhOJ3ZLxRkMbNcpp/KIIQywoPKsefFRsTBsqZWmccButsfTeSxRQl6hdJS7jWhpJFXuUVtROrqVVglL2WYq7Ud0wj2AWQRS0KdCvlgRnaapKol+SiEasqYhkagSRamrwSWGNghTxPQTnGWnocpR1N3iiamSUaw0Rw6ipUMmT+pa6GjIBJ8zvHUGOEkEz0GMy9F3HG6+/zhf+5Avs3z0iKFHQ5SheTHl9brGO0Wo9+j5tQOReD2lI3RBD1ZwzWQsHOmXN9oWLtMcHhKNAszkRVXPi2x7vieLJVTVnLzyEMjDd3mLSTAgqMh2PmR0fcufV19i7fJmt3TOgNJFM6sPaYVscZcXs6rWvfJHpdJPNvT1Ucbq+fu06mzu7zI9nnD1/gcnOLtF72vmchEjItROCtEGRk+fo5k0e/cj70cqIoVZZoNbY0QNFhPzHcMFOi4A1PI9en59ygdKVoGVoxdjPeGJvg1Xl+MT/8QlG9YiPPvsf8fCjj/P4k8/y/uc+yJUrV9jd22I8HjNQfIYCjVIIDqqaB/Cfgh6pclrG94F79w945eVX6duOru/pvUdrJTlpKZGKW/IQ8xBjYtH1zFctR/OOe8cLDuYL7h0tOFx6ZquWlff4AiEP/kkDUh6RBZtUVHpwyu0Qq771OE1eLsTY9GABKv8WDYRC+E8pkaJYBhCFM1CpJDYMtWPDKM5OR2xOGvYmY7amY7amEzanU6qqomkqXGXRSkOJPillmVyjawB9UYGWocsaHUynVz/Lv3OIR7t/cMjXvvYNPvWpz/KlL7/A/fszei+F+prYVciR3+xJNYzGhousBjdoOD1fSXdmyudWeFKYC7G0oF/OGerRNtY6KpvY2t5m78wZqrrG+56mbnj88UfYmmR2x5ZHHwKVHed2auY9EvScErs7DZOR4dlnv4vN0RRXOxKGL/2bV/itz32Gcw9dZjFv2djN9LHj0t4Vtqdb3Lh+B3/nBqG/8/9uMfj/6aEQn7T1/Vr4R0OhLRYVRvyUFAwRJTGnQtA1GCjZbfL95zJ3EmWpcDWeeOY5Xn3xBXKO7JU4JEE0hIg+eC/5YhBYQhVIZAmkLmM+KGuRkjG10YZEIMWMNRUbVrGMS3oFJouqiywa5s1eAAAgAElEQVS+TdZGlqtI22usyfhOrDScFUQm6iDmsVahoifrTBcd2Rj63uJGhhQV5x7/AD/5sz/PcrHkzs2bXHv7DW5ff4ducUDslzhtCAS0dnzox/49tvfOcePaVRbLOWRYtT0+JI5u3eLqa6+yODomRdk8c2m6UOk0looEKRIOjnl7dsLtqzd47Lln2bt4DlzNN77+VZ544kme/8hf4hO/8at0KaJzYpETmBoVW+ZhSehSGWdBjpmFKe+nFG1R5GUyTTNi4RO+DWQlileTMgRFYxN9H/DAPLQcLjNVVdEVhE+TqHSFj9LYW1ORYmTcVDhT4UNFGwKVcdjkydmibWZaQQyGpMu42FhiSFhT/MQiVDYwbmqqusJmSxuhqkTBa6ymqhxtEGNOjUQLtatWRpRJkHdXVzQK6vEIlTKrPuNzJiQleZghkHQlys3iD5iQIk4ZS9vNcdFgmhHndh/m9ju38F2gboapTqZvO95++y3++Auf5/r9+8ToQQ1jOBHwhBCE0lGiVVIqflA5kVRCRxGhpZwQxUMxrC5TiRwV2SjIiuwVzcYuy/kBx/f3mW7vIk/ltz7eE8VTioEUe3SEkavJJuN0xc65i2yfv4B5xpQNDKkmVRaYrkCKMSpSkfs+8dz7mWztCEG7zD5H403qkkenjBHPDGupR6M1kpTLA5YN+MWCtJpz+523eey737/m8AzFQGHRlE//TWiSFuhQlTGOU9A4uPb2WwAcHB7jKsf2zg5nz52lX845vHeXi9/9DF958SW+533v57/4u/85u3tbmGKK9+TTf/Y7U0oWRVUWCN71mYaB4BoSWyMky+WCo6MjbNWwtbOF7z0xes6eOcuy9xzd3edw3nJ3tmL/ZMX94wWHq55F61lFgecHJ3SlVHEnV2RsQasEAUpKkI9h9icjtVQQGzHN1OXfMUj0hxHhgJSpJCMnFSK1gUplppVm2lRsNo7cdTx25Qrnd6ZMxw2T8ZjxqKGqHcY6kY+X2iOX67weOz7w7ZS78PS7y4BW+N5TVYX/9M3n57KpEfHBc+3GDf7kT/6Uz/zR53j5pVdpW8/x8UlBJjNQCtI1wimO+Q9+JhCOzOk76XVNvibDFw6XRss9nlkXfuJ2IFWrVuBjh9IjDg/vMl/2tMs5OQWqpubOzRt84APPcGl0llu3DyAHnnj0LI2tuPPW6zz11B6Xzuxx/+CE2b0Tvrz/WearFbfuz4k+s1i0VH3g9ktf46n3Pc2Tlx9Du4bF0nNv/wSfLRcuXaKu6z97834HHlIQlWtToowK3CxjWISPERn85hQxRxGFGEtfZBSyOeU10fn0PhXlWEzw9Pvezze++mVCiOyeO481ZXxUOhaR55sSSAyrrieFSFCnFgeAGGIiHD2lNdknQt+SYk/belSMTMyAbDmylYYstD1OSySJjpnKFeAoCfEbbUhKM+8yaIsy4lDvtCLFnsN5j9YVH33+3+H8+Ssoq3n62fej1E/gvWd2dJ/rb7zG9Tdf5u03XmGytccHv+9DrJZLuq7HWMdqtaRdzLnx+pvcfvMqfRdIafBhK2jEgMQPjU3xUVEqoqJmNZvz8he/zMNPPclDTz4BwGc/+2l+7j/4eT71qT+k27+DIrPsEmMTcbUWSxkEGRrXRqxklMYrWRtV0oQUCGRsqogp4qpA8JHaaSoLbR8wypCVpjIWTU+XBid6GdvWRXBC2U8mjSMlKWyUFgNWZxR98Bjd0AdPzIbeR0xKNAqwFaZYyvTe46wVqgAa33bstwFtK5QyxKCxquQGakOlIouQuDUXZMuliFGRzY0GQyJ1HlMXlD0kxran7Tt01Jhk5M+iJpNwpkHlFpMh9R1KOayp0Xjx2tKWlFqWyyWT7SkgNcG1a1f5kz/5PLf276NSFHuGPpNDIGaIOch4syBLlD03kSCKglAZERCRMjn1a+X1QEURm6dY9msgQT3eQpk5R3fuMN45+22f+fdE8aSNoRmPhfQVRR4ac+Lw4C61bRiNJw8UOIUqXMJas8oyuhgJyjQaN8QBadEWTaZyo8J8UQInQuniT3EaWeeE4Hrm4iWe/9BHuL0/E/6MRlRaw9l5GC9JzAvlgVVlQ5TU+cwuPSMTOJkd8/lP/jaPPvIYZ/b2+J73PcNTTz3JhXNnSRn+2f/6y+zu7nJweMz5c+c5c2YHVRz3TieAD0SI5MTaHK8URmuJsnr3KGkoqmJK+N5z++CQ3geaUc3X78756tFrvP7GDaJ2/Hcf/wJ9CKIsUQpbyIIYdRoZ8wD3KaEkUql0emvRWx4KlNPPFlIiZjGXVEX2n3PCaRhZx4YzTEcV09pxZtywNR0zrR2b0wnTUc10c4JzVnKzrCVnxRtvvsnTTz35gHqO9X+sR33DHaNOXaW+VemkSreYKQUdCu87RuNRGdWdnolShBR559pV/ugzn+NT//ozvPzya8wXK1KSIU1T1xDFIVwpXbpR+TSD4lLmN6fA0vDJeKDbyXpISz9lyOkHWLBCriwbVGkuhvsb34MDbWqInqYesVzO6NuW/djz4suRvXyFuOrolgtevX8NjWW+WPK1ozu8YByLvqdddWAVi1UiKY3Vco1VKRJe/NI3eOErLzHa3Gb7ocucO39JuBq6O1VCfocfwyO3HkkPI+4sJP2opDkwpdjNWeJWFDJSBnmmrTFUSsZquYzd5fkvys+cSUnz3Ae+l1df+DoxZfbOnlujzjEGAGzxHOuDEP6bqmZIjB9k21J8p4KUafre07UrKcBthYqBRC++boB2BpU6MJZIRZc0OhuqJhF9pEqCiPYh4FMm+EggkXTE6qKz9YlAZmNzg+n2Jl3sqFRNn5MoAI1l99wFzl54iO/7yI9wMptxcHSAs5aZ74scPXF//z43Xn+FW2/cwPskYxthPp3yD4dGiKF5OhV5DMRk1WfefuUNAB566gnu3r7Lrbu3+dCHf4jf+/i/Ioae2khWYYxSHOos8VWNqVBG1MFja+hTpE0JqHA640PAFvhvVBl0MlRAjgoPKCWmlik31DowbgyhV7i6IaQWgA1n6IIX/zSV0cnTaEPS4HMi5Ez0PUaBUnKt63rMdHOKiok+RZpG0XUL+R7IoB19gj4ErOoIXpPQTEaWyiiqLEpwZSv2Jj3zxZykoLGGHCPaKharGco3LBYrqnoDkDzanhK/EwPOaHTOxD5ga0cOXhqMsAQMZuygXzC/d5c2Qbs8IaUzxBi5fu0an//8n/LOzZu0XS9B5T7Sh4hOGWus+KLpjCoCB1lOi1gCjUmaoCXuDK2IQaGUWCKpLGuXyqVhKaixyhIYrFzFxu4Wx/eHvPA/e7wniqecEv1yRcqJvu2o6oq6qTAhU49qcpacJMhrdVUqi4RB3G6HhWFQ/AwLTUiRvmsJXU81GmMrtx4BDR4QqnQnlAcukjl34RIH9w9YHB1gG1EmnY7FABRaC8LkU8CpzFYFH//1X+Pm9Vvs7e7yMz/xUczmBhfPnedv/63/mB/9yz8sUGnhgagMy67j1t2bHM/m9L5na2tzTSpdo0llMx+KPBkdDfH2pSjI0EUJ4l2seg7nS+6dLLl1dMK9Y1GvnbSeo5Mj/vgrr7FTNfzuqwckfcitm/fYvXKFeRzQGVFWeSXvqksXrIv0eoA9GT7BepHPZUwRMUBNotZQG8VmU7FRN5zZnOBUYntkeejSBUZVxWRjQl05cYjXmgfNnt6dSfdA4VoCHk8/RfnzBz5bfuBqDeesi6PM+l7hm85SJSYgeI9zm2tOSUiJG9du8unPfJbf++Tv8+rLr+O7XoxDlaauHe2qKMwKegWD0qrcM+pBlWImK10KN7l3tZKFTOhmGqsUo1HFZGPEYrliMW8LeqUxxlC7SiwI+hXe5LKRyIadMqTYYm1N6MXo1WiNNooYE/PjFa+/c5fUtTRWo3Kkz0hcwuGSlMUlOZoN7p8sCdFTWYNrRjTjLRnVFK7dYtmTly3hxqtY9w71dI8Yrbij/zk48vqiqjUSONxZYoYrDZ8tSEJWYLQjpEjnA5kig1eFKK2G1kmeL5nynpoCd13kme/+AId3rnN8eJ/RdEvG4MYUJCqTQ8QoUS1rJQ1Q1lL4+yAJ8845GX9nGYHHGBnVhsq09Dkhy23GqEitPRtbUxa9olv1UgQ6y6JdobKnNjL6n0xqui7T9j1RSaGl/ArfeXpjqG1D1y/59Kc/w18IkUsPPcTGWuAiRUbSEj3Vdku2tnfE0R8pTru25Z1XX+H22zcIPhWuoCB3A81LlvNSQH1Tr/Su5jJDCoGrr73JaLqBuaT52le/wg995If4g9/+OA0dlc4sYytKOGUlJsdqekT9lqjQSkxoY860IVJbg7bSoPdBUA5LoI2iIK+VJYSOPkhJp42oGXsyqetorKbvPLOCKG5UlhBa+qDxXkkSxmSTjVEkJEvXL0kp0EdBCtvljJhE1dh5D9qIuXQKNDrijMZZy6ITHy9SYt56Jhju9zO0MVhdUWnPhtOga7JKWOOwTlFXZwmrRfG68oSYShwQJN+ic0tvDE4lKXi6RnJnqzHj6YQYOwJgaZhu7pBTx2K+IsfIjWtX+aPPfY43r17FxyBK+yDiBpJYBUWjZOKSEjGEEsMiDb6yYm0gyjuGh0mmHsLRhzwIiQqJvIywVREBaaXA1GyfO/dtn/n3RPGktKKqHUopfOzYv3ObS488Iryl0hUlpYjBE1YrtHNiDKZOzQ3XvjckcgqEol6JKFwlBDiZfUrEgCrzf4r3x4PkbaVB1xXbu9v07ZzRxkT8fETOQehbTo5mOAKPXtjl1z/+Wzx05jwf+/Ef4ukrj/KR73me73/++/iu736WZjLCaM1ysaRy1dpQ0ZQFLuXAzVt3ufbODfp+yc7eN12sMrfJFIPI4Gl7z2y54vB4xf7JgttHc+7NxUH7aNWxDJEYJRxY9vDSSRiDD5D7jlY7dN3QzmeQM1VVr4l468IoqULwlhKNHCiBB4y0xunMtLLsbIzZHFWc3Z4waSo2Rw0b44ZJ42jGI4yWjnogrd67t0/lHFvbWwyzvrXH1zcXM+sOfhhblQIqp9K582d+Z/2S+rMvD99ppnQkw5VXp6eLUkmeOWsNPiZ+93d+n1/7td/gGy98g3bZSiHiLMZJMW5U5kzjaHYq5ic9+23EKPEbmYwrLm421MbirKY2CmcMSSn6pOhS5s5hx8q3+GgIOCqj2NrZYHdngrOKxXJFTh7fKrK2YCTTygN9ZK02CUoKI1JgMqkZb2iMHTOfeVLsZIErvK3VynP7qCX3rSSRRyEGmzIitEoIoZ32dNHS+0DfQ+o66uCx1QTVlmIhjwRbU4o+ZPzshGpj7xSO/A4/FNL1Rsr9kx+wAMicEufz6XhPul2NdRajFFZJwZvzaeG1bg7WBHQlCL1StCGxc+EK8/t3ODnaZ2NrB+sqQXDssL6ptcoy5VzS4kU4EoN4Fa0NBUMkh45l20OW+0EZqRVS1owa8ZuzSgq9RCLElSDJSoJuu9zTtQJDj2qLrQwpgq8sy16iQCKRvAx86dO/wWc/9bs89dwHee6593H58mUuXX6Y7e1tjMnkGDg5nnH+8haxFII5BQ7v3+f6q68Tu7yWqa8LJzUgdac/CxS7/j7VAy8LWJtRvefaa28w3trk2vXrbGxscHZ3h9Wsl2ubIGWLJ1ArRfSRRbaMmoYcofOerKykHPggyL2GWHhhJkU2N2paccxksVpJAZ16sq0IqSO3Fq08fc40OrPyEZc0PhvaPiPWAQmjHZsTi1pGJrWm60TwY7VBuZqu61n1nhQDjXMYHQmlK6qco7KWyhmWy54lGRUDPgDK0sWACj3aZCZNzXiyRRhtEbyo1WWMmDAhkGpN7FpUdGRrCLHDqoo+JywjMoZgMiZ7dDWibsZoVxGToq4rfN/JPdTOGDVjVsf3uXXrFp//whe5eu0WwXtSjIREmVwIPUWpLAT+CIRCqFAlw09Jga3KtCghYqLBtoBi4SEeUAUs0Fpc7ct0xVLCvR+4b77V8d4onpQWWC9ndnb2mDRjtFHkKKOe0LcE72maEePphsyzC0Fcrff6LKOuDM5YtLXFw8QKSlXgBqOUSN+zKjL1vPZUWxdQWeMxhAzdyYzd85dkPDU/QHdz3njxJV74yotcuXSJ9//cX+Xf/ys/zfPf//1cvvIQH/vYT0iRFkUt1S1W1KOauqrkgbLVeqM2Go5nJ8XsTuND4MzZs6x8T9cGTtqOg5Mlh4sVtw/n7B/PuTObM2s9i74XRRRDRypohBi3nY551gq58p4piF+HAdCG0LWMx2POnj+DCSscmdooJs6w1TjObYzZHtfsbm6wOW7Y2Rgz3RhROUvbtozHIyaT0Vrht2aHrd/z9P2HTpCscFW9HqENo70H/VzLpPK0ohnQqAdvaGXK/75rlVzHugynqvzuhXM4J8vbv/u1geQ/jKXQ/Mt//qv8j3//H0BOGG2omkaQyxiko4+RymUe2mpY9Z56Z8zdGzO00TgUdVXRhkwAfF/ktTngY5ZrmCWGYWvSMG8Nzjiee/ICo8Zy794BN27u42MgR0VlFYGIqQyYGq2Fr5K6hcRCdB6jJWftkYcvsnd2Srv03LWe0fgih/cPODw8xIdAiInWB5SPEj2DEh6LEgk0gEfRhh4fDNoadooKxVioXEQZTd1U1JXDGc14o2ZUVxAT23vb/OatPwdeBTCs3xAjWeky6lJoNcSjCKGWNbKkyyYuhHKDKp49xUojZ3wWkcFwTYZnCAXaSgzPMnq2z15EH+2zPJnR1DUZJFC3FF2D4lfMfMVKwTqxWEkMjWdi2bb0XUcOoJTDuUxlQCEKp67rqYoPgy2f11WGqBVdCCWjTcY3utKM6wmYyMoHYlT4PjD3EojcKEPjEsYvuHf3Fj/0wz/CdHOLt998jZPjE6rKsbszwdYbPPSoJXpfxEGZu9ffZjVfEmDtSp1KZuSgvlJDsblGmU6f/qFZggHPF07jydGMwzt32dreoe17ts5e4nA2o1GJSEDbzCjXZdQWQTu0sgQCixiJPuLLe8Q+MtZIEeojxlj6EAmYYgCcMTpjTULHnlHd4KwlJkUfelZRMbYSEpy7AMpjtXi61Q7aLhBjZtRMMCxQxkpESruk7Tpq44g6QfayV6qMNjUpwXwxp3KK+SKxiDVNVVHXHmO1WJIYw7SyWGVoV55sI4ZMhdQqShnQFdPNEX1fcTxfMXKG7Bp8SthgiMZCXaO1JeqOxtUEMpUSz7g+CWezS4nceiYbO7z99mu8dvsOr7z5FqFPpAhdiCQfxLk/y/0btbjPpyLGIEuQrzJ5PTVIss2LZ1UOhceKiDa0AAPkJAVYikL/WffuYlQ86L6/3fGeKJ5SjPjlEucE17DOknLGWI3OmtViTvQRNRqxXByvgy2NcgxE2rx2h2Y9XqIoV06/AH2qgFHDcpIha7KWUVjue65fvcbu5pivfvlzvPPmNc6d/xJXHn2Ev/QXn+fi04/y4ec/xOQXp/zKP/0V5vOWDz//PBeuXCCmQLvwpJDXbtoaiUDIBRrve1+KwkTfRd6+foOUEjfbxNdfeYt+9DBf8V9g2YmfR8rFcbu4qZ70LTlLMCbqlNkjao+4LiTTepQm8GQFjExmRMdkVGGAX/jwU9y+WfE/f6bhey6f5W//zF9kMqoZVw5Xi/pQa43S776FVClEYwxCYBxGUPKO5SRYv/quXxak8cEk+HXZmh+kvJff/yaIfT1sS6cvqiwO4eL7kYhRSNwpJZarluPjE5bLJV3fcXJyzOHBESeLJfOTEx5/7BF+8mM/RuWq02SAsqR6H1guW/7V//Xrks6eSqh0jIQYSTGIV07O0GYWXcf5acWdeUArSZ3XRuFGY+4fHpK1Jyaz/nfLW1kpdVVm8Kna2WywJvPaa29xeDIXV+YsSpYYozwjyuJG1XpLCNEQugApY63BVYaj4xkbE8tyseL9H3wfGscLqxO6tiIkRwgJW49ZFa7WcMQhMsRKJ61cg6vGbG47fvqnPkLfhrVMOOUsNglOgoen0wm1qyB6xtMRv/+Hn/63Pv/fCUdGQ4rrGIlcUO1I6YBVYdwksQd4EI8ThW8iFiflnAaPOznPDBhJPv29rMQ6QBtNHwLbO+cw3OPw3l02986JqmngSZbibfB/IosibGjYyAGlLe1qSdt3VAm0EYTex0xdgdNiGdD5FW1QpChcPIvQKCwZa2XF08pS1Y6cAilD50X9p7Si0pCixatI6zXbJrO6d5Xf+s1f5a/+7M/zvd//A4zHY+7dvcen/uB3ePzJZzFGo40REUfXcvuVrwi6mlNREj54qPIslUK1XB3WPx9o8nLJlCyNW0qJ/Vu3ufDII5wcn3D23Hmuvf4NUh5CimVDzsXgsylxp411uE04XrSoKJu+VhLxoguXK2mDqcaMwgqfEsaIOrqPGhUVSXsWbV6rx53ydNmQY7GTAFJYSKyNlsatMhWLpXjCkQK1q9lqHLW1hY9boVD0sSKjqV1DSp6MpUualYqMRoqQFMpssApeUMikaGKgMglUxBHwvWeVFVlZlIG+P6FrZSymciT2Cl3XbNSgnUT35BhIKtLnHp0SGUcsKJVzCevG2JDQGkIMvP3Gy8zqPULvRYlKQmekQTSBLsbCXQPJAJV9OyUZ34UuQSXUBFVMNI1SJK0xSnjUOg+Nc+GiGjEMJQ9UGiUqvSEq6f/hmX9PFE8DN4k+oawlJ1Us2eVBqJyly5l2sWC0OeX46AgNNHlcOqxTtVxZxkBJgGDsA82oYTQZ03U9zlUlsy3KfHQ9F88cXX+LOq744if/kL/x1/4aH/3BH2HvZ/Z45umnOX/hDLq2kBLOOZbLFavlgvl8Towiq3S2oqocdmTQRkwPM5m267l3cMS889ybrUTNtlhxtPS89cYrvPbWbT5/Z85Lb93k3PvAtoNzrOBHOieMhj4mQkxrpIYcsVnSsBuTmY4ck8qxO244szVmq6nZ2ZiwMa7Zm46pRxWvvPIqL38cxm7MX3jmEn+6usvmxogL587wyMVdec9hTFe+0m+uvR8saLT+t49lHjw/57wm3z/oGbUeuSLvnUunu1q19H2g71fMF3OuXLrM1nRDELSCHB4fL/jHv/xPePmVV1gsl8wX86LM6fBdLz+9R8i2cf1+CkXVOKrK8RMf+9j6M0ktKATaw4MZ9w/2aWrHatnivRfyYkxrbpiQNTVWZ3LhN6mcJSB31WGNuAanQmQVTpIgMsMYch2rAexsT3j7navM5ysMGe+lWAvFXVgpjXIRlRNOINOCqIoSyBhJnl8uV7z1zi22pmPeeu1NlvMFq+UCBVTO0TSOejJmcXQovKwk6EhCjBZNiBilMLbC1TuMJ5kPftcTLE/EtuLGzX3mqxWrVUvb9oWLI/yDru/R2rJYfedn20HhtSlBfGX4WVSpWYpROUdUUgaKI3ghjK/92NJ6vLZGi9Z8Q0DLvZPKqMEUYroCeu+Z7p5Fm32OD++ys3sObezaYmDI9xp2g2E0GJJ8WpsNq7YTw1yVmW7UdN2Kvo3EHiqngA6MQ+tQkG6DNpmcNCZlfC8bojGS6+dLFVFVitRqfJ8YGSVKLp9ojIytfWi58dar/O//6B/w5o99jI9+9Me5cPECf/1v/ofcvnVXGhFlMUpzcniH2c0b6010rSp+kBc5NGR5EIBIoZQKnC3ot5yd1r2dsA7nx3O6dokPnjN722xWslYkXRVVcCRiyVmCelPSBBT1SOOMhCuHbHAOiFA34sKtcs9qmcjRy7UzigpNlwLaakaVxeVESkKun1SGmCDkSqYuI1c2dIOrwC/Ar1ZMx6KoC0mTs6ftO8iOlDLGViQi1imWPkMI9Bl8UKgcwYopda0ts+USq6C2GmcUI2dxVSWIm7YYG4nZExWMjcbYkoRQO2Ky0mzGFmMrrAOdI53JhNWK6DOmMdgYsXlF9CuSrwiukWegkgK8X8zo2SQmaUpTTFhlUC6TMKjsSSFhaocuUVBkCceORmwLkpf13SgkZkHJHCaT0MkCsVB9FNnKGNtkQ/QBNdQSBY/N2Z7eVt/ieE8UT8roQmZLQgaLnv0797hw4YIoGFYrUowo41gez4h9C9axaleygJSsJmCNKoUQ0EbhieQU6JZzgg8yo9WZg4MDzuxsc+vGNbanuzzx+KOopmZcbfMP/+E/4Oz5PWLKkvVjLb7vIUqY8MnxnERmc2uTvu+ZTqeMp1N6Hzhedtw/nnHr6IQ7xwv2Zytmixafhpm8ls+LjNuWXYvT0lk5paiampw8OiUMktRdOZiMakyq2Kg32dpo2J6M2d0cs9FUbIwbjILaWaqmLmCcQg0kgHUdpDg5OWH/zj2eeOwpnLXMFwtOZsdsjCYMDt8CFuWC3H37u+dBj6L8wPqVc5bohyiuujFGuq6lrhzT6YaoGZTi+HjOv/7UH3H77h0WyyXHxyfMjmbMFwvatmOxmLNcLOg7j+89IXqef/57+R/++/9W0sKNJmb43/7Zr/BLv/SPC3qSi/JCr3PmJIpC3pOUiQg6QxYTzt/6nU/wsY/+WOFQnSJhMUlUkI+eylXUxRsleE8Kp1EJRuSYVDagskarMlLWihjDOiZGOG5D95+LFF22WckjFQRqdnjAyfGCkBXBR0F/lKKq6jUKqBXYLK7fzmrqyYjlyQKtNdYZrBMUoG09bTcjxSNUVhgjRV1C/r4+BqKpmM1PeMArXyBsnUgo6q6jMT1ZV+yd2eL8rmW8MeKN12/ypRdelcZHZba3Nji3t0XXJw4OZvgYh6r4O/8owdOmTKyFg6PKWE44SpW1a2sUY0xxBF9jqaicCVEKnaxEyZtTFCuQcm8qVULRh7ct92vKmVXbUW3usmMsh/t32DlzAWUHEnoqnCyJZMkI8dwZLU5rSrFcLSF46jrRxZaYZD1IVtFlSar3PrE5rakbSwiCNjVGOIvaKIyrqJwt4x9L23ucMTjl6LuOymaU0TilSEYRYq9l/4wAACAASURBVCBgiKmjavf544//C1574av85Z/6GZ599jlSFFNYYyNaK45vXyXMV6cNnVLrG/bPjFjyqcVM/pbLmDr1vyrVVPKBvhURiNKC6okoSJRkOYs9iQqZTKAxBpUywRvaVY+rLMoo+hSwKeK9hqQwKmHQOG0wSsaqlVXkHIlK/i5V4sh0yiSdqAoNJeqGyjkmbiyFRYSQE8ZV+KDAJEzOkDLjekTrE4ZEJmBQzFtFpTNeRWrjSDlzvEgEBUpbun5F12sikUjLhsucJEUbMjmvMKYBIpWzxE4y5WxlqO2EpDOJQI6W2oFTCbRivgr00WNiX7L/RASQ7VgyHJXHz1cE2zBtdtEa6kqazhwzKYjlQMxxvS4LRUF8nNQQtI2EbludsdrRa/H9S9asR9yS+qJgUNoNeGRBYLOTuyEF4dHmwhFGpfU85Vsd74niSWvNaDxeb1sK+PynP8tjjz/FyCq2tnfKvH+4xcW4izRsPUBC2PhZ1AYmisNsU9XEGDk+PMSkyPmdLS6cP8sN3/KhD7yPrR/9QTbGI6pmxD//lXeojGM0qmnbluAjg9mdc9KC2MrRjMa88PobHMyX3F61/NqXXuZ+27M/WzLrOmJIuKpCK8W4HlM5gzEaN4S1lqiLymjq3DGqLR+6ssvV8zv8+HMP8eRTjzEeOcaVZTIeizeHkbTyqrLrm+ZBTMiXLD+lWDtwo755OcnM53NGG2M2JmOcMSJDJTHd2gAUanC1VsDAqUIW+Rgii3ZF8J4zZ/aKujHzyutv8vLLr3N/dsxqvmCxWnAyX3CyWNJ3nr7r2L9zk8Ya/qe///fkOgG/9L/8Mv/i//w1FJpARhtNPZ4Qug5XVbh6hLFTTK0gePRqyZe//FXeePstHrp0EWcty8WS3/7EJ0qcQ6Zre3SGkPvhKyjTW1FlqhLnEnMspE7Dndt3ZBznHig4AVQiZTH800oRQyAHGWdItEKRvuZEJhFjICiDzkosHjIyV8/itB18h8rCRck5sTmuuXzpPKZu2Nre5t7Nazx17ixvv/k2ISTaINEXjz10kdzL2DaGQIyRkHtynFPVO2irsXpMvxTOm1KK0IsPz3TTQFH0pJBJWRHNUBxBDpGLZzaYsZDAzBhJSQJac1aELJtX7FaEpOl74UrV44rHHr9AjIE3rt1mNl/Qdi1nzzzM7nTK8cmS3b0z/N5vf/L/49XiPXqUhyYXNHsQsejSMJniVulBxu0xEofgaQYPtJI3lwPGOBkpaUMOsTghl+OBkfi6KSgNU+c948kWGyGyf/cmZ85dRFmZL2UyMWd8FPWeKiN5o4vFQNcLMmYVfRfJSYpsg4xWqkqjgxDNo1JljRMeirUalR1ORWJ2OCuEcqOlOExZU9cWnxOtFwNGC6ActsrUEUaVYkNn5jdf4V/+kzdoNs7zc3/zb/H4k4+hlSErWBzeoY6CukphqtbrE0rW/iHWZniS12Oad18w+dMsTvplzlHI/prt7R2uvvEK8z6VHM4sKlUUlkQfPBroksYQyUuP1hU+Waz2qCjvmbwURRGFyaIDj1Y4PDpJ0HFlHUZrQWwMVBmSspCTeNzVTooAZcjaUDeOsVnKZj+agO8YTTSr0ONMzcQl+l6EJN4HtjYcWouje7tqybHHGoXThug9jow1IpyqTUWte1bREEgYbfExCQUhJ7KuOO56NmLFaBLQSZMw1HVFZT19F1lEwyqAjoq6nkjJHhW5GdHFQF0buoUkd8SYCf0SHyM6B2wKdIUcrge6QpR9XRuDo6hF+x6sES+/gr7HFMk+CJl4baQpXf1gn5ejSC5QgrArchmlQ9ZZhAmIP5RknL7HiyeGWXKWANiuC6hsipeTkLrmy5a283gf0EoTYpTbPUs6uRQlce2PImiOkNI2K8cPvv8ZHr58gen2FiFFvu8D30VdO6w1KKWJMTK7f8TeY3vUo1rGUcaybHsOZkvun6y4c7Tg4KTlcLniiy+9yJ237rH0LVdHb6Ktk/BUCgmUnnFd0dCz7Rq2x4Yz0zE7GyO2Jw17WxtMmprfU7e5+vuODz12nk9Oa77vucd46Mo5BvPEvOZpycb5oKHiAEeXe0eKhHwafguq+LmcAtOL+Zx2sWRjYyLEvVVL9JFmNGYoXf/NF/6UP/nCF1isOmazGccnc1Zty6ptmS9X5BD4b/7L/4ynnnic/fuH/J3/9O+wfzRnNN1i7+wldnbPkHOmXbXcv30DbQ13b95gfnifL335qzzz7NOcnMz53U9+kq1zexzfP+TC5cf58AfPceXiBfL8mNwlVnPDO/uHfONoznz/Ot63ZKW5c+s2ly9epLKW/XsH3Lp7j2Y6ZXF8QF0baTP7KErWYaSlMibHtepJa1WMunPJxztF6YYHDqDvPLGME3dVxKmOSic6pQg5YesRfWV5eN5xkiMP6ZpdZ/i9vOCmF9VR8KE4Lxu6PoB2ZBRPPnUZnQ33377J8dWbmFpzc/+AVXF+T8CkGcFsQZ2KZQSZrA3HRLrYkuISpUcoK52yQkEUNBeVObvtGBkRMKSUiTFz/TARtC5KK83lyztcnh6K226CECQ2xCeRWZ+wyWxlSDlzfzZnsxrTt4LsXrhwhq2tTb760hvcOzjm6y+/w3NPXGE0cigVqJs/HyaZOWVMsaYQ89hhfMfaeiQm2RAUilA2eImVEt+ngY9klSs8N+F4pDws8wOvU2HI61DfUHzZlJLXu75nNN1GqcS92zc4d+Ey2ehybaX4QSHZckDIEZcNXdsBEW0yKZui6pN7WCGbuba2hLYafNAoo2hsxtUWky2YwmVUUjgarWl9z7LLnHhRODktCKtSGWMg9J6cHH2UcZBKGRcTaXaHO9ffEY6WMRilCN2KOgdGShqubzavzev1LhdU7t20gW+6au/6v6El3d7dZmt7m+PFimVy5NhBVqSgcAb6pFlEIfIr3+G0rJzORciSMWe1owsRU1UYBYmANrGkB9Rk1aO0ZlJbjBLnbKM0fZeI2hREEvo2YKIHn8muwrmKvl2UYi/g50s2NyxJJ7RyqCTjckVZ92yWfcMGYlJkFelicZIPoXDxFCoHatuQ+6V8xuJOb9Bo7dZO20orJiNBohbLlQAAozEp96TsRCXpDXWlSF1HSoZRPUK5SOgDMSfmnZhjRlWzQsOixbqKFZUo0fXQVGT6LE2GUYK2agXOKDCi/g0JqpxIIeGF6yLXXUzvIKu1UGIQMYnGVWNysSsCyAplDbE8bzYbVJS19tsd74niKcTIybwV1ZHsdoQQOZ4vyUocckVGrQBd4gQsmUTb9bRdV8JKkWqzSK5jkof1wqMP8fzzH5BxUoFhlZFMu4QmhsDhfMXB7JjqZMWnXrrKnaMFd46X3N6/T0jQxUjnJQbBaMNyuWJUV6Qcubg1YuwsexPHxb1tLuxusjedsLc1YWM0YjxygKaqKgZ6o1KKnDLzkxnGyE2Z+og1g1wZxBhP0IIBeUtJRmGp/Bu7riOlxGTc0PrIC9/4BkdHRyyWSw6PZsyOjpgfn/DTP/VT/MAPfC9936O1ZjwaobWm956cEpWTee/h0Yy/+1/919y8fp2tvbOce/gJqCpc1WA3N2jcgjvvvM0ffeYzPP7oI3zt6y9w/a2rPH1mj5PZfW7cu013Zo+79w/oY2T/7h0mk6mQ+3Lgxo3rPPfc0+zv73N0fMLGXkPoZizn+zx95VkmqSfWFdVEE7Yn9Alenh8zmWyy6L3IW7OMMlKGrvfknLiwd4au0bSLGavFAoxGO0vTTOjaBVUzolsuQYmUXxtDQhECGFNJB7NeZIcOFNplh47S5f6MmbCbGj6fDYsYWBkYbe5wA0VMS55czhiTuQBcsJZbnccYRe97nLUo1SOVrmyijz18jhs3jiWfLCsUCZcVMSR8iFR1gy0eUiTx9RL4WmOwmBTIycu9YjTWOhl7Z8Fjrc5UFVRWE4M8WzYlKivk82Hv2NrZpVu+TbCZ/5u7dw22LD3r+37vba219z7XPt3T3dPdmtFoRhqN7kiMEEgjhAWWECARB4jBJiKxXckHOymnXEBIcL4QAxU7CKeIoUw5MfhDsAUOEiCBRYiMJBhGoxmNRpr79P1yTp/rvqzLe8uH591npmIg+QJSaVVJXd2nzpyz917rfZ/3ef7/358I1mlsBusl2Heeamo9xrrA3uGcwQWascUEQ+8Dd5xc4xtedy+PfPFZZl3Hk89e5uyZTWrr6Lv2L2sZ+apey9HYUue0BNmmLELtmBLGKGot2h1MxAcxOSgSzspBDy1uvZQ4Hu8fHw6NeinXEQlrzkXrJnTx45YU3ntW108Chls3rrJ15ixLHaMxUthpJcWND5FkFLPZjCFkhmCorBzVUx5KZysRc6Gj2zExi9g8hkQfKlaUZmQDxo1QIeOVxlmFNhkGTe0Uo8ozmw3MVMaRacq4ZQiJkY50CXKvmFjpcA0q8MILzzD4gdrVWGupKkOlEpsoDsvAs2yPxwVHLu/P8gZf6sJgeTBaysY5/vryydfO8trXvh4UzKZHqNgTYziGKqbsSVljWZpzSk4gGR+UOOi0w9jEqquIWZMN2GzKwR6qGJjUDZOR8KAkFzESkkgCYsw4wDnFZOKwRqOVYWVk0DmyaD3KWqwBw4zQOWwwosdMRXSuhTZu0ZjKEwdFF6HvI6k4/fqsqZLC50xkxGKQDowOjiE7xrEX4DSKSgdCPzAkLW5No4FIpCJGT1NVRN/Sh8TcZ1Z1T4qBro/EIVI7RZcV1liccQzRM+87MIb+WGKR8aElZSdB0ymRcsSV7iBFRA6C9cgq0fc9fUndzhQkiM7oKLy7jDgxVVbHhXXKFMd7LsDTlz5/Zw3Bx6IZU8VI9qdfXxPFUwqBvZvXpL2WM+jMxnrN4c5VUi6WwQw5R7JSHM4O2N3eLxC3CltVWFthKodWBusqXDU6PrWtjxtCjHRDYO9oytG8Zd4npkPgqPVMu4HdoyMefe4GZ9hkf/0MB0dHXL99wNB2jBvLejPiwuaEMxur3LGxwvYtRbtu8aHjw3/tIVbWxrIQeY8fBurR6JiCKq1kWSSPLfk5o1WmLfwnpeTG0kazc3uH51+8zHQ6Y9a2TA/3edPr3sg9r7qLj/wvv8Dzl68wP5qz6AdmB3uc2Nzgf/4nP8tnP/tH/I//6H8S2NrQYo3GDx6jIIfMW9/2Fvq+RxlD04xIZLp2gSILryRlXrh4iWvXrjLMZ/TjmmpkcCsrXLt4kYOb1+lnRyTv2d+5jcpw88YNxtbwEx/4AB//4hf4tcceZ7GoYWhJfcuk0qw0DkUiZntsBDg4nKJRzG5fZm11FacHZrd2aCYV7bSnOX0P9eQEfdzmjNFcOHWKWei4dLtjMp6IlihLcCQh8t6oubV1js+5FWLc4WB3B6szbligUkIPnSwDSoOyjMarVNaxmE3Ftq2Wi6gsuwk50beLORHJIFNovDM8Yw0+KKa9Z61rybMFt5xhIweaKBvfBI0hSXhnPzBaW1kaQ8sotIgWU5KFOSdyinRDRwKhqL9Mf6YAlJwmjRN6rkwFo+jnEmRlScpD4eEss2GzKpZbBboyVCYw9QGlK+kA1I3ENPhOFotU+hxaxiDeDyQmVLbiwtlTXL54g509w+bqCoOPDDGwuTnhgdfcxaVr2+zsH/HilW2MkY7u1/ulKCMwZAGXUZo+Fo9rLfgBawQeFpcFVRAHmim2elueDV8clWQlI1/Zm8le4l3QokVy1orerGwS1uiXdV0AEqvrJ4gxcePyJe44dx5tLFlZTDHKiHhZ7qOuW+B0ZlQp0Q8WWn2OiWgVKhmM9uThiKwsHrGfp1RI8qMK3XtqKyaW5THfWU1OmtVxxFlhzSmd8V5z1C7oksYCJkaciyyijI2Nc1y99Bw7t3a465V346qK9VMXcLZiw2SqBAO5cHtK0aooo/eXfTjAMsj7P5QylK+Xh3N96wTf/M5vYX93V5zdSlE5i9OgU2RIEJUiRVU6f5pxo+lCQiMaslwCmkejhsXQYVBEDTaLK1GTqWxibVRjVcIaCFFxuJD8Q60DdZF9NKrkztlGaFbZMlodC38tQTQWT6KuHLUVG74PCpXEVa1RBBwqDlTRE7NnpCJDALIm6Hz82mKUUb9o0zqSkvULDESNRbr1WtdIcpgSFtfBAbEZMQRFZ8cQI9M4sPADGgPRUEfREVmn8MoQfWRl7QSz2ZRMxlhb0BJCRRedUjEQFRu06AIRuQEJKHpQLYcKpZFUhyD3QdKSGkEuzMOQZdpQQLWyIEvgTlZLUHFCGRmr52zQ6Wu+eOo5unlR3oRyut6cVPS71wiU1O8irlVasX3jGrevXGd9bZUhRnZ396msZTQaM4RAiBVv+o7vxJST2MWDlp3PPMXV3QO8D4xHY5yzokVARhcqRTbXxtxzYoV71ywrp06z+aa7ObU+YaWpGY0czlmMkY7XJz91jatGU9kR42Z0DLizzkkcQ4jM5jNxWmXNaDTiy09/hVvbO+wf7EOED33wO+mHQFU3hBiwTqOM5ad+9mf57B9+jpX1ddq2x7czvve7P8SH/qPv5nf+3afYOnOOyxcvc+b0WY6mB1hXMzuc88SXv8Lq1ha3Ll8qYgtxdsQQOdjfI8XMfDFDKcV4ZUxKmVnbgVKMmjEAh4czrHN0GWaHU5597FGm0xlD15WNQNEYS9NIcXp4dESjNM41DFm0QLEIiJW2bGxMmHVD4a8kJpMJMSfariMMA/PFgrRuOXvhPioabl/eY2JhlvdZubDF/HDK3dlyd1L0d5znuqowtiH2AdNouvmCGAJueojaucmVg13ZvLQqKfJRhIYlQqdyBqUNPgTuvOfV7Fy7LsVrVsfWm0wW8F+ItF041oGFJdQwDigNa05hQo8eG2gFjSBxDbCiMqOcGaxlMUgel4wMj1V6LBYLhmGQn6kUCsEDqCRcMimPpMvmnD6Opqgqh/IRE1RBYESycmhTkVMPShE8ZL3UeynJXIwJoxWjWqPaZWYZ9EOkadYIvhe0RS7C2JyLTVwWE6MNp7bW0YPixt4uISXGriL4QLaGtbWGN6zczdMvXOXyjR2uXN1j8F//xVOGY8fcUtQtwdUQkmjVlJGVLcZU5BgigNYlokNR4H6IEypniTFRKKqCDEGJnT4X954y5njTN7roqpRogLSSTaLrA5PVDSCyd+sGJ07fiXFO3IFZnhGzjNHwEV3MNkrrUuRbsklYrakdaF1hq1RQAR6roLICwc1J42OPyRZnMt4rQjQ4K+OfaBx1benLiMXWYHXDqhIyvtUKayMhKXI2dCEyP9rl8488zCvuukBVNdz1wFs5/ZrXM/uTJ7hjUNxEcAXHiZBl+p6OhZsvSX7/tKKplL6UkQLf8u53c+GuV/Clxx9n7/aePCNZ5v9KayrlSQGsAl1VjJ1C68BYQ1AWqyJJOel0xI6NkaPzxdKvMlFlxsagdKLvE7m2DJ0XdpJKNI2jMY2wpFLEGUfVVGgNnYeFD6jgiRrQY3SuSHmBNlZcjUlTV7UE4mrFwUIE2wOJLir6WEMMOJdogCFoQvDEEgKqsyf0LcFWNBXgYdy0DEqRgkhmovUsghczDhlXOfamLdqN0crhB09KAWMsSTtsCmysbQKgm0kZGWesCqxOzuGNwdoT7F59QQrf4sguQi8SkZz0MUV8ef/nrHHKSLadlsIr6Ewqodo6iWwlZpl6WK3IWpfGhWLJBEsIXDOX2BaNIhvpfP3pRgO5viaKJ3ESCXFbKSNE66xAR8wxv0nSkYfpIXVVsbGxwaipyCoTYmRlVFM1I9r5gtlcHQ/dd7av4mzF6dGY9dqytbXGidUxm2sT1sYV47piZVyxvX2D/NQW3/rmV/OWB18POYhdWxsRFyOgupQ8IcH8aI7TlqA8rW/5/X//MLd39xi6ng984H3801/6Ra5cv8ns4JDzJ0/zd/7Lv8M/+PEf4/zZC1TjEUkrvu2hh/BhYNyM6H2P0uI+ee7JpyEN3PfG1zA77HnuyS/Qzefs7NwmJs/OjWvYquLEyU12rmWm+9vkFOi6jsppjPIYY2WhykEE+QXSOZ1O0VqxMl4pAusWpQ1u1JDJtP0c37WAwrcDh36XpDQ+JmpnqEcjVicjRuMxmchsOsUZQzURXlCOIrrLWVFXNfVI3B/DMKAUjMZjUhLe1Wx6SD+0nDh9glHtGJ0es+k985tzdm5d5/D6HkPvWdPFnp1Bk7AWfAxUasyi68D3GD9QBRFiOleRgy+bkaTKKaXEtaM0MSasVQw+srq5xWg0lk3nZafUGMVy7/0gAaNKce4Hv5+VqDAf+w10joQk4kRZJAxp1hWRITRGcUI5jpS4lIyW9vyx1p9M23YFVvjSaMECldGyKRnhk+SciCRSFBG6T5EYxM0ozkwPjHCuIfRHZDJVbYTOG0UIn7W0rnWGUWNgqfOKiul8zqmtMxzNtoszMEF+KXhYnscIypBiZmNjgmssF6/eZKF6JuOG2lXEEFldqXntfReIMbJbALBf71fKEskhTqq8/EcZz4pgh6wUQxQr+rITLc5bOQVbLZE8KckB0eSXHeyUOo6+UEpLJEVMUswva4RyvTzOKEchgfsUGK+dwlUV+7vXWT95XnLqlMRa5fI7t31LSFEAg9qQdCCGjHYC/cRmrINURnK1GmENKIMcRlMiJS3fS2bRZ0KOjJWMiTBGDlcqklQm+ISxmqDkvtQErK1pdKIPEsNx6/CIj37013nXQ+9mc2uL8/fcz6u+6d1cfewrbAyBKZIBm3I+ftuBY0/VchKvXva+LEPmc+n4SeGqOX3uTn7oP/0wN65fZ3vnFtOjPVTBd0QSDoNVmvHY4EMWfY8CtMXqiAoKa2qiVqhoiNnjh0xTNRzEKIVGzHQqE1pYdIFRdqzUYxZtR85OTCjWMiRLpQwJaLuOyo2p8IxrTa80i94TVU/2LW0cZO0fraB9i7EGy0BIBuUavO9wVSMaTW3wLhF7T4oQozC8nImYFNAqoitD1hC8AgbhO6UWlIYohgKjRG3WrKxhdMV4ZUKMEccC0yTavifpmlEjkTVqOMSQ8P0+CbDO0ufI3O9QuxFzlagcqK4XbVYhgcuUTsbb4lCWkVqKyD0UixZ4ZIWnFZOAak0+NsioHFBWRpkijpDnJAfRgeqyLotxcxkzkwpI82u88wRFwIspfBON0un4VCVbZiZlD4sW7WTDylodU6iPFi31kDDZkAi00yOGnGgPD3jnO+7gwYcewJqS75NzYT3l4zbu8mEzTrF9e4fDoyNOrG/y6ONf5Or1a3zTW9/Gb/3eJ7h86Tqn1je5+1V3Mx41TPvAo499kZ/40f+e1fEaicBd5+/i93/3k7z3A/8x7bmO5x7+PBevvMj+rdv8+D/4h+x3e/z8z/wj4uDpBhlDBS/uMBR0fYdWhpRGGJfpZwuZH3c9+9u3AMPJO89w9fpzLLoFG6NVUob93VvcvnEVqhHrJ0/QTw/FfpozddMAMJ/PUUqxurpCSlnGXjkdi91nizl+8AXo/RLsT6JGpOWsUFTOEWOinXcces8vfPSjPHL9GrOhp46BIUkbO84XKK2Oi61RM0IBwUt3qpmsMNk8i9Wanec6bK7ZUQOLKhH7nm3fc0cj0SakhLNWRJMhsGYsfd+Tk9hoN5oRW1VF23a04YjoI6lLeCWLXD2qgUjwgbbrORE7RqvrjMbjpcis/CljFbEq9/LvJFYfuI/q1h4bG+sMwbO2qSWl2yfC0KPmR2IZLrbkiTGQPXGZ9L7cCJeqDG3kdFPEjCknrBIK/lIcjiDJivCxPCMl78qNRgzDQI6SjYaRx3nZkbauQE6NbLjETCz2cmcF2QCZ/d0jLrz93Vy5coMUtuXUnF4SMOelc0UvC+PEiY0JpDt45uJVdg9mnFgdEZPwhpqq4t67z7KyPfpzOSlfT5e8RYmAjA8qa9Ba4UNkMQTIGmc1lRYNS8yFT5MTIQWsrqEc0IxME0qUDuSUC06gaHmKKDuESGWNbGql2yLTsuM7DK0VlTKElGgm65wyhv3b11jfuoBx0iXzBT44tAuUslTmpaw4CaEXFAJJDiM5GAYVaRoPKCpbUTmD1pYQIosuMgyakCFisRFGxkigdOVocsXCRyqbC88nE13GxEDMkZRl7Hzl9pwXbhyirv4Jv/Hr/5Yf/pEPM1lZZ+2OCZO1EYv5jJNZMZBoQZ4R9RJRPZVDUyrrvchm8nG6QDkToZWiHo3523/377G+sc4ffe6zbO/c4mghYbrKGEJ2ku2oNclDzApXgnLjMAhcMQNDJBuFy4khZoZksUMgolDK0utEFw11NmgHRwc9uyxQSdHUBqMzMQ5UpiUbGAZoaoMf9gVvYDIKcUHmoSNphU4DQ58IvRzG6lwxAOiM6mYlu3Vg3VT4NDD3nrHTGKeY+4yxhpx6jApEJeuFs5qQNUrVGDqCr9FaYWuDAKkle9DHRMTTmIrge7pU4dyI6DSDh6HtMRhco4jeo0wln0HsiUo0mtV4nUZ7DjU4C7kvvLwUyEkfmyGWHLWsBummx4DSwmUiyffI/RQgKqI2IllQChUzxFhGt4AtYz5yORyLSz0X+rhJhqyTxJX9GdfXRvGkFGSD0YhQLCcgYZQ97qgO8ynD9Vts3P1Ktve2mc57mlShycSgMK4hKQ3OMds/4OpTjzMZjdi9/DTj8fewd7DPqG64fmuHjdUVnrtyi43JmCu3rnP9+jZvfPUrcdmwf3jEP/mnP0e36Hj/X/0u/tW//jWqrZP4mecPfv8zvPO938HzX3iMM+fPsnlig7afs3+wz9nVM7zp3vv4oxefYLFo6bueU3fcyY39GxCgX/SkmEk+cHR0hLM11ir6rmeyMhEAYpDRVu974pBwSZErjffSAu36Fj8EJpOGC+fOcur0aR4dIroPKKDrelLOOGdYzGdUlaExEybNhHo8IpPpO0/OmdFkRIyRthO6tDHiAOu6tojsZEOnCO0oIuSYxTVkn3tyLwAAIABJREFUnThCeu/ZPprxm9NniFHcJLNZS99LnIKxEYWkYGstWXGg8L5DK4uxNdODQ7YvXeFLfUcMHm0NVV3TD56u6/GbJ7jVNKTxhD0CTVNcGcbSDj1eW/4wwLzrOJxOxXpqx6QiFpFGTyZkTYxgCnbi8jPPMl5Z53WvPPdSz18BWaInlFEMvZf/Qsjc+I2PccrWPIBBNTXhaIZdq/lSirxtMeUaskjHrPhK33KgdDn5KHzhhWmtIBTtm3Vkg+hQUiQRChwVfBR9i4uJwQcwFqPBpED0jqCkQ+FGIxlPIhoR7SpS8GQEMofWmCzQVaUEikiW+JUhRKy1zGYz3HiCMhWYFep6ROcHNsabzI+OGNHg1IhRVUCfxYa9vr7C+dOnOJwv2J/11FaRDkUMP287Tm2u4OzXxhLzF3lppXBGtG45IwYDa1lmZWUQIbE1QgxXIgSvCtsuhOVBTjqQ2uji0Do+OxYSNixF0LURcHBMGXs8nqVY94um7vjel9GcIjNaWQNgb/sqG6fuBCsjvMXuDY6ODul8YAhSuJEUxkJTGZxTOK0YN46UHU57ItKxUSBw1BRZDJnBZ1ADtXXUWpAEbQsxJ8YrlhRg8NLV6kJGV44QIj5UhJzwfcczl3e5uduWjlLkl3/5n/PA61/Hg29/kPvf8W08+YlPcLTzBJOkORUz24jrOuWEf5kAXN7DoqU91jW+1KzTSqGbir/xt/9z3v2e9/DpP/gUh0cHXL/6IraMVpUWY0RChPAkcArSECnzOJGUJEEZ5JjwKtJHEVdHAnFQ1JUmRumyrZ3Y4PSdZ7jj9Bk2Nk+ijaxJ89khB7evsXvjCtP5Ec4aOl84b8Xar0mkqEgKlHZEVRNzxFqFqiRcubLgI5g6C3JGZ6K2KBWocKSowESqnOhDwGroB1B1hUJy4+pKkj4q5bA2E/selYShR0poV9E0E6qqIoUBDYTYol3CxoQzcu+kpAjJl6gfybPrPTgl4IfZdB/qMX0QLIbKQvxOSeNTQuuMzoasyjqGIatICInkE1hVHHkF/KEtaJE9ZBQqa7JOhBik+M+JNGQ0LzvMxkxQGUOWJAnkMLTsyv5p19fEytZ2icNpYGu9kTTtDJ3vuX71uoxdjEbbirRxF1vjhrSTBHhZVQwpo6pGkGAxg+/RxhJ7z347EL3h0vWb/Pyv/Cu+/e1v598//TTvf+c7+dLly9x96jS78yn15hrTowVVXdHO52yqyKl7z9NO54xWJqydO0f0AY3h1B1nuO5qgh9oRiPMkabvFzD2zLd6qsuSTeY7QGtCL+OjoRPk/P7BbW5evw6uYv9wl4P9fc6u3YH3A0qZIgCVcNWnHn+cEAOumuCqhn7w1M0aMVke+/xTbG3t8OZ3vY1nP//lgrjPVM0aGUXtrORrpYFhyIzqkaAgYkBlxaiR4qnvOqDoHoDYR1bWt1i6VcQBpIs4Utw5kKirRhYWlVmZNEUPpKAIM121tKjL6GEpuHaFadJ1C5TShMFzePPmcQafUpoYMr1foBEWycMHu0XtqVnbGONcTQhSZfRdSybz6d2dUvcsiz756bkU40pBTqqEi8pYOIfMPOzibFXGdnlZO0k8kDP0fQ+laPw3jz6OsY5cVWRtWNy8Sb6muRkHrrSBoZbw0lkb2cmZqq7ldRuFHzx1VfLGckShabvIyuYa9atgfXONq5cv8uA73soff+6L3PzK05Azyhhe/+BbWKkbnnziaVII9CGQfCeCSl1E5+WULRINeb26sqycuJf9vT2Uq1Aq0Iwsr33NfeTHXuArF69ibcUwRBHwr5zhu97/n7C5ts5s3vG6Bx7g9u1dZvOpdLCso3YNAS/uvazY2Fhjc3OTHAJ96EghsWgXdIuerm15WY7O1+1VDrIMZCwljgmRGhiVGTWVuNJ6Xzo08l3Lxvryc1tu7AYBrBqKaHZ5QkaVLtCSPWfwg4T7Gm1YgqCWo7skfymddXl2Y0w04zXWT3huXXmWk+deSXt4Czda48z5C9S1Y1Jp3OqIuDeXjMMsI2KnDEMbME60ec5YBh8JvYwRdVUT+r50WRTBt0wmdelI9Xivub09JyEZaSvjhlpB9j1Wa7qYuHp9yuXtfWZdKJoUKXOuX7/Gz/70T/MzP/OzvPLe1/COH/xhbr/wUywu32a16GH2SAyqZPipksJQ1iS1lIIsNYDI4ciNRvzNv/W3+Ot/44f45Cd+i8uXLjJuag5uXiP7AYyM1Z1RRGpS7gpEUWPIaGvF+m6KJici7sWs0JVCYUUW0VicM5w99woeeug9vOa++4gxc3v3Nru7uyzaHqVgvHGGC/fcz8b6OnHoePbpJ3jqS19gWByiUhTYZmEQkTRKJXyM2BrGRtISjrvYJpFzhc+etss4FdE5ikA9DVSqpqlrNieK3g+0OpBLvJCrdHGjO1ISt2GX5DXZKOyp4DN+scC3LRErkV7WkpJmSIOE0yuN0ZkQOkQtnDAqs2ItfUqY2BOjoW5qQRDEBSFIASgmOoVOiqTLQThnkk9ElUnJiLNOCa8vRdDakl0UzEbSwm8ShTmmTLBicTcvdYmolxhfKZZYIyG9vEwx9x9eXxvF02LOZx59gTe8/h7uOmXJOuNSxcaJDdFbpERICu1KbIGCfj5ja2sLzDLvS25aPwyc29jiW7/9PYQY8d1A0p7nHvsCb77rPE994RHuP7PKpz/+CeYPvIW+tpx+1V34s+epq5E8CNZxeHvGHecUaye2yEEWJ9tU3Lh+laoZEVLEVhZtDO3g6aqKW/OO1c2TuMaysXWSf/eJ3yGGwPkz57GuYry2yS/8839BCAMb41UmK6v4wYOC2/s7GCXuOFs11JPMvF0QgwdtcNrhgwcttOwUAvv7tzncPSAGjzGOrutYzBYYY+n7QPAtKgcqZ6kqK/EbUQCVo2ZECJ6+76RIsWY5/MdVBmW1aHqQ91/riO8CfeglDqapi1A2o50l9h0pJpq1miH0qOzoDmeQFc2oFjeFMZjyc9quI+XA4cGhnF61EnxAjBKlUjYUpy1nK8u6s4SUWD17mspVeN+itHTbRlpztw+EFHkuBNlkjCb3A68yFSOjmKyv4NuB5AdsUkUbrjhaX6F2ks+3PGSo4oKz2tF3feHawOmjOU0X0E7mKipnOL1J0prJ1ipq7zbtwSEH/YLKGlxt6BceYwyDHxhPmqWACAg0leJN33A/o5HjxOYWH//1f8uD7347l67u8qWnn5X4IKt48L0PsjpZ4ShFrl69iVOKxfZN+vI+aYqGRgsXLKWMNkDMfPnpi8QIq+urbKyvMz5xgvXTZzl1esaXnrskRD4Ue4f7smDHCNpwausETz75OCklmvEIpy2He7e52i0YwkAO4ihr6prRZMyoaairGtc0jFdWsM4xGTVMJpO/3MXkq3Ep6SY5ncrhQvgxqvR/DArnLL33csADrJIRak6JSKZaBvlSuk0ci+OOdWdLYN/yyyobrIHBD2W0bllGmWYKLRnpFKckNnylBJY6Wt1gYytw8cuPcOKOc5i1MW98wxv5409Y6iazmM+pdCTFDDZDdjirsE4mBDllhhgIPpKT3Kc5DiLm1QV1oTXzNtL2kS72hOwKbkUcZos+oCJc351xaeeA3aOBFMqI+2WF0/I9ePTRR/nJ/+En+cmf/Ie89ds/SHs043c/8gvcuHgTSod3H+gQt2xanoTKW5lU+auSztrJs2f5u3//7/ONb387v/qr/zvPPfcUG+ubLA636fsBZaUIjMgzYXTCJs0QNH2WKBOlNTl66VSUbiHGEX0iocnZYLLm5Mk7+O7v+V7uu+9enn/+eT7xyU+ye7AnkS+6jOgV6JwgWZSG1dVV7n/Na/m+H34HT3zhYZ545A8JcYElo3QNBPoQxbGHJWlLCAuMddgCFQ25BwUja44J9lOfydGgnCOmSLfoiCEJSicPoBT9wtOHCKZm3NSgZBwZkVDeGCNWGbwSuHE2MKRAnx2EjMUwchaVIkNs8TGBa9C6ImlFV0ZlyipSiMK3SgpnkamFKdKaEmsVkxQ7McRjVA+IgUkjLu5+6DFKchJUcRHo4qKLWRAGJpeCd3mAVkWHWCYqOsvrSUvzRvqz48e+JoqnFAPViuH5mweEdAf3nNE449naXCUWtwpZZsZLVsNsNsWHHoMVx5FCwgEHz/pozBtf/xpC9AQ/8ML1q4xXR6iJpa4qlKqYDwNN1XBp5yq3b9/m9d99FkzA58jT24c4bXnteEQ/dCwu32byxgdoU+QTv/1bvOv1byP7VNwyluQHuumMpz+/w/mTZ/CpZ76Y0V15AesMZ5qGkAe6uMAvBnLomJCoXYPKirWVdeaLlhA90+kBs6Ndch/Q1uB9z6zrMUh8g+/mLBZzklKsq1UefN838du/fAOjNUPfEnzLm7/pHdzz5vvZvnqDT//mJ8hZY6uKnCVeRikYr0wIIdD3g4x2dHGC5YQ1hqQSTd3QdZ1oLpxjbatmPpXMs3pUy8JSIlGWwcfaZe665xVcfeaaVPGCGEYpyVGq6oqUcunoIKcksjgjkzg3gvfHCH6t4dtW1jhXaRYK4lvfgHUOsmS0+XZg0xp+YHWdLgd+fvc2nVJYZXDO8K31mDuswjY12VaE3mN8IJZOwTNveoDx+govjezK7xRkPCXgQIWOgW+uGlaUFy6LMWitCefOcD1HXvnae/jKnzzC/u1dPJmxNXKSymIp972I+GVmL92Bxbzl4Ycf56F3vZVb128ynS54/vnniyNS3pfoAy8+9xxGOe48f4pm5Lhy6QY+CjgxxUSyUfgn2YBy5W3NklvWCcV4Nm/J0dOMNNPpnDtObcniUE7kO7f3ODs+xXw+Y2U0Zm93l1FdY53h6GhOVTlCzAxDoF0I9qEa1QRg0Q703UA/DEynC1IKInxGcXR4+Je+nnw1LpXBFcftkvJujCqLvgzQRs4x73uxYmt1rLkxVh/PkdRyg8+pNFBfGr8tw8yFqC1lkpgQRBuliubnZSUHEjp97EUTy75OhBBYLGbc88CbOdrfpZsd8rsf/zgjnXFF4G0rfVzERJIE3doGExURmLZetJLJMwxW9KRoCehG0wXk97SWFCzeJ1Ai8D6YBa7t7rB/2NIOubxW2RBzXr4J8fjvKkt222f+8NP8+I/9KH/vv/qv+eYP/RCnXnEvH//HH+HZhx9DDQM2RXZVoCPjxSgvIM0CJ1UaJusb/JX3v4+/+SMfZjo95Od//h9z9colqrrCaINaHEgYc9JopyFkhphEy5gN1kp3PHjpiFijRJMaBeisyu9rUmZI8MY3vZnv+76/zv7eLr/5sd/k4OgQa7Qc2gp2ogiyIHlSFmzAdLrHw498li8+8Rjf+LZ38D0/8Gp+92O/xnTvGrVKKCJDzGAVQxxoRGVBCAPG2SIZ6MkRuihi78F7MI6cFXuHRxATjQ6sjiqcUSgqQo4YawnJyOt30sVZXV1l5AzZt/TDgCHhTMaaCms0A4bUazCgU2JIUKsIXoJ20QMxaZR2kBN9O2CcIRPQZoFKEUvpEKalOUJGjjmJRjD5QIzCvNPOHGer5pzFfFPwEUsnalLipLfllopJl1piyVvUJVpJHKU5imlLKy2Ggq91zpNSiaMblzj/+jdyff+AyCZ332GpkBeBNuQciy4yo7Pm/F2vAONIaQkpA2UNzWTMje6In/mpn6af7bF+cos3PvhN9Is5Xdtz4+ILzA6/gel8Ss6Ja5dehD6hPvB+NIah79i+dpHGNMwPD7j17FMEhPezd/US7WJBGvoiQpQxULdYMLQtziyZTpHoeyZr65jKUTUNSWeMk5tMVQ22qVFaE7xnMpkQfGBUjwskVOMmI3m9lSUoI4JvBcbVrKyLlsY4x/NfeQ7nHMoYiXDQMJqMWDu1QXc0o2pG5JioigbDezkluaoipsgwSDFgCp8khEDOJdMtxLIZZIyCs/fcyWw65cbTV6jrGhTlvyeLHoiD5oE3v46dq9tMdwWFf0w/NobaVZAy7aItMQqy1GfkNBhioGoayJqsBJWP1aSsiSkw9LEUDXJvDL7HLgsNiqU7Z3xKVNrJaw4Jvz/Fyw5EpUXoHfNAezSlcv8viqwSVk8Inq7vSj2Vj0eSOsprHYaeCMzagaFL3Ly2w6JP1NpgVUbAfRFrKnEFahnHqGInF3fkhFe/+l7aWcvKaMzps6fZ2tgseXmCCnjN/ffT1DXWWFJKHO3O+bmf+0XckmhNlK6EUthqTDc/QAJn5R4lJ0K3oMuWt37DG7nvrruZ7h5QW8mIR2muXL7G/e+6lwsXXsGdp06RgH7Rcjif0dSW8WhMiJGct0SYq5W8x9YVdpem9y3OVsTgS4hxZjz+7b/g1eOrf+WMaDOgwCcLtDLlY/fccoPU6qXgX62XDGwpkOSUXD43XoIvSufzJdG4Kt2lhIzNrbXSfT+2lpUfVvLepOSSn5Qy5Jg42rnF2snTaFdz5vwGVy4+xfXrL9DQohnhYtk4lGYImcaBUhI/goXeg60bksq0gyYqxRAhhlSKZ41SFp8yOnoUsPCJW7szbu3PmXe96FFY5uyVhuyy9Dves+QAIs+gvKePfv5RfuK//VE++MEP8sEP/TX+i1/8Jb7ymc/x2Y99jOcf/TzN/gG3u5ZDJEZGVRWrkxVecc89vOOhb+Vb/8q3kcl88hO/wx//0Wfp+07epRQ59HsYp9gcTYjdAh8hZIVDYsSclk23MzISQsosctZoYmF1JbQ1ZF3xLQ++i/d94Lt54skn+PKXn0QrYewZo447iKlIGnBI14mMzYkUAj4kuq7nDz/zB9x91z187w/+Z/zWv/4VDrZfFGMB4jZ3WjH0MlIlD+TgJZ5FJVasw6SeWdBC5HYGq4MUPF1CWUeyChDgbvZiBBibQPYZY0byvHcHGLdBNarQOaCVJRvDgOKoD6Qc6KKi1g6lFbUWOUGbo9zT3ov71I2wClbGCh8lqWH/8BC0Zdw4tBWdmEqJrA0xyvTDh0Lc13rJOxdNroIQy30UFKoCVBKgbBLnMCoV44t+2c0l99pyyG6UuAxRJf4tquNR+J92fU0UTzllrj77FMMQOHXhXm4qRR8mvPacxWlV+A5aZu85yua+OKSZrIhoEbV0NGKM5ehom+uXrjCbzjm3N+X+N7wZ37e0fUf0A33bE/oe7RQperQ2BAU5R3KMWGOKADTRdXO0q7GmIg0DKgWcs+KyCAPaLAsDTVU3bGxsElFUTUMMnmHopc3tM86JIJ5YHhwt3Jbke/qFZEVVVY21FQy+iE6VjPFGNSF6TFUVC7LCaMv+7pR6MhaoIhpjHLL7Z5S16Lom9p66rkVM2fdlzCBZbaqMDKyR72/7QUSugjQS8WcQYqtSSlhUOdNUNSkVK38SrkzMmaHzBaUvc3/KiVgpJZuKkdb9MAwsU+RRAsUbNQKG817y1VIZaficiUqRk5KRnngvUUaiKCyiycolwoESRaKK4FWjJQSzjFJSCGTjSEozb1sq54o2pxQTKGKUonDohmMC7XIBT0odL/Qxir7otRfu4f8O0A2SRxdyJHeBGDPWSkHtfWL95CnCrW1SCELNT5EYA1UtHaOqnEaXmAWFEpePW5XRC6LFSrGMBXQJCE4RpR2pgFl1HsgxIYd/wVVs3LHFa171SsIQ0LVlPGo4altcvcLssGWyNmJ1MqHzA2Hw9P1ADJHxpMFaSShPhUxulNyvo6ZBKcV8vhBERJTN3FhVWEN/zurzdXSJOLw0L3Mq0L2io1tqkJYFUyrjhqV1PuXjsU1++ciuIFKWz87yHgREc6MKmkyJzioILl/uHS0n7FyyHLPOxKiIceD29m1WNzdQpkYDQ8ysbp4j+ASqImlINlMZ6SSpcgJvAwwhMrIwhITKAeuM4CiMRSkR9SpnyEMAnamN5qgduHZ7xrWdWdkACyb2uLtW3sPl/xcooowT5DWw1DIiXYirV67zq7/6K3z603/A29/+dh566D1833/34zilOdzbY//mNvOuJRrD6uYJTpw8AQouX7rIx/7Pj/KlJ59gMZuKOWnJK0hCm9adZj4cFsGxJWaDrSLOaCZVTUJzYvMURsP0YEbfzUGLyNl7ed5zgte+5S182199P49/8TGeeuorGCcRXipLx1hgqrls6hyPmdAS/WJMBSYRoid6eOHSc3T9wPf8wI/w0X/5z5juXiKSUX0mmYwxkaAMIYFBUBbtkFBjS2UtlVE4Dage34vcZdVB5TR1SmRfIn+QtUmRSMqRhkDvE9pYdg+PMNagkmdkLaQBshEphE6sWMusX6BdBNVgCJjsISusUWQqYl7CPCPaahZtRCmDqxxt22FyRU6GgUQI/fG0CSVAV6IqyJcseiytyVqToxjNiAZlhN2kkrhGSXJgmR3sYZwDo6nqWopWVNEGZrSSAk1rR1KZGPs/85n//yyelFIXgH8JnC4f8S/lnD+ilDoB/B/A3cBF4PtzzvtKessfAb4TWAAfzjk/+uf9jBRFw3PzhWfY377NytZZbq5sML11mje85jyTFdi+cY3TZ06jtFT6VmuMVrKYJylGYpY2XE6wdzijHwYW/SBjp6xI3mMAkxWTcSNzemA8qompp712kXr9deQUpUigiDdLPIdW4BKyYPiOG49/nvH5+zBONpaubdE60/ctYVgw3d8jJuD+19H3HQfbeyQUtTHoyWZJTU9sP/UFRneeL5bRIlKrHMnIaSaUeA8/eBmVxUTyGW8yu9t7bNQ1qsyQUYhrb0j0s05OQQoq15BSZAgeEuy/8AwTPNEHlC5aJGDoerJSLKUOk8pwMJth6nV8KQZUpahqC/ll4zfEfp1TZnowRRVHl1K6WEjz8UaalXqJPJ0l8FEjm611pohNAykkab+iIIVyKk8F8CcPVNu2Avgrp/khRHyKVFUtHRIjoweVpDdV4kiXZ32m8wVV3YilNeuy2SmJZDCKPg4S5aOEw7NEGhwLCa3Qvm92h5h6zHR7H8iYoI47C9JFgqHtOH3hbmqT6Oe7EGfU0fDMlx7Dx4xKc5578ov085uc2rSEpLBN5ukvPclkNCGXU/jQ9ayOFZUz8m8WbBUwNpGtoloxkk2lDENJR9cKnDM8+eUv44cepRSTScV8cYTWkZQ0kcx0OiubJSxmPTF11E3NPEiSfQiCmDDW4IBF2zH0vYhW9RJkIS12rfVXXS/+l7F+kWXcLdqkJTagdMmRwmpICVX+HEIQZ2R5HpJUQPgoYRhCIzfH2XOUblPKgrUwehlKUk7MRqONYvBBDBOl07VsROXyeYTgOby9w9rJUyhlCv5F+mWLdk7XLaiyYtpl0DWDwOrRWcTbo8rSJBiSoh9g4SXMdnXckDEYk0hBNHeNq5j2kRdv7nLj9px+EKNKKh2AZUzKslv2kqO3/MYZln4pKbTyMXEfJKNxb/eQvuvZvnWDT33qk5zYOsm5s+c5e/ZO1tc3cK4ipsDBE4+yffMaO7ducXR0VOjScmhPZFQyVDWoBKEPJCWdRFfqNxGfW6xOeFXxhm9+L+/9jvexub7K/u4uX3jkYb7w+Ye5dfMy3stmf+bsed7z3u/k8sWLvPD8c7haIrpiCPhhoO86+r5nGHpS9FKA1BWuklG5tY7GOpSVDp510l25duMyD3++4bu+/0f4N//bR3B+Jp+RCVRGdF/iEIwYKobkyURSNoxHGrKm7yPGJqbeMxSYZiajY2TwYGwiDkkCdknkrpPum83owUPtUGqgz0LRFDOwY9YJ8sCHhMqW9XFmCJYhiEs8Z8NanRmyJw+gVcIEy9a4opu3UiDVkKMnqYaYX8onNJUVfljS2BJYH5OEseeY0CHJIbk8hySNLgd3EBzIYjZj58qLjE5ssHvpOq98wxsYra4g2Y3SnEnZkFSW7yXLIeDPuP7/dJ4C8N/knB9VSq0Cn1dK/R7wYeBTOeefVkr9GPBjwI8C7wfuK/97O/C/lj//3Eu8JJluvsvQTqnqCfOdmxzOA2cvnGet2sTYmqayZKANirxY0HeRydoaKWXa+Zz5fAbRMJ6s4OOMIYobQWbz8ZimG7zHZ49WmtXJBLRmfP6VqAQRzdadJ0FpdOVIXqi+iUwoH2QCTr/+LUyPZvTtnLFT7M2ntLM5ISRCgJwF+Lk2bhi6nm46J2YIWhFPeUSKGLnjtd9IHDnMpZukFGiPphwezpEMNKGTjyZjdub7LOZTUt+VcE/FeDRiZKzoUVrP9HDKiy88x+Sk4YXnb9HNFzhViqOcCF5as4c3r9JUY0mvNqbQrxNt36KMYLKzNbRHh3gfaEp3ySLuB1s5ltl6ciuXpPasjrspsjAW/YezcmJRRddRFjA5gcNkbUJVV2hjGHoRwMZQNBeFQ6NK90iX6AetjMzei/XbIvltTdXgnMPmfLyZ2WSJ/ZyIdBrJGp0ToRuoq/p4NLBcoUMMEi8SfBk7yia0HLuRZYPrtebFZy7y6B8/Lr/3soOQiz1aK5KoQgkxkqKnqR30maY2pAS7z1whoek6z+xoTruQyJzagdVACPiuPS44fe+pbKay0onKOuJ0QBkRSSqrCUGTdabSQklzlaWd7bK7vYdVEGPi1PqYo4OMD4GAZjY7YjS6hzoq/M4eQWeaE5s0jRMNmtJYm4oeTYrXVMway/BbpeWNrGp7/L59la+/+PXrZaO0jEBSdekiaUQftBSl5gzRe3BOxrc545df02WxzyXwVksparToL467MAX8Ko+QFEpKqTIST2XDWXas5KDiQ+Tw9g7rWyeJSqPTMnhcNpuh9xIabBJeWWKUkaPOGZUtlQ40iGg4D0rs6CkDlhASxkSIlsom5l3k2RuHXNk+JHhKHhmkHLHG0Uwcs1kr4e7HRV4pk8qmRSkUl1/JpXhajjDFbmaYTud0/cDammfRdty8IfpPbSRY3hqJvbJW+FkgtH1isbGjcFVGK4utpHMUY2QImd5qVI4YAl57FqFifescp06flW6HtZw9d4ELd93N+77nQ1zaD2SOAAAgAElEQVS/eplHHnmET3/6/+KbH/p22q7n2vWrKC0E+a7t2N3bYTrdIxXHrbM1OSf67pB4RAFuGkajFcbjCfW4pq4dxlpJSkiKF55/nvN3nuMb3vntfO73foOUInmImCwSmJhEa9drSQrQbWRSB1bShKQkUSCGTK3FlU3W+L4nhcQQB1k7tQB6awdOO2KOxAx+SBBajFJ03QKfE52vmEwSWhvqymDHE6JWLDx0rSegyboixsSRF7xAjr0UZM7hjJfPyzgILdZW+JxLGHF5mNCSragMymZUYc8pi+AKMCRVCsGQRCajlcQHhUgMHbPdHXwYiPt7kAeme7epJyv8P+S9Waxt+V3n9/kPa609nvnec0dXlWuyXZ5dLhsXYGO3wLgBp+mEvEAgQUFKiKI85CXJY4bOQCJ10ko6LTo0tOhYiULSgM1o3MhgGwoPZVe5Ble5hjufcc9r+E95+P33uReEG6IWxiJLKtf1qX3P2Wfttf7r9/+OSuerL8tLbJLYi24lhcXf6vgLh6eU0i3gVv7zXCn1HHAZ+DjwofyyXwT+RV58Pg78UpIr/wtKqS2l1MX8fb7F4iMohdw4AVJD13ZUFoo446Vn/pgYNNeu7XNuL6Fe/SavvHaDSdsQPXICSCwXc64WFX53h8uXrrB3vkU1iRgihTGQEmXVQ1tNf9BHFwVKRZbLJSEEjHSVE5UCbQjeyT2aFy+fofnCWoLPSdYogop0STp/0FYSUJP8U5YWbQ3jrS16gxEuBK5cusyDjzwK2kqAZX+E7yEalqyrURqMrfIFYhgMBoTFERcvn2fc7/Hi89/AKsvA9gReDQ5FpD8ccnjrhOuvHLO70+M1Iw3tOp/f6ANawdV3P8m5i7vET8iD70wr5D2x7ST3wkWalcCyjzzyAO97/1v4+jMvcNI/lotYKbquI/iUF0ePNQZdWFyKhBizndmJJiv1RZeTqVhlNEGJ4JLoqVce33W0rRNqSAuUu65G0EBs22wFl11JcJ3ofVKSWpOU5DPL/W4hBXm6aZOFu5GUDBJWFNjcGAllmcSiul6spRrB0nbtOoMQaxTKpXt6vzTL6ZKTk8lZgrpgAXlCzPRbjAlr5P245Sl37hxTrwK7lwf0di/zXR//GMtlx8v/7P/k0Xe9m5u3a6594UWUUQxHBW987K3sbG7hvWTpzCcrfut3niLEhjJbpct+ix4M0cqynCi6NX0Y5OFY2EBRJsav3+ZHP/63AIUtRjz1zGsY21FWmtt3jljMF8znNc0rB1xfTXj4yXdKIG0UweyapkxBqnjOPgstKKOc/0CIMhSnP+d2/3Ye35b1CzIFp/B5k1Vo2fkmBTZfe6tc4l1aKeGOKVdAcDfHyWgllups7jDZgapzL55G5ATy2rXKClSSc++jpDIbA5DOaMTlYsrm7i5JW4gJT0JnSi+SaNpOctoIKFVILlDIFK0Wl1XjIr08XI0Lw86wRyTQdIHKaloXuHXS8dyrByxXjfSJ5XdRVYoL23sMhj1eu3l4Jqr/U8gTIAMi+cJZj6NyPyk4q+2QSBJx1oa2ozucUJSGwbBk0O9TlRXGGnwAbSJFFClGiJI35eqOVd2yv7tJAnzyRC2biqhy6nmQ/C5tBVW3dkTbOQ6PDjg+OZJcwsGAoijQwP6FC3z0Bz5K5wLnLlzk6OgOTVMToid4T9uusCaxt7ubEXGdi94dvV4P5wIhBFarOUfLBWXZY2Nzk8FoQG8woip6ElVB4vN/9AV+7F//N/jaF7/Awe1r9LTCq0BhwblI62TNLExk2Xk8BmUcSvXEua7BGggZWW99YFBaki9BaapSyoqLYgAFDIqCdlXjXYfW0iPbKxU6BEwlQ43WRpou2oZ+qVl1EeU8KEGHYlJoAq2TjW9hZWAKOhKSIXioVx4drTyJFaxjBmKS0mLWdF3Kzy1vSTaRXAQlPY8RQTeDh2Z+wsnhEdsXLhCUxvb7tMsZbRdYTCdsXXLoZDOzkIu2kyK2LUVREMyf0cPec/x/0jwppe4H3gX8EbB/z4JyG4HFQRama/f8tev5a/+SxWc99a3rIBSVtQyGlm455crFPV5/7VWeeeoZtrd3iO2cpmup6xUky3x5B2sMV95wH8OtHebTKY3rqE8m9MsNMAbnEkoV2GqI1poLb7yPqqrQ2tDr90kx3N35KOl40wrODQoaL9DfepettaYL0hlklCLERM8ozj+4xd6G1I8IBBgJETY3xxwf36FtloSQuH3rdfa3hINfowmJJJkqJJK29IcjohcOdjgQu7fzgStvuMqzX32JohzzzsffzcNvf5Sv/+EXM1IiNs3lYspq5ThZLEVYbYs86K0DSKEaj7D9gbjrtBJXXEp0XYcuDP1Bges84dThnGdj2OPazQO+/Pln8W13plWIMZBIFEVB5yIqGBanKwoKfvAjj6GD44++cp3WdUQvgZlohXM+D7VacktioCz7Qm00gRQDmxs9tBYEw8RIVxluTyZCh2WXSoweo6EDfnU6ZeECgx6yYIUgXXF5d560orCFLFStF0Hlqs7p8jIcrL3MSUFRSjxE8ImgJfuDJPv+EDuwisPjCdGvod27Tqd1TJ/K2TrGiialKgraeiWv7TzaO27eOaR1XoqI60bCCXXO6VGJzklYaMpIZIwylHdehpYYE8E5dPBgCzofMdZiFRgv7skQA8F7XnzxFY5Op7zxyhWuXr4gFvvCYrTm8PCE8dYGw/1z+PuucN51FKXNpda5ziND5T4EsdmnRIhrnYBkfaWUMIl8rf11j093j7+q9SslkQxEJQiJyfdSWNdKKNHkxax9KotCqiSUxHMUWswaNlNwKSlBC9O6eytCDFkKZDIxqiQxWaWzCp/1mVZ5TfIpYEg0ywX90QYhwzxRiSYnRNF3RqBuheIvegZtNapJ9AtZ62xG0GRQlhRsMKRoxchAw+mi4+lvHnJwsqTLAztEBr2K/XNbbG+M6NqaF187pGkb7upMBElK6xNJugeNynotOcvyu52d87vDOkk2Y20TaZuWiVpgjMEWNveRGrmnY5Iwzs4RgmNra4OUxjgn/ZfBa6ISDgSVs7ZURGf3WYyew8M7fOlP/pjYOd7y2FvZ29tlOByKZjEmPvOZ3wWlqesVru2YzWcslwuM0vR6PQaDASk5QgDnnYRVRi+pm0l0jsPhEFt0dF3k5PiIth0zdhE19BRlSVKGum15/vkXeOLJD/Nb//yfUFWGrhMkuFCKamhpXY3RBSMreqMiJVxaoCNUNqJixBjomZL+QBMIKGXRRlFWBaURaYDkVzmMTlSlxgVHippCQ1SKrdGAgJiWfPBMVzNmCwjJYbQgf2WZhAkoDJtVgY+Jwkach6Ska7SNnslsRechFJVoZhFU1mT0LisXhLKOCa+V9JZqzu4BpSWo1HtP09bMTo9w3pEiFJUlugAqUi8XRO8xVZEvR9kI+q4TZLG0JN99y/XkLz08KaVGwP8F/Ecppdm6J0gu5JTUetv+l/9+PwP8TP6zlPnhcudTLsCczTk6fJrilUp2XiTatmF2MqFzYpNVykGK9PobbO6cZ3N/jxs3XkEtNck5iqLlA+95JxWRBx56gMVyxoNveojnr32D85tbVFXFaDQUaD2JSLIsy5ypBMUAdrcsVb+g7Fmc0NM5j0QGrRgcj3/XJY4nDd2qJgaPMZHxxoBLVy+RrJHen0Kom6bx+OBAZfFkPpXGGJLSbO7sMT2ZEHyDMhUXLl2mN6yIIVLPavr9HkYbTk6O+eyv/D9sjs/hOsdytWK1aLH9AQcHxyxnC2IXsu5Cfsw6E0utB6kcILnOlkkpoq2sXk29kKEyQZxPsJsWU1h8KwJA8gNSBOCio3nw0fuxWJ54/G286+Eev/uZV9FFj16l6Q36As9qhXMdKQR0ihRa0zmH6wLaGBKRy5d2gMjRyZI7tsfVqk8cDdjZ20Sb3GCftVQGzY224/lFjVeR0eaY0WjM6eu30YGM3iWsLmQHOF+gbIlW8PDpFLPWVa0t0ihBvQqLb4MIOHXCRBmy7GBAXHmM0rx0dEhSmqoqxHmYt9BSXSaJtSmJkcF1TvqVlIju46IjLleMRyN6XYvSmu2tTYqylGshoxJ3F3xPiJHlYiXEjOKs1DqlSHIOHwpQVoSoaxTTKnq6R9c5XOd46eXr7AxG4uq0QoMrlTg+OuXw+JiV7eFToFdWhCC7YWMkNC/ElClZ+flGW0pj8VGGf43keBmjSSHdM07+9R5/levXxUuX6LwT+tiIwDokob06l/DRIUXAYK2VYTZIbVJpTKZ117q6dBbSKk5JjU7i7JJ7LW8yM8JljMmhkDIcWGuz/jOgO0e9WtLf2CCiz3LMDDKWyOArA3DbtfjYyZPJBwqTKDKN2HSRfr9HZQ3LriN4CFZTqg7v4KWbC5559ZhF08imQSmGleHC7g6bG0OshlnT8I1Xj/DeZRouZlwMzgZsJfLddS3RejDi3hEq/1+JX1hfXeswh3im9fIh4LxjVXNGs9+lV8WVu7U1ksFVK3yU8vlCW2EXSotoJg3GgtWK5WrFw295Oz/0sR/i5OSYL3/pT0jAG9/4IBcuXaKtG77y9Fd59xPvZ7VYMp1OmM0mssEre6TkQRV453GuxXUJ51tIWXOUo1nQUMQCrTzLZcfp8SEZc6QfBxRlH6USX3/h6/zoj/wIO1ubInUxEqprtKVvI5YRTYQ4qLAqojW4LpCszpVOgRgqQhKUmKBoQsJEMDrgvfRvgpSiV2UPZfv0SglgrozC1Q1N4ykKSHi61hNcog2JuvGMehVFaYjFgKY5oVIFKQU8Bd4paidhxy7CcjXnZDKnVQWqXGua83qqsw4pFxMmBdEIEqlCENApS0QSMmwFJe3otjCcHN3Ch8SFS1eyNlqqpLp6RVH28vAO0TsUCVuWkmGW/hWRJ6VUgSw8v5xS+pX85TtrOFspdRE4yF+/AVy9569fyV/7U0dK6R8B/whAa5OEksgstAYXGuLC5R1DZM0BtETGG2P6gwrXNmxubXDz5gFdu+TFr3+ZR9v7+b4PvJOgIsF5jCr46p2aS+96PxvDHj/97/0sw0rz5Ac/QFVY/tZHP0QMii9//Wu0k45HH32Ef+snfpxu2fD4+97D8y++gOsc9z/4AJf2rzKdnrK7vcO1OwtyJBqDfp8D7Tk4WNKLA5SWROq9rU2CW3FyeMKFjctorSnLxIX9bUbDKk/ReZRZ77pMAK0Zb27jhwLXF/0eG9sbuBg4mdX0RyO65pTTO3fYv3KJ7auXJGAyCmKjvGdy6+hs36a7mLMZJRDsLIF43dCuBEEjD1Q6SK9QbDwqJmLsmCxm7KwG6OilDPSedU+GPjkb9cLxpc9/hZ2tir3yEjdv3KHShuPZgn4hA4vWStCcEHO3W6QoKrq6w5YlVVXQNB2nkzkxaa7HwHvLiG46BpmXzk5wQvRoEtvWooj0bEnoHNdfu472iVYbRknsqioGVJRaFEByp1zEFlmYmm3IKg9RWmk6L3RcmxR///SY4DwfD563VT0mXvHHkxmRhLtHo7FeqVMU5DFFqMqStm1pO7EBo0BvjdCFpSg0o+EOppCkXUHW5OcrpdgYD9kab4ijMEZM0Ge1GHd/ZMK3DcEoinJA8rWUfJIyzO1RCqyxrGZLNrfGlL2WojS4KDDifLqkblbsntvAp4RVUi+hjWT3NN7jnJNdXMqVH2ot6802+xAFNgepqfDfWnD57Tr+qtevt77tbcLyCUSDjwEfRBvWeE8MgbIwlEWFNSanF6ucjaZzl6HQcjFnNQnNKzuemO9Nk4tNQWgS0dBJKCVZD7RGaaLzLKZTxlnjlKMD83uX1HuV5GcolQhdR6EsRREoVaRzUepfkNTmfiHOOylsF2ooRMvzrx7z8o1jXBB6vCo1D1zaZHd7hFUaHzTT1ZKXXjuVwSklSJqo4p9KcFb3/s/ZrCSYsMpQVMprmLzu7qyrzvRg6p4bIjv61gtVPoeibQkMRiOG/VIGUKXFsWruIr5Ctcu92zmhgqxSnBzepigsH/vhH6awBd948UU++Wu/zhe+8Hm6tqPpWrwPtLTcun2TelVT9UtpdlAxZ+vVrJYN3rvsJlPYQnRZKW/eJHZPOkHLQjGbH6Osko2RNmirmE6nNK3j0tWHef2lZ+j1FH0Do16PZecpFZQqcTRfEpxme6AYVT2KQrFoSo6WLYUuGEQNhWbct5g2UnvREnUuMSgHVKWh7TwpKQqrsYUleS+hlmUPa8EoQx2Eoh5UBTEFvC9YBU1PF5REykEf7zs6bwjR5RylwHLWsGoblvWSyWxO1x8xMoaABL/KVJN1pzoXxEuwIymSa2oURheoFNBJ7qWSimo4ohqM6Jqawkogd1RK1mU8LnejaiU9ha5p6G9u4kPEq8i9Qa1/9vjLuO0U8I+B51JK/8M9/+lXgZ8E/uv8739+z9f/A6XUJxCh5fQv0gvIvRGwxtIfDOhch+skKh0FXegw1jDolVy5cJ7xxoBFvaLa2Wb/4nnuf8P9vPzqq3RNx6OPPEjZFw5aE0lW88mvXCPoG1Q6UebakscfvMCrBydsDAdsjgZc+8br7CXN1sGM933vRxgPe/RKy3/x9/5e3nlo/skv/jzL2YyNzW3+u//m52QbFAMf/p4P8wd/UHBhY8n57X3e/PDDvPUtbxULd73i6uWr7F44T2FLtIGi7FOW/TPb8nqxMNqgMZjQMupXNE2ga2t0WLKYziAEZkcHtHVDWWr23/M+xpcv4OYzSOIo7JWK6Guib9DWYgsFvjtbFELWS8gOLWuJcifQ+n0UhSWhKHqWAQMee/hRzj94kc/+4dPUq/rMBSQPbxnC1r1CRWnZObeJCoHXX59gyh5HRxNSkl23ys4z770Mxgil6ruGqjeg6FW859GrPPP8azgP1iqWKuC0xnYdJof+pVwC56OEaW7Zkvv6A7pzmxwenULwxAAvesd7jGEYFS4LuCWCKeZ4A33mNFyfhEQidJEYtNTyZLrqVnC4EPjV5ZJ39Acch4ZZElom3yt5gFJni3ZaRy7EIOnpzd1U8OV8waDssVjVzOYrfLPi5PCIxXyWu83EJVfXDZW1uX4AlnUjrrecBm6UIqQgbqnRAF1UOC92YmMkdmKtfdI5sdcoQ6EMpS1xnQSB+s4znc944OJlTEwUVUlZlVlrIoXVyQc67ynLUrJcyjKjHVLx4JwjpkhhRRBdlcVftMT8lR7fjvUL1hS2VKfEkDLyIWF+1misMRgtJoLghTqLIRJVwhb67KG/Ho7WEQTi2Ms0Uv6aIIWKQkn0ydo8QhZT69CyWCzY2juHz7qhNfIcs4MphXRm39ZkN14X8F3AlZGU8angQVmo2w50SZcULooG6PlvHnDtzmmWM2hGg5LHHjjH7maRxeaa5bLlG9cmgkyv076zmwktDqezTceZ2259rAcldYYM3EPcsdYOrOMd5P7LTAbp7kvX30HdRUvP723TL2QHVqmEKYV2tTbROIhatJmqEJbBalAJVtMD/uE/+DkeffRtPPGB7+G++x/gez/0PXzqU5/iS198ioceeRTXSlHwfDZlPBrRuRbnOppGXHbOOxTSc1mUlSDLzgFVRniN6HeUwtBCLNG+oV41FDmQsqAgEbh9+4BL9z3I9PY3GJYSDLwWyKdQo4ym7iKr6DhtIqeLJa/cOuFo7ui8dI1+8B0PcWVQSGK8TgzLCMpQFA4XW1JTEEKXUSBLqSQ+xSUr5c/KoGODT4aIxnlF9BK0akhYLFZ7fIDIgKgNaJ+vdk3wDaum4/h0wdGkoVQdY8Am+TyT1iQjV4ZOEHNDRCQPUsrkjCwyYinIv1Gaajhg+9xFmnZFt2hw9ZIQolz7CubTGePtPRKRxekR491zgkImUAhD8K2Ovwzy9CTwE8DXlFJfyV/7T5FF5/9QSv008BrwY/m/fQqx+b6EWH3/7b/oB/R6FVVviIqJza0NOt9ydHAiN1MSTdCT73k373/f2/AhsmxqfN1R9UtUjqF/9KErpJyX0tSLLP0OtCvFzq4iFRUFIhg3QFkZgi447hKTkxXXjuY8N5nzfBxjnr19tuuw1jLoWcaVYXs8YLNfsjM45frplOeu34Fmybt39vk7f/fHKHO+TXKeX/j5f0iIUYTvZcF8OeP03/0p3vrY25kt5lzYOyci0RzyBaCU4dzuOS7tn+fOnTtSu0JkenBAVZSc391hOCwZ9kuqQZ/trQHz557iDW94ODs0SvbOjc+0KUVpJeXaB6zNA0cESGft4zGG7M6Rh37ID1mlYO/iOT74/Y/j25rnvvoqJINSJi9CObFXQWGk6FMjvV33P3I/h7dPuXl8ytHpirrxZxST0RqNdL2pHEimksb7BG3LG67sUOjIznjEpA34tmPbFqCh2h8TN/qyg17vPkPCxIgKgTeVBb9/NKGvJBhv6Rr+JDheMIkf1JrzsnJyl6CR62Ut4E33PMBEkyUhoimlnN5sUDoStaJX9bBNJ+chf4BrIe/Z4JQ4g53Xh8uDrI9gC0tfK4Z9CQXtD0ec292jX1WS8BRFL9Dvy7Dd1A1N3TCZTCRKAYt3kdJY6kZ0aMSAshajLaDpXMAYGczX72l/f4c2SABo24l2jySlm0cnE9quI6VE4zrK1tCr+swXS5z3KJUYj8dsjDcoq1JqIIi41mW7e0OvV2GtwdjiOyHn6a98/VoPTj5ng6kkSePr9G9NxOq71CaZVsqZjzmE1tztKkx3E8VzuMddSiIpWfMAVJKfgWyKnBPTyGI2YXP3nOijYpShDYS+voee93m4K0tLDJ6oAxsDQ/SGmZNeMh81TSd1TdpEkjL0eombhy03DyeSU4f8Ip2PvHJrxu3TQqz1deDOdEnXtqLvyvtEtQ4sJJ2tIemeAW9dwRXPlOPq7uCk7jnrAtLc8xp9F83PVJ06o/nW/2j2dnfYGA6ywzjRJjlPioTP46YhSDBm1HgUKZYSzqgiOjS8/PUv8vzXvwRmhK5KtM1OyCSSBB8cpjDYQmNMj/lshg9w9eobuXz5CqPRmKIsKQqxyS8Wc15++RVefe1l2QgbC3hiKMF2FMHQNku6nmyMTNaqHR4f8eCVfULwrJattB9g6XzLynnqNvD6wZw7p3NmSydu8YzeYyx12/DUC9fZe+KNgsqngmQTprJ0q0QMjrnXqGjROpKCwrUdvRy1YZRi2KtI9EBpfEqsbKLq96hbh48aa6FzLXXdYoseRVXS1A1FaWlcy3Sx4M7xhMPTOfM6sTNyJJU3pSk/Z9JdicgacTdItExCXPBEiZIlxw4orbGpZDDeYPf8JU7UTbpVi00Rb+Q6q5cLElBPTxlsbKNtlWNGYr45/xWQp5TSH3DPJftnjo/8Oa9PwM/+Rd/33mM0HPCh7/sufus3P8tqtaJumjOBLcCw1+fCxX1WjTgDyqqg1IZAFF2FAqsjQSe0NvS3trBaURUFQUVurwqaaGjbhtKv8Cnyx8/NZTenDLooznJZIgKheudoHYQuMGsDBylgJzVWGwieVw6nzL72Mm664BnzR5hsbR9VllLD1mjI/nafzX6PQb+ib0CZigcfeZj+oKKwIiQWSU4Sqi96trc2+J//wd/n6PiY6XTGZDplejzlLW97C7sX9vj6177G4cERddfRHt2hW9ZcuXKVrZ1NLl2+gMJhtUGpwNb2kOWiAWUYjATRizHc+2HJbnadv4TYiZtaCl6feNc7uf3aTeplTbuYs7+/wWpUZT1PDo6MCas10YKPcHo6pQmao8MTlienGdXI41lMaC07hs61WI0UOxuwRqyl913c45lnv4kdbnLufMXtWwc8u1qydXmD+x7YwJ0u79EVRbwP1Js9npo3/N5sypYqMCXMk6IoLXvbI6Zt4GkUP2wKnFESLJeA4AXuLQru3WAkEp2vpbk7BbzzEvyZ0a6A4hMnJ8xjkhqEEHNxssob4nWCtHSJpTygKqVomkbcVzm4smsds9kcS0HIAXch5koKIHhxMJaFJYaCfr+imXuhE0Kg6VqGVY/oIZDwrqM0FUqRU77luk4p4J08tAa9Ct+0RJ/oOidmgTw8TmZz7nvgjRASk+mU4+ND5rOW1slQNBgMaOuOG7NbdJ0MbMPxgMJIP+D29i6FXZeTJv4lG7dvy/HtWL9AdrohSS9WrxSrd0qiyUtkyikjUlK/Iuc7KAnUhHQ37kHd1emkfN2ojLCsAxEU5IDgKEG9WoIXl4s5mzvn0KaUTsozSiuKpoq7Qn5FkkwbrWmbFoMAHoUJFIWibqB1CmUSizpQVpqqUihtuXVyiM9J4mK20TR1x51GBLYKcrQAkoSeZMhKURyC6p6kZ5nd714oxkqsic3hvWsKmzWyGxM+BkIQh2AM4iqNcY2mrdO788eucxAmlt3dTfYv7lAghh5rNYUBRTZGaLmPYkg0KWFioAsGpT1YK6neWmEV9KxCxQUnR0vuTFZ4n3PmvIfQsjneQuuUnWKR6bzhwQcfkRoYkzdjKKwt2du7wIX9Szz44Bv5zO99mpgc2iiKArpO0EunPcE5utahaYkx8dJL32ByfIvn73TMZnOaxlHXHW3IidwqZnwnSn5UzuZOiLhcKZgvFxycLNnsGwrd4aJl4Tq8S5hkWQbNoNcn+UAwKnfrlSQFxpZ4JJ9w5TsRtOs+CdBWY30HZSVRCCS0NVRlj65tWC0WnEyXHE5mHJ0smK8cXYS2W+UwjjWwkEgqYYKYJ4KKKIPopJPYDbL6BKWyFpAo0QY6kQwMx1sYDMvlhHqxIDUrTPSgEovTI3pVn3LQl07KNZ2sBI38Vsd3RMJ43bQcHZ6wuTViMV9SWsvVyxep6xWrVcvVyxc5PJ1wdDIRK64yVEVxtjtLScaeXq9k1C/p9UuB8rQw/XokEG+1OcQqqHQOEAye5KLYXq1ohno20a8swRgK7dBlkVOrA8oaye1J0qrtg8KHSOOh86C6yFHTgvMMTxs+8Og7+I1nXuXVg+39mWEAACAASURBVBlN1/D6Hz7F55cSb98rLKOe4ebRjM8+f42gO4pVwxdfvsXGoGBre4dz++fpFYV0ZAXPQxsP8HP/7X9F2zo651gta2azGefPn6dXFvzkj/8Un/vc5zg4Oub09JTJ6SmzmWdjNOAN99+H1ia3ccsCeoaUsO4fTwz7Q1zdEolcfMN5vvy5p9neHjKbOY6OTgk+0CtLcSNk6DzEhPOyrVyuPG2YY0LH5cs71HV9NjiNxgNZw1TCe49WojtS1rA1HNNFyx889U2CLnGzmewubMGb3rTPBz7yMJ/6zWfZvbiJXNqib+h8x9ePp1gSH37jFf59o/gfrx/z+21HGwJFWWBqx4tdy68Yi6WgTPDdSskDzhhs+Wdvg1w2rYEQ6WqJR7BlgU6WCfCZ6FFKU1R9LHITX7p6hf0L+1ithUrRitV8xTNffZpIztPShkcee4imadjc6nN484j//ud+MYe+Jv7L//x/YXlyjIsyNLWrjl//v3+bzdEYbS29qqSe17SdowtS+Nq6DmsrlCpxXYctQdxQ8kBxSfKunBOB8Ze//AKLWc073/5mjLHyEAzCCR4cHPPMM18jxUSvX3Hl0hVOj6f41MdaIxkwVhxMUhcTqFc1wclQMJ3MWK3mTCYTlDGZjvibfSilsFZRmbu78XU8QWFkiAghEIzG+5gBlKzZCJ4YLD7Te2ttswzb9yAv6DO9T8qOWdHEiU7Rdx2r+ZTR1o6gwylltybcFRHlVPOkpLy3sPg8+Dd1jUH6yFynaBLUDtoYUcpQ6oQLkVQH+lWgbjpI0rMnGl5JQ7+rEcmDUaYeU95UoMLZAIhSlGVJfzBgMOjT6w+oigJbWEA2RiEECbOMnkhOR8RkPZg/26iQo1G8j7RdR9uIS9h5D8mSCAxGPR58wz5VoajW+rJCA0YGL28xBqL32cpvURaUz0WxWu6fwmjwLcEZnE80bcvp6QQwdF1LioJmb28NcXnzE5xhuaqp61oaBYoCrT3eGRJdZlkS1hp2985x4+YNev0Ka4VSRRkq3celxGKxIvpI8I4v37pGvVjQdoEYOjzrQFFFaa0U74aAcxkFT6LfWqtFCJEHr5zjvr1SBuA2EHAUZoQKNW3TEF1NYzYwwVN6TTKapmvRymBRFNqTVKRXFIK6tYE2yz+Gg7E4HjuFihaDYj6dMWsct+8cczhdcjptmTcdXYgEFM4j0JIW6my9CVu3rSjJ6ZWBPMcCmSRtKhGFys+3lHXSKiqUKeltbFLlgnjfrOjahhgC9XxBb7hxVpuUlJZC4BTOruM/7/iOGJ4Ka7iyf44rF4TK0lrawfVaNEs8CxVbc98uytSsk2h5fMjZOynQtJLIHYmEmDi/uaSuDIugcFFyk5SK4lRRRmDnIke1R4SKMImiiKQUMMoI7IySugttcEF2k8F7QNJoQ16onOC+PPv6AYfzhmWAEBSNczQu0OrAvINpG1i1jlcnK+p6ia4X/K+feQadPIUJ9K1h1CsZ9yq2+yV74yHnt0dsDntsDfsMNjbZ3tvFGk10Hd/95Pt58sknZFcRI847urYjOM/29hanGaKM+ST64LNgkqy5SLzzHe/gU7/26+zs7fDaSzeYHM3YPb+DLSuaRnKUNoY9Njc3sEahrcaFQN04iIkffu9DfPpPXmLv3Ig3PXY/X/iDrwo1KZc16zgKLwQ4iUTbBVShSb0hdmNMWC2J3Skqdlgb+ej3v5nr149QOS2clKWkKeJcxLeOVd3yzarP5PIVrpZz3vLwg3ztmWd5+fVDNImOyFfRYBSVNrx9MGQTAJUb7dd0gSzsIQRxouUbqO1cHpwTxkjdgVyrUk557sI+73nfewkpStt9UVJWhme+8swZ/FyVJWWv5PEnn2Q2WfDlP/4Ms7ZBpUQ9F21Vs1ihvULnBcIATz/1rPQ0yVMVnyR2MCaxvSfE0aVNgVVKqiLIu/8sKHYh4r0kMz/3/Isc3rzBCy98E7RGYUTwmwInh6cMN8bsjsZYY6lXK44np+zv78n9piS0MXrPfLFEWc32zg4Ht28zroYscZzfP8dDjzyMUZay+OVvzyLy13wYbc/QxZgpJ9kJC1+kbf48C3lohxgkmyaJbs9asYRrLfUqa6ZKJbnmRDCdWJOgstTIQ9D7jvl8xnjnHCnrfjRkDVE6Q59UXp/W9S0+5pCOEOjaFkVg3iR8rqyIGLROlEYyoZo2UpVQRsXlc5vEGDiZtoKmZcOAykjHWl+0PpSSeJGtrU3e+thbeetb38LLL7/C6eSErpN1yjlP1znqps7DBKyfmom8yU3rWpeMDKR1PptBK0tVJHpVhd6SSJIf/qGP89BDD/H5z3+Bw1uv0i0OKVJHSoaVM6RgsUbW71ZHqtJSltC0sh74TuXQWUhOymNtJZuRVeeZLhteu3GMDwGjE+1qhVKK3d3zGBtZLCfgHTdvnWC0OLikqSDmnC8kHylFnGtpmiWresliNqepWwaDPsPhFiEmBgkOjk7Z2hrRtQ1N2xCcJypNDK1sYFJCaUNhkYaHJK5KWyDhmQmCi/g8YN13ZZ8nHt6j6xpsMc6MiKcqIGVjSlHCQHnKgaLSiapQkAIhJHrKYEyBZUhILYvW41UiRWkt6Dqp8FrVji4UaLekbRbMFzWLxYr5bMWyDrgs2yOKWUl0qZJIv4avQ0oknYTeTlLZFXVEeQUpYnLMRNSKlGSzIayUJeoOjMHaHr1qgFY7+NWKxfQYO9pkOT3FtR2D7c27yFPKhqpvcXxHDE8prS2RUh5bloqisGcCXB/Bx5y0GxMxStFkTDFbgoOIrZV0+kgOTQdKS3ry61+jVxZsj0ckU+GrIb63TZP61FGjdUFpDU4ZGcyIeQrVGJWoF3Oq4RCllYTfWRF/Cu2XSMnj2gadZCAzLhCS4XMv3iBozWZZ4IrIeNij3ytJhSEkJQudEhg1amkbd4hjaeUTs9ZztHSgVsTgMoQtwYuFhqqwDKuCUVWwUWou7GxxblOGq51Rj36vYDgYYHP8vsorcorZ4pwHmZQkqM0YxUc/8iHG/R4Hhwe89voNNt6+yXw5Z9zfYP/cDqvFive973F2d7fRwFve/Gae/srTKBLjgWV/e4hOkbJXMtzbYrnq8E5Qpl7Vp6pKutbTqyp8jLRdJClLUQzoj3dwzYr65IhCRb77ex5ltx/YGlieunbKweGC7f28a83b6hQ9JiVMqTA7HZ9+cM7O9jbnrr3C1UsVs9rRLgM4fdZJ18XI8zFx2RjmSmGs/VPXogguIq5dQcpDFJ4uyPs2IDRrCMRs27918yaf/s3fFuTBWkxR4ruOG9dvSDpvkOFpcjLl5W9+k/nxhHqxZP/iDh/92z/Cz/9Pn2BZ14QoLiiTAzr7ZUXykS5n8hA1GkEcJELBZJ1kIibJ0QjO54JWMQSkmPCdJyZNjI7ClixWNdOXX6P1uR1SaWLyvPLqNZ597nne89a30jYti+WS2WLOYCBN7FIcLbs9ay2bG2OuXbtBF1qstbjgcbOWyWQmqJf/m488QRavZk2NZFfmyJX1C5KIXXMBi8SiWCsIQBQKImhEd6LVGeW2RhFMRnrvziOKGD2L2RTvWoZ5cNIpa6YyZSY60HveRF4HfBTqzihF5ztWjdBOw76i7SKdh74NKJMogFIblIXCSgHwzs6I/d0Rp7OWm8cTpsuatnVyP2ewbK2L7PV6vO1tb+MHvv8H+K4PPMHOzjY+OD79u5/lf//EL+M6cQGfRafkd7pG4aTgOGtQ1F26T5C0lP8kqBbJ5N8x8t7HH+dd73yM7Z0d3v6On6YsCm68/hpPP/V5vvzFp1idzog60SVNX0dKrVAqoqP8vrO2owma0EmlldGGqAMptnRtR+cC126fnDkNfQpMFyIHeeJ9T+C948b1l5hO7nDr4JitrQGr1YKYKmywxJRz9bQRWs57Do8nTE6n+BB48KH7uHz5CmVhOTw+pl6ueP21VwnjIctVLdSlT7zj0Yc4uvkqJM+oKqkGQ2xR0u/3IQSa5ZyoDZVKNFg2bEtTSwB0b2OT1g4waYlKEpVhlSF4z6BngD5jLQ7p02VLqwMD5+mVFabsUYeOZS0xHF3d0IXIcDAi0FC7hsVKsVo19Avo3ILVYoIPcHqyZLZcsVj5XOeSzliJ1Uo6NVXuURWWZH31RpSWOyFFiboJMaFNRmtT1qCu3chEigKULvEhYPMGxwVP3dRsXryfmDy6KFicHFMv52zu7VGUFWuTwbc6viOGJ200o3EfnyTsb7laEKLAd1WhGfZL6Y+7pz/KWIWxA1CaFDpS8ML/p4TGnO1+dIIYOtxyxcnBba4fnbJaNmyOR1y8vM9oY4PN8/sMTcuXD16lum+fTbtHrRQdElpXmSHeObBWXCJJoQp5DwHQvSHWVIB0foW2w0Xpkkre45MnxAYbHSxOKXs9KEpUr2RdzOuMiN8GpaXLWoJIImhxSykMTe7w0ySaADPvOa49kSV0juK6lFmixX5bGc2otIyris1xj76BZdvShcDLt6eMxj18FyhKIwnqMVBYzfd96LvF8QG0XY3WFpRitaxZLldsbo4orVBT/85P/gSKxPUbN5hP5zx7q2Fje4cYNK++eIOyLHKliuF973uvZCrpwKNvepjP/ItPo3VHOd6kt7ktO0nnUDEw6IMdDZg3KzAFb3/7RQ6Pl4yGQv35szTxfCOFSL1seP3gDsdjy6X3DnjbyGAGlrLUlH1N6CI+KOousVpF5tPE8iZo+2eQp5ToDXqUpWE43mQ4HqNdRz8leRjFKGLdnEweUyQGz2I2zw6rhPNrF1HKFA6UVcV8ccJv/9onUWhCcFy7fcIrr/4C08lSCmKVLP06BUIMuLbBaEFau5AfFFkoGyN02kl4Yd6JK9Wh24BSgeg7eYD7JHRRDCSVWCwblkvo9cpsQV6L3CPBG77y9LM8fN992SHUMhj26fX7EJU4hVQu/zU268ACpTXYsiCESOMbUOqsp/Bv+qGQtGa93lCltSrprl4phgBKExFThl0PFwqpRYlCT0nivmShhSBZYmVRcBaCqcji2cDk+JDJdMrVB96I0kaCOMmkdkZMJZJkPWAo7pmk8g5eTDGu61ApimMqKqoSYqekjgkgBUYVqKKQAV0JVT3qFTx0fhsXNulCZNV5Vq3n4HjOYHOLj3zkw3zsBz/G/fddJQZP61pmk1OSSly5sk9VVfiwlAdVyA/IdVhtftdrmvIuZZmRrTUdmaQ6CLT0UBrNE088yYc//EFidBzcuc2tWzcwSjMabfDBj/4IH/7Yv8YzX3ua3/+93+HG9Tt0fokm4byiaSOr1YpF61h5CZd1zhOCJ3qRKcQ8fK5DdSGhdGQ+nTKbThgNx2zvbDEe9bh5a4NXXrvDdLJkMBjR1I00OqiIdxEfZQCYzuZMJifMFzVXrt5HSpFvvvINXFfjAnRtx3DYQ+nE/uXLWK05vHPElf1N1HLAqo1URY9BIflU3WxGSJrR1iaTeU2hPBtFoG8rbCluytomKlqcLrEakta0TsCDntJUZUNTd3RRtGUOiy/AJU3rnLgzE6AW6BSoqjEpebyXdVz5SL8PtixYnixxzjOfLlgsOo5nTuQeOT4nRnJ2n6cNnXR3JtGwpbSOmci6uUiub1FEG0Tz55I8F9BZEJ/QqgCV0DpSpJC/f+D0zm129i+iVEIrw6A3pL/fYzE/5dZrr7K1t8dga1sGiG9xfGcMTyh6tpAbv7AMehJalWKSG7J1uFWLNopBr2RQWaEngmhzlDIEY2X3rEQcp1IkBukti6kiERkMhpzb3aFuaqbzObdu3GT63IusVi220ISg+MZnj3ns9M1cvnqFYrxFLEbURZ+VVjSxI9ge2kJhS4GLYiApTZcMioCKgS5GjC1I2mALg+88ypQEW+KKAd4UIhRMElK3hqRTjBQqoQqVXbo5O8coks5wuhIdV57BM6Rp8HhcWmdgCLXTqMi09TBvUSdzVIzUtcf7yCe+9DoudDz/zVtc3D/P//Z7z7A9qtgZlmz2S3bHfcaDHqOyoOpJCvXWdsHW1hgStJ0jKbh86Tz/2X/yH2e3USIGz2pVM1vMOTw8YTabcPv2Icvlgr/7o39HrJ8x8bc/9lE++clPcv3GTbQ1xOVMCqLbVqiCXknZH+C85/h0xc52n8uXt3jTmx5Ba3W26O/u7kh5plfceK3l+jWJE0goNrUmlVLFsnNpn8PDO/T7ll4Fg4Fmc6tCpYFIKDPitB6gitIyGI2oVy31apWHBpUt/+mMFgl5mx3y31c5m8kW6wwkWchQitaJSDyESMiBh66LnBydyveIuU5DVCIkZaUSKAf4rTPBQFxAOqXsdlpr/0ClQKLOr89wplJSOr12qygtQtaY8vvlTOBeFpbnX3iZOweHONcxGI4Z9UdMJwsJx1RQFQVKSaBt5xy+8/QGFYWtWS1XdK7LQ7KImP/GHyqHlWa6PJ7R0xGTkd20DkJUUFor93tKWGPp8DSdy5+uz+YDCWa0ZZE3CPn75Ae3q5f4tuUN970RpS0kRPeRYp47NCnJfXA20OVU33UuUoyJFCKm0HiX87iCZH57JxrQBrBYYrR4rak0GCO/V+ccKWkchl5fClsH/ZLR5jl+6Effw/d+8HvZHG/QuY7J9ASbbfg618/s7u6xu7PHalmTYiA3BrNWhN0VkcuWMUe+cjcMM1OEeaMn1GDisbe8g+9+8v10rYR43pV6RBaLBdevX6MoK86dP8fP/Ox/yLXXXud3fvPX+NwXnuLgeELXSaxIiHlwUxm1P4PC1rU4a4zs7jtcLufcvnmTmzdvc+nSBfb29kFprl69jvff5OTkBPE4aoyRtgAXWuq6o65rVrMJZWVpmyVKeWEblBVaLraQ9ZWFtezt7pJCZDmZszsuKHRLpAOvaToHWjRcvltRxDmmv0Ewli5FgumztXuOjY2LbJ87RzAj6ramtBrnpRCyMBBdC0mMAiYFpqfHzCaHtItT2nqFshY8bA9LoneYSpLAS1OwcobW1/SrPm3nMXQE13A6XzJZBboQzhoqyI5QHQzFWXh0ykn4GXHN10YCoetivlKUaHmTCvJITgGDlq6/PHDppIlKAmmndw4Y7+6SjATK6hzIGpVisL2DqSpObl5nNV0w3j33LW/774jhaU1tawVaWVSR6wyUxMeX1hIHwqu3LjCtPSoGeoVhWEnuRUwx86wJpQuSrbDlAEgo50ihPdOojMcV440tLl8VzVKzqjmdzTg4nnB8POWzv/+HlIWlrPrs7W6ys7PNzt4u++d2qMZbFNUOx5uW48kBOte0qCTUFEqfiT2DFmpOK0P0/iybQlsLCkzZy/12iqREGCe89HrHmhdNJc4DY/TZEmIQtw1olEY6nAq7FjSxButTEg1GUgptsqUzRaIpcCHgItSd56mbJ7JgeLmYTUqUJNJywoX98+zv7rA97rM3HrAz6jEsLQOrOX+uoLSK0mqKQqGKkl6vZHt7g/vfcPUMupetYqRetaDhgfsv80//6S9w59ZtJtMZt+8ccOfObY6Pj7l58xbTyYTrL9xhuVzw8nOvs7VZUvU2+OhHf0CcQxog8r4nnuA3fuNTEkRnPVolCmXRRrMxkmiErlXE0KCMZblKLJbgDhxFAeMNS7/fu2cskXOXYmK1mvPgQw/w4ssvSNYTUodCpkLE3JMX0CSLeSRKTlau3QmI+DymrDELa7GmIEWCOHghU5I5Q5XW39/koQhV3NWQJMRxogSRPBPNZs5fpy7rRAxKS3ioykGzZ0GCSePD3V3VeoBa1R3peIpXkccff5ztjW1u3LhOUZUM+j20tdRNQ3SBVV1TuBZfeIrK0h+Iy6aedPi2zTb8/x8MT6z1SUAMZ3S41pluS4lIEL2YNbl8XBxygQRaUxQF0TsRQicJkLS2JKWUHzLiKkohkEJHVy/ZvniJiIRlqntdQkn0l4rcnadMjjRYywyi0DNG56BCsZ8rFVm1nlUwhJDQRqpmuqAY9xTLVtyZ/b6h0FAYw8w7Vp1m2ir2z+3wge9+ksfe+R6KosJ1DdPZKUUhNVgximY1j/tYq3jg/vu49vrrQO5MzNq+tbZR5bOb5e9C3+XfcT2gCt0kwbIPP/IoH/6+70ORaLpanLBrJx5rkCjRtEuOTw74xguGvfP7/Js//lO8870f4Jd+6Z/x9eefI6S796mKSlxrub5DVuCYqaEcfaKAKK7F119/lWe//ixvecubGfRHXLpY8YHv+h60snzxi19msaoxtsRohXPSHNA2DavVkkRk2B/I5sanzHAYdAcgw6e1FYWxPPzQo8TlFBa38QFs1ft/yXvPGMvS887v94Zzzo2Vq6tzmBxJDjlMkphFStiV5bVXlr0reQEba/i7A2A4APZXAzYW9gfDHxYwYHttg1Q0Ia1EWVoxDMkhZzi5J/V09/R0qFz31g0nvMEfnvfcamopGTBgYEzdATHN6qqe2/e84Xn+zz9goih7YxOwNERtqUNOrxiysnGKU+ceYrB6ntXNVfb2jxhNJtw+mnP1hT/l81s5zmiasuIHt/b41d/4Df7Z1/+Apqr56FNnubC1glM5K+vnyC8+Qa/fx5UT5gc7HOzeopyVoDKMaigrRSQnWsuoioxHI8Z7Y/YP5uxOHLUDwslTlX8inkBwmuicIFFpDbQNs4ykQ7JVkNDpxWg6egFOtFh5BA8eUVQrrcXXaX+f7nCZvNNNOYnIWSnHJypC3umxdeEKo6N9Drc/+Gv3/IejeAqBaTXHIPEGkqGkqBtHEySvSKMZDLoMOxZPxHtDXTu2j0sM0Ms0RSGzYxUbQlPLhRUgmgxsFxcVKjSSlB0cIGGGvf6Qotfj1KktQpBw2vl8zs7+ITt7e9x8/zZV7bBGAoXXVpbJOxk7d3ZYXV3jgekb0F1mEgsmqstci8LJhIjyrTGhh5QJFKLA9V4JGVQlLyuS14hOFXN7ECZTFIHrE2NULsmWlJlciX/a6zLR6yNBi3mZjsILC1Hjg6ZJ5xBKSIY6BrBmgb5UIRAHa1w/rrkxugtaVEQSVuqwwTFcHtLPDWu9nKVul/VBh6VBwalBn2G/w0q/Qy/PyTKTXMzbUiqyub7C5tryYpKgECjbe/GtKauSal5xNBpxdHTE2toqVy5fSl2JHGRf++qX+Na3/pQXXngBH0pq79FByNFjBf2hpb8xJLo5Fwfi3q1tTNYDhk7/EqvLq39lQYIyhtXVJf7BP/xNnvvhDxgdHuJ9c19CvLxjpcQDKmrpkKwxfO5zn+Pbf/ntBWIg45KU69dGcEQWXkAr66vs7+3LKXH/5YFcNO245WQCppCsuQVgdt/vJal2a3yKKEujVpB+RkjMSb0V29WSLpgYcHXgaDIntzk3b9zE5Gl9JUsH4d94jFH0bRfV1fQHPZaWljkeHYuvkEKCSbMPxRHz/+lLoVBe1GEms4t9a7RNozZFZoxcDilFIbaNFGl8pxVKG1x0dMyJl1pI8UgmiRWapqJpKnqrG1K4pwfvQkiGfoknorwEWRMXsS6iPoopn1D8n9CyJmblXKKTcpiMZW9lyjDQJkVjOVT0TBtL5Wq6hcUaCYHOs4InP/pxPv2ZX6DX6zAaj8htRrfoSCHn279pFD+lRFuKMfLoY4/x3Pd/gA8OYhDunrqPpxVbbCfhPC0hPWE9WpNGL3Dp8oN86YtfRKtI3ZQn+Ys+4hqPCzXBB0H0lZDlfTNh72CPt968yukzp/mP/6P/gB8+/zz/x9d/h93d3XQxyz6RUPGEMCMyeNlvSCGghBy9s32Xl3/yIp989lmeePxxrM04d/Y8n/70Zzk8HPHaG1dxdUntHFXT0IQGjWFjYz3xTBwx+ORArsiyPJ3PMsmwRcba+imGSwPK8S5D7en0MqazJlnuaOrKQ9dSFH0uPvwRts5eEoQ0ePqdhpXlin6/z198+yaXL1/h6MEHcKP3eP/mXcaq4FOnB7ja8fTTj/OX3/0+Z1b6XF6OVGHGH33vz9FFQef046ycOcfQrnPq8StkseHeB9eIk20KpZiMKpzXlJMRe3t77O1PGI2nlI08kxZYVIiFjewJvfDXy7yQ4dubTKmYEAO18Cskpv0Uki9UW9ACUacQd68hNJSjIzKt6Q57yeZAQIXWjSAC0fn0ZxoGK+tkeQ7X3vuZ+/5DcbJprehkuTxc1frpBLody1BpspUBSmvpIpx08cFGjIEiREITqH1kMpHOvpdrOpkms8L7gQC+TH5XmmAyvO4S8CjfYIPDAJm1aJVDp8fyYIlTmxsQxTtnNis5GB2zfzRi//CQ8fGUeVWzs73Hzes3eezRKwz7Hc6cO8uVzVMUS0u4zpC57zKzPcZossygaVDk6KAwSGBjq0gOzuG9RLu0ZUZUMSkK00AncQEE3SLB1zFFlZz0afJvsaEPMSRTTCHeSRfWsjJE/VFYgTQj4EQGJzldVhQt0QXJ5XMB5UkHXaCaNxyUDbfGcxQHnO6LOVoMkZkPGCV2/Su9Dsv9LquFYqWTceHcKVZ7HZb6Bb3M0skNWon7sTKQaU1mewx6PTY2VlMHmkrK+/gQg2GPf/JP/mv2dg/EE2t8zPa9e+zt73Hn7ja7u7vs7exxcLDP3tGU6XRCXUnkSqfT5T/7z3+TbrfzU8qgdHOhteGJJx7mv/ov/wv+m//2v+PGjeuo4PEqiAN4aMuOuCg4Q/A8953vIJ10WwgJoZT0zGKUw55ExOx1exyZQzk87kNqJCYmBSCnQ0JxUii1nZj8n5NxTEzQvlIqdc/iZ0YqtOWCbXkaEaJLaISgnCEE3rt5k9HxAd1uzqwumU6nZEWGqxtm8znz2ZzaN3Q7BQaLsRqtLbPZXPyfEG7iCbb18/3SSqMzUZRp3RrItqtWnpWPLW4RFvu7jXBrs9iMUkmgkMbHmYEgl0M5n8sodWktjSqk+wnBY1Mj5ghoVDJClNGdkCZPFrj3bSyTrBVjFd6VaBWZVoKMCeItTYxRUeTjhLwfVgAAIABJREFUSlFGaVyrMjCwmrWt83z0M59jff0Us9mUup7T7RR4nVN7R2YMmRb1VVSiJlwkHkbLhfOnWV9f5+7d24IpKS/oUjwZUy+ELun8RgU0YJRfjDfPXXqQz33+FyA6pjMnpp+LMafwB70XcrJ3EsItjasURd47rl495N13rnHh0mX+0//kP+R3fvf3ee77P8Q5nxCQtnBLBS+ytwW1kLXe1I7JdMbLr7zEd7/7XdbXNzi9tYm1OctLK1y+dInj4wmj0QiURytLlmdkeU45n3I8HdNUSuKekNF6ZnOKQqxpOkWH4XDIxYsXeOeN16irwDS34CNa53hfc1xVdNZP89QznyTrLIErWetnnNkasnd4jFEzot+jazI6+ZyrV9/goYcf5vk/fZvzWU7Hyb6+/uqrfPYLn+aFV6/yre+/w2ubfYo8Q9slpvMZw/ENek88ju0PePODO5R7u1xeX+H8Q08wP7zLzgvPc7i/y/beAfcORhwfl7gm3d/tGcXJ1EmBKO1UxDeVnJMxEBcxKa2lDkTtEjk8RRNZkxT5QEIIlQaNxgPNdIrzjtVTW/g0zo5IsS4UDKjmJUqblEIhcUh5d/DX7vkPRfG0aH4jeCUyUKNP5slylweM1phCY4x0+a6RMV0wKWoDSayoA8ww0ARy1dDNMskvUkLq09ERY42Limgt3hb4KC6oWQwYEt/AFCgVKbKMQbfH6toKl8M5YgjUdc3h6JjD0YSj8TGjowN2djyvvn4Nkxk6ecHSypAzmytsndni8uYm+YZhTe+TdTRjLLOYs7Q0JLMSxliHBlqAOoWqRpXsEVxAGS2GeECTFDWyWFJWT4p7UMmVtS1GjZbsITi57HOrcV4s7AW1UngjGQQmwZipfJOjXhscFuc9zgVcDdFHog1gNQHoaMu//dknGBSiBHzpgxH/yw/eYuphf+6IBxNCVeJDwL7yvpBhjaafGYb9gpVuwcZSl/Vel1MrfVb6HdYGUlwVRYbWJxl8chfI5VEUOefOn+bc+dOpiNFpPKHEvNA7qqpmVpaMRkccH425e2+HldUlPv2pZ5P8+4TvtMinTwqQX/jsJ3jkf/zv+YPf+z/55jf/iPfv3Abn8CrgfHJrR6ViSgkJUukTkmMaq6k0mmj/+JbMe+fObWIUBWQ7VpFRXPu9auEI3/Ky2p9fIHn3fZ37xnuLeimNQeQeanXB6WcW3BIWhPl7d3a5e/suIXhW1te5cPYCWsOkrlO2XaTb7bI0HKBR5IWMa4NzlM1MQoy9/6k/++f3JR+0SRyKEAJVVVL0evLsk4PfwoDPqER1BVCEKH5GIUSM1ekjS4iHF3RzPp9SVhWDlXWU0ilYOBCaBpTw/zKbobyo1lpXZpMXKOfuMyxNqKRGFG4EdDTE5G0kcm+JI1nOg4ysAriElGYq4LE4bTn3+DM8/OijhBA52Nuj6HSBnMY5jA34oDDeE7TDmAxUCsWMpJDrSJ7nPPnko+xu30rKKkWIIp5RCMLeKmt18IIyochMZFBAlmvOXLjMx5/9jASvuzpFCHkq5wiNp/GN3A8JgZPiKeJDg2saQhDvqaAU0+mM/Zd+wnCwzNe++hUefvghfu93/5DDo8OE6MqD062haWpgQir48IG6rNjZ3uFP/uSPWVpe5le+9iusra6yurrO1772K3z6M5/mgw/e5/bt2+zt7zE+HqU4E8W8nKX7LMNaTVMHfCeilMHmhsHKMpcvP8jR3jbXXn+Fqqk4rozkhhrL0mCZxx/7JEoZ6g/e4r0723zl7/1rrBSBWM7YPdrlzLpnsrtNt7fEqa0NlD4GIlc+8nFWd1/D7R/ww7fv8eSliv29Y5595jFeefEqTWWoqoDOGx450+fipuad997l1Mc+zvrWBnv7t5nefplXbv6YWJzjsU9/lf61q1z/k3/OZDKnbvzCaHiBJ56MHYQrqsD7SOMkH9IoI3de1NLcK+Ga6ShQVUiiC3kswusEeRQaQFuackI9L1ndPENUMg4NMVl4tNC9hqzI5U7TqemMIWFYP/v1oSietFasdo1EoiDjDR8VlbP4CMHLXDOogLYiRdRaURSSwRZjxDuBoskUnSBQdRM1TexyWAdwNd1M0SkMGi9jjxgwPmCoiEScVkSV4bWlUaBcRfSNIERWo1XKDAJM0SXr9tnY9GgVJM6jaTgYj9k7GHF355Br127y1tvXya2l0y0Y9Hssv36VjY1Vzp7Z5Oz6Bvv9yAdXf8C09qysrDJUcyZRUWEWTrcxkYaNikgpxUnelRIHeSmAxBMr6tb2Ul4tHtX+nPBGkyJBgW9qjrfvoZX4NkWdo/JCRlFRoaJfIF9RKXHaTYhK41l4nDRGsXs8Idc9uhmcHhaYttNsDxtjRAuZlGplCFRl4KB03IjHizfckrIzrellhkG/w2qnw9pyj7VugRvvM7MDVgcFg05Gv7CY5CVz0qZK95Fri80Mw0GPrc3V+z4RhYonSA+0/1212DTCCdGsry7x7/47v8W//vd/nR+/8BLf+taf8eJPXuZw/wAfnMzPdUxya4Uh4tqZQ7q0otKpIDsxJW1hf6XEpiOE5gSxSJ9DTJfH/cq1v/o9P/2s/8qGbw8I/sr3tgjWAgPxtMjVnQ+2KUPDx5/6GDFERkdHHI2OqJsGpZVIlbUm05asyAHwrsEHL9wBFHkKDv75f6nFiC60aN/9BH+lcUHUb1qrJKmW8igmwozRVsJyIXEnTVJRBmaTCa5pWFoRxKnlLacMcbSRq6P1b1IJoWk9nySuKcntleROxSDjq8xI8+R9zaBj6PcgR0w9VdBkRtaOENENNmoGnT4PPfUsS8NV9vePMEaT5xkRQd28zYi+RoVC1rU2KCRU2Lf8LMSfSaH46NNP8ZMXnmd8dIhMTTQqOnAeHcV/TCf3KWsChYbT632eeOQCy2ubXHnsY7iqZlaXzJynqp0IGRpPE8Rp2zXiexeDl3sCldAoj3PilSXnhai5ZtNt9va2OXvuHL/92/+Qr3/jd7h3755c1FHQ++Db3UJCCqX1rcoKm2Vcu/4ef/CHv4f3ga/98lfZ3FxHa8PqyhpZVlCWFWU1xzsZ0RmbMZ1NcK7GBE3wEKKjchVaaTbWT3Pu0mXGh7vcuXYVHSuG3ZxZ1eApePipj6MHq7z1xmvM79zi2XXFwz14/bVXeeTCKnRgazXQzHdQOjCZe5aLirWLivduf8CnPv0IfU7z2jd+h+U8cKFn+bNv/Sl/5x/8Ji/+5HWO5zM6Hc0zF5fpqIC1fU5P3uHHX3+D2jXs7u4zGc0onePs+m2ee/5Frlx5iK/+q7/Fn33rj7n21lVpaBNdQCN0BylypEhWiZPpE9NfKzAh8eRUy5CCGFp0Vz5zlZD3SEKi2tO1aagmU5bXNxZwamv90c5o2jxSQT6BxKMjnihVf9brQ1E8ee+5vS/ZPy5I9xFTYWCNxlpx7VVp/uyDXEBFkZFZIxlFadznUhElH4pAs1mEOsLBLMLE0c01RlcoIlYpTGbpdLsUVvwtmmoqLqU2Q+V9miAuzio0EL3wF4wQiJsQhdlvcowybK7nbK6t88gVQTsOjo7Z3T/i7t4Bd+/tcOv2XYy2FIUlMxm9XsZgOKA8POBoPsa/9uc8fOUSxfIKMzocO8tRkzEPEY+WQzahGELtViJxDog3DImHs6jI1ckhHeMiCygkQmTjAyrP8Gtb1HVNNZsQp2NcLaaX6Ii1HUxmMXmOsYU4rRuLziLGWoKvuTQsWOlqvvvaTVQmROUyiimb0kKqlPWoiYmsFZXGxyDPNpIMG0Na0hI+6oGqjhw2JR/EEn/nEEVktH0Pc/UAq6BrDcudjOVeweZyl9NLfU4v99gYdtkYduh3crpFRm40VqmTS4UTw9B/aWqHbCqVoH+FbKyV5QG//KVf4stf/CUOD4548aVX+PO/+EtefOFFdvZ2BeJPkQzSSaeOv21ZSZdmbC+PFh4SNKGNskEF2owvNIncePIuT0jiciac5IZBywOAkyKr/d77xzdxMQrUi783idexv3PAO9du8PDFy0xnJc6LIKJXFJRNw+R4jLKazBqK4AlOrDmqsmJeN/joyLT+Gw+fn6dXVJF2OGuMERsV+R1aqVtrQdASXNtHYbXG5IpMFyKUSWHXIQTm0zFNXbO8uk5LTm7NMr0Sh/4mhJTTJtwog5UA8JjUvCEQXABDilVKY3tFCqGNlGVJ6SJbmUZ3FdNKPIRcjASvUFa86fqb59i6+CiND+ztH5BnBpMbfOygrZIsthikyTIWraw4eUePDkqEHkrWs4y8AhvrK3zyY8/wo+f+BeW8pGoacI5MNWgdMXkkT+i4ySPdjuLKxSXOnu2zvtGja0fk3Zzlak7ZROYdy8HYc+QqmrrBVRI0X0WxBpBGGxnfxIYQzaKo8i0nC9n3b731JkvLa3z6s5/hxz/6Mbdvf5A+U9nPId7X5CRH66bxzOcl2mjevPo65azk9p07fOVLX+bJJx6j6GRkmWFtdZ29/XtkmcF7J0HBNsMYi/dyPhgFTdWwtrnF0tIK927dZLp3Gxws9zN63YyL587z4JOf5KWXX+HNV/+I5Y1NPvbk41Q3XuHMWp+XXvwRhod49IkL1JN7+HpOt9dnPK8pZ3tkFh5/4DwDfYiyHdY21/mCjfz+i2+ztDTkhz94iV/94mf4n/63b9Lvavp5w0Onh3xwcIc3rpeM5o6i1+PC+QfIH4CIptsteO+993n51Z/wF9/+Sx5+7EmefOZZ3nzlJapqlvaECJ9UVMnMOyH1QHAeE2Xc6xMBXOLu5DMnQtBxIUgSECWgSYatUYFvaKqStbV1HJGoPESNRUNQ4qsWhaS+OJmVUFQE1QrJBPtnvz4UxZNShqw3RDuP9h6JXwvi2RHb6jKircZoQ6ZS9wbgRcWkUpdrjF5cij5E8OIhYaKir8FpD8pSBcWsdBgChW04ns2l41sAgOCYJYg54ILCFh3ybodZ0zA7OErGlUI6t5kV6Tht2KVCm5yN9TVObazz2COXqeqK8WjK3sExu0djRqMp48mEuHskCq7RhP/1f/8m5y+c5dTmCisrQ86dO82F05sMl9epsw4Tl3HYWKbBUJGnxlYkuiYGkcGm6l0pufCVTOMWBON2ghNDRAUZ82kiPsvwWYHpDLBEweqjI/hI8BWz2QzlxpIJR8ACeX+IynNujuHWRKOiJ9eKSSNjRmOsFBHtgbR4A/HEyO++iz22ZItU/Omo8FqwwsV4Sk59gjY4HxnXnqMqYMYVbI9JpzMKkdsOOobVTofVfsHGsMfGUpetpT6bS12WegXLnUzyyIyYoobEN7gfvWt/dTJKi6ytLfOVL3+OL3/5cxwejHj5ldf49ne+y49+/AL37t4VNDK0/A0WqpyYOu92TNgWLyH57pwURScji5N3oRYjuhNU56ffp1p8P3/l+xZQEy2npuWRyO+EhQLFOcf3vvMily+cZ20wlIvFiQjD5hlLwyHT2UwS3o1GWUs5c8yDI2hHrjKC94vD8Of95RPvsDWzTLpHdOIP2mTiG7yMjEiIjNHSHGoUZXAJ4RHUtJweE71nuLpGmw/XXh6CncjKEfQI0uJKRZGsEWsMjQvCSVNKAmu1iHKMMaAlKqmsHB0F89oTG7DJ1iJEQ6YiQWkGpx+gv3aW0dEE8Bhr8b7A+oimIXgro0Yloa3iol1jUMIlFTliQhQiHa3QBpR1/PJnLvHQ8Gn2d2/wwc0blDNHUIJUR2Wx1pJ3O/SXBnQ6Bh3m+MkuYypmx7tEpXHzuUQQZT20sawYQ5EFJgEO54FZFagacD7ShCAkdZdsJFRM49PWny2glUUDuzu7eB+4fPkySsOtm7cWzTmk40wJChWQC7muJNKJGHn32rscjQ65fu0aH//Es3z605/i0sXz5EWGtTLALauSsqoFlVGiivXR0+kNWVpeoapK3nn1Rfo4ljqRsVcUeZcLVz5Kb/0Mv/s7X8e6hq6OzCYzNs5ucfieZz6ZiRnv2Q3q2Q7zo5sYaxnPYDo9wKoZG+fWyPSMyeGUad3hfWd5QCl0dCwPMq6+8D0+9e//Yx596DTbH+zx7o0jbt6esjwc4Mj40pd+gaZu2Ltxg25w5CoyGjmWNQwunOXs6VWu33qHo3HJIx/5KHffv8b+9na6hOLibGyLeqKhaipcIt/phJ6SmuzofSpa5bmplsaAQgeD0/Jsm+mUot/DJ4QzKNlDUuQqFB5X1vjMiIo92dFEpYlKGo4PfbadtZrN1d5i1hmDFzYuUf4isb3QlHChkkN2jMLZCalizTKJNlDJRFPunoCrPa4OSX0XJEgyBpa74qPTRJMqXU9hNdYYlEa6ueSFI1WKbDCnFd18lRDkEjcaYpBuiWSgqJTCJnPJLMWKBO85tb7OA1fA+Ya6En+PvYMjbu/scXQ0YTpveP/WB7z/wW3y5HnV6xYMlwasr65w5vQGZ85tcWlzk2wwZEaHUa3Zx9NEjTIWr9L7BhlLhQSlGPGB0bq9bgMtWz0gqB8+LhAim0WiN+huAfTRwSdpviKGBu8cFdDMJ6jyEBWkW1DKgsmweYYqOuiiwFgrHYKSSr69IFo7BlJXvVCPpgIiJGKmVXGBD0ltZVK+nsSh6PT19g9QyhCIVAGaEsZNyY3xnHjnMH024r6d6UAvzxgUBWv9glODgtMrA8zsmF/4yAOsD3pJkRGEi0Hr7nIykotEllcGfP7zn+ELn/8s48mEt958h+9//4c8//wLXLt+nclkKlEDShzCW8Ku/OUD7fg594FNkzEPgUkM1IvLFECiB1Rou63275pQpnhf4SRv8qdfaXwnZ8d9BZbAGWgMGAU+0DGG6f6Il15+ja/84qdo6krQJ2MwylDNSnxVMR6PmZoZ0Xl2trdx3pN1u3SLjuyj//fHwv+vXm1DIqGkSfjQfhFkLUclPMsYZR8mF2QZ1aUCWylcDLjphBgjveGyjNhbTDZEXAyLn4tKkyUeZABMFLWsTdy9NrBaLwqs1JUnRZsK4J2nrEs6haJjJRTWu0DpAnUQNGTj4qNkg3WOpzPaxHpfOYLzhFjQ6WTSCGgZgIToUGQYZRMC7uV9qEimFJmaYNSU0BzgZtsU7pDHn9qgKrs8+Ogm85nGRS1hyhGC8uTWkuU5TTlH5wVhuk9TH1BWFm07+EbMLOfzQ8azksn+FK0KiqU+q71lnM8oS0VTNdSNOO63qi+hELfeQjIa9TQoLbl3VVkzm83YOnUGhebm9ZuLRpTEUySemDN7HyjnJSDqxu27jvFoxHvX3+WHzz/PA1eucPHCeTCRsqqpXWA8nhCiJssH6CzS7UWOJ2MZd9UTukVGtBqlMrq55crjn2RcOn7wz/8A7Stmk2P2RlM+/9VPMOjkvHs84/WX3+HiJz8DzT7zuqQOA2ZjR13tYNUcXeTceP+YWT3m/NYa3aUtHn/2CvGdyL/1iWexK6ts/f4f8v3v/Yi//6/8Cv/zP/tDfDljbWmd0XzOr/8bv8Frzz/Pg0XD5c0Mi+bw4IBifkQcHfPy7RF3S89wbZMrlza59tbrbJy6wNLyCtevvS0IvU7NXBIJBDze1XjXoILCq0CWaTCZPKXoiVFhokJhF824juLSHyM08xlFp5Cm26sEzUdBpQC0JzjJwNKATgICHSIxM3IX/T+cXh+K4qlxgdGklvBVo7DW4pNlAKFBeY8ODYWOoDRVsEzJQBsMXqTRC75JIkkbhDmPQH0m08TGy4goeZ5IBAKoKLllHkOlNLPKk6mIVnIQKqOShb6VbtEqsuClGPENZeWweZdsMJRwwqYiVPPkKgwumCSRT++HiNEZna6h2+mwstTnoctnaRrPdDpnVtU475nMK7b3jjg4GLO7P+a967foFB26vQ69Xofl4YBTm2ucO3+GB86cYmm4Rsy6jLzhsLKMG80ci8OirEjklwZDjqZzXJSMrUjEO0f0LTkuoUQRfNRgtCwoRcpiCmIIGOVz1Z0CoxRmaVXQsyjWC6GuqOs59fgQGlG35XmOMgqbFRR5TjTix7QgXIaTnCcd03+vVa3BCUqTCOFWS9fWdtk+xp/qFBbMr5aHAjJgT51IJFIGRVkGDss5tw5ni+3SHO7xR6/e4nNPXeALj19ha7kDOqLTZm43OmnsJptNNuig1+XjzzzNM888xb/3j/8R9+5u8+prV/nxiz/h5Zdf5fbdexKm6x20RP4oRVlfKR5SFk1gVSv+RagpFQueQPAkCFotzPYWCFbLnGzfljopsBafSUIt2lGleIapxVdilETylaJHRynGByOqpuLc2S06nQLfNOzt7WHynJW1dazJCC6wc3BA3rMUsUApTdPUNI1c3n8bXhqxv0C1uYvtaE4tKquwQKcMRsnvla4hCxqrTbLBUDSTkRRAvYGM3FLBG0LABcnajKnYyrQSblQQJLlV4Kn7BAsmGaESWcRK6XZ+lnAynGdeBoieSemSX6URM8YHnkYXA2bzUnZUhOhlbTXRYbMsYWBGCsZWMq7E4kArg9FBFLS6IU7exM/fhU4H7wPa9HGzXXJVY1WHlV7O6rBHE5UE/c4bjkcH1OMpTlvquqKqxmxc/Ah+NqScjqknE7SCclbhYy2NQFYwO55yPJuhi326wwGDrE851+CgceIhK65NbSNi0botpJQQiINKESGe6fSYldUViHDjxk35zGktP9qGSNaB8575TIKCvZMIrPlsxvbde1x94yWGw2WGKyv0ej3yrAAV8c4zL+dUsxn1bIKJFb0i0s97WKMocgV5zsef+QK3bm/z5KUNbi0PuLF3yNF0zsMPP8Rnn32Ea+/e5Pq1m9RmwNNnO+xvf4APkahkrBrcjImD+ZEjcEhmevgNz/TwOlVRsP7YZXRWoI3H5AXhzpusfOUXeezJB7h+9RoHxwd85dd+nfde+wnnmwnnlyx3DyaMjydMRvvcPW64N5pwNG8IzjHduc1sOuTihbPcuPk+3cEqjzzxNO+++Qb4RvIgQyS2Zax3GGXkPWspetopFNokc2ISlSc12lGK2Ho6EVBF0AKCDohDogIvezXGSHSRaDOUijgc0RixEYoxPfcILaXhZ7w+FMXTdFbyvR9dTTwRFqB3a7sfg0SHeJSow9KITikldgSZppNbup2MIjN0c0u3k5PlFmsFLs+sxWq5rIMSXkFIM26Ul+IrRDyeaCNBGby2YmLoGowS87u2aGgPRa003SzDhYpYNjK0sxnZYFnIcaFhXk4I8xlWS2ciRWKa42orLq0xkOtI0emyGlO0S+O5tLXO4fGU3cMxe/tHjI/n7O4eEGPAZJb8vYzOS2/Q73UZDrpsrK1w+vQpzp0/xYVTW3R6A0osRy7jqLGsLhWEWZciszSNxRpDWc7lAk5BzDEkD10jRYJrR5GJbi4GlQoVINMyuC4KQfFi0GTVBD/sE8yyVPveoaPCREddzZiM5+hqBxucuN9rTZ4VmE6BLXrYLAOrIQR06pxletWOv8RF2afiNPjQjtCF07EgRav7KD7qxF8mIW+SgWQSj4RUTqVZotHszDzfeO5d/vj5a3zswVN87aMP8Mi5DYy2qHBierrwHFls4KSwIqKN4uzZDU6f/kV++SufZTafc+/uDu+8fY1XXrvKW+9c4+72DkdHY+bzklnjueVLPkNOP8qFXBDRxlCJBISuMYQYmQcJPFbodDmHxb4IxJMx4eL58VOXessjT7gX7Vg1RJj7BuctB8cVB4dHHO0fYgh0uh1WVpbpWEOsasbzMbN5xXQyZm19lU63lyB2aRgy89cfPj8vL/k8hZfZjiAWyGALUArLWBAmlYQXQT75eSJGBxRuNkbHgB0uAUoC0GNMYgJ5YAHxgrPGYJMnXlSCZoXgZURIQmI5QSmN0USvUEbOLRlVqRO+WuNpQqRuwLuIyQtOP/wM2IKqKRfZfLJfJEvFpuesdUwFoaA2Rrfec4quhW7m0eVN/PRdgt9Hm1yMZJVifnCb+XifuQKtS3TW4CZzgssJrGDRdHVEqx4hN0yP9zk+OGB89G2MXaIOKfM0NkQPNSXeKcp5lAiREIhzmIym9JdWWC0KjpzBNRrnFd4nJFZpMZJFLARQhpa8vLAbCZF6XrK0ssSFS+d4/+YHqCD2CbIWWuabLAzv21QHh/c5xhrqxjGdT6QJ0TqtHYNNXoWF1vQKQ5Ep5rVnqVgizy0do8mygsc/9iXefeMNLvkjJmt9/u5XPs+dJ+4xWF0ljka8/+5NvvNH32R2MOKJz3+K4/EOMTgC4CM47ygnc3w9I+v1gYpi0GG8u0+eeTa2zlNOxS+x6K1xb15xuef58fOv8/d+/VeZ/13P97/zImurXW49d439umY9XybTNbf3dnljd8axMxyMG0LjyTW4qDCzGXfev8dDD17gjbevU9dzHnziI1y/+hqhKdP4VAsXtxFQhFyei5Z5qKwtBQSzmAIQ07gUqOZTmqqiv7wqKkot6JRKRPWohUsW3f0EBwXGoHxE+Yg3KlEOWu+0n/36UBRPMUbKJlkNROmyfJBFqJQgHdEY6faVSi7i8hcvK0dVwVjVC/6M1ZBbUuEkyESeFFtrSwOWhz1sLuOHDEPmrEDcUdQZ0bcOpg6vFY3N8Wj2p3Oib+hnlswarJUZv1YSgxGUuO5GVwv6FMVJIs+66O4KMQSaeoarKqpQY5QiN+lSvx9B0IZOURBzT6Eig9UhF85vpZ9vGE/n7B2Iqm/vYMzxeMrhwRilFUV+m27nXfrdDv1eh+Gwz9r6CufPbHHmwmnWBxkj7bj+zX+KGa6y1LVETXKblpGnCg6tMwg6Lba0yBSpv4RWdqKVwiox7GyRK98ZEJWM2owxBCMO69EUaCJqYLFFF6M1rqmxRlHWJb4sieMReLlMrLaYvMAUXUxRQFagbSZpDG3MQ5sHp9qNJGaALZLTVggtACCo+n3jP/lVGimkr6UNF5NL96QOPPf6Nt9/9TYPnl3hix+7yCcfPM9SN0fky3FBYozo/84jAAAgAElEQVQLwru0AAvbASTwObOWM1unWFtd5umnHubg6JCd3T3u3d3m9p0dbrx/m37R5dbomOPJjP7omP39Q+G7JKKxS/EdmZbLdTGC0yfjzpYRr5Rc7AsXZC0NiFHyOSklMvc8z8myjE43p9vt0Ot26fc7bG0ukRsh+hptiRFGR2Mm4wnapGDiEMg7BVXZ0NRjeStaSTLA3wLkqR2h3W8X0SI9gXasKgrTRYGukuFtu3CI+PmYEBqK4bpc4l6YfkbJpU0rPkh7UiMTee99+v2QFLeyDkRY0/YCwhmRn02M0UgqsiLzqqKuHSpX1E6jbMG5Rz4GusDVzWJvtPmibWNrMyMGuNrQxv5oIlZBYWBgK0x1Cze6QWjGhLqmnM0JYUJQjlB6JrsHZMMujaswdk6RBSJzJpN95pPb1NOKUJX0166wcekJBsur2OJdRgcjxscTprOashEJelMJiu61wjtNmXIdXfBEH8l3SvoDTb40pJ8V6GCZeoUPnWScGcT9R0W0Fg8n34oz0tOORFxdsbK0jD8X+OCDO+kxtpBvoigkRCoERVU1OOexmfC3tNbpnGkR40T3QJq6GB0xKC6eOYVaSWiIUjz8zC9x7Y3XeLqYkTnHrR//X7z19gVWT21y8/0PuPX226jRNrdu7rJx7hzdtYLxeDuh+xptLcZk6NwR6gbt5xTDdYpOB6sdWd5nPHXMjo7Y2tpgZfk0n/raZ3nlG7/P7M5VjHmIM+vL/NZv/x3+6f/wz3h4tYurFHuHE27OPG/ZM5grXTrzEru3QzmZMZ4eo6oSS4PxY27dyllfHvL+nV1UhAcff5p333wdX82SUbTCNw4XI9pkYl0UA4RAMEl5F0F58PrkvKurGePdAzbOnUsAYDr3ok4O8e2+FIK5SkKc0AqNoyIkzmtI9gjxbzi/PhzFEwJJB4UYwqETrCyQQBTbVLmUdGuxHROHpCUdqxO3XmMJKuKR6jTGSNCa2gVGx3MOx1MZI9kMm1mMEd6STi6/WomfkFYKo6DQIhnt9DpUocdkXuJnJZkOFHniWemYuq5CuvkQUtcdib6SytoLCZHeEpk1+BhomhmqbhIqplDKJNm7ZKJJxZwJWmIixng63Q6bq2vEBz21a5jNKw6OxuwdHIvl/vGcg9ExRolRaF4U9Lpv0+sW9DodhoMB+3feoZMV9HsFs0nJ0/4Gdb7GXa049pqm5TelYsLYDK9afoz4wcQgB6X4F8nt7APiYxcj3gDRC+k7jQx0Zsm8gkwTXRCUK7fo4TK2v7wY+3kfIEi4bVlWhMkE5WuUd5isoD4e45qI7fahKNKBhbT9IqpIYJCgAW3q/X2TtsV4srUOuL8IsRksFRlHpXQg7bDr3bsjrt15iW/03+BTj57lC09d5sLmkvBJWuZoGl9KdEQ4IclDUlrFpAz11HUtfKLg0UbT6/WYN47uxjq9U5tsoXGNX/iYnUikhV7nY8CFZHyo/ULZqBJKG1UUfzCVOAJWlKI2ddjCh0njz+BTxJH8j+CJPsmooyivfCwhtsWmTn43YtDYkqXb0ZXRGvc3qFV+Xl4KJGsz/ZqE3rVfkHIpRaHQKmIlmkWpCNpQjw8xBjpLa2ijRQULicOpFmuUIAh5rWSjhbpJAwl9gnK1ozigNVmNtOsyLVPdijdkvDSrGspK9nSjM6488gQx6+LrBpQUAERkTbeIlgloo9Ammf0aCQDvZpqlrsPGHSa3f0SY38XoPtgBKC0pC3aJo93b7L33KjZfJm/m4Ceo3GCOa2L0NFUXHwvUYI62M8rZHUbvO/LhKc5evMTK2ozdvTH3tu/RHMyogqc2YjDqFDQqUEdH7TV1oqTmWvhNmTtGmRoLLMUO0yjRVT4aCCLE8dFLURMiMYrZckznSIyyf9dWV6mbknv3du974C2dPz0CxLzRB4WvHHUlF7fRJqkddWq0Wkd0+flHH7jAow9s0jPie/jA08/ifGBzc5k33rrDxWxK0UzhvRd57rkZV9Z6PNzzvDU5Zu4jFx8/z2w6xVeeEB3aWFTjMdahixwzuIjTgRgyfJWjspxuADeuCSayuamZTQ6hqxkNN/nirz1LdPuoEDD5OqtdGL9/zO2p45lf+gxlk3PzJ+9w7+4dyqoiAv3lZZZW1xgf7tMc7khu4N42py5dYNDtkpnA9vV3eejRJ3nn6qs4N5NzJkiun07mvuK95IhOQ9R4lZrDIGvZu5r9e9ucOnta8kMXo1RF1MniICKqPiNCmaBUKqoSlccHgtEYHxLIGNDO/7X7/kNRPCkFmRGSZUiclIAgCiqq5DresvIT0TKNjmKMWEhqO+kSvHMEJeTwGCUBfnZcoeIcnUYqSll5GKTiwCi5LKIUUkVmyVKX0CsybKYosgyrNf1MQ1Ewb2COkLML5ckUEu6bZWRGwj9d8qhSMTkHR3DNhFCKpFnnHVy3Q4iSom6jT4VIQKfiT/yXEpigcyIZQUfQgTzrMOwM2Fxb49EHRTkzq0r2D8bc2ztid1dGfcfHU2L0WJuRZZJrZ+JUeDwo/vwbX+eJxx7kmScfYnltCZ8V3Cs7bJeK3UpT1Q2ODGULMfsjEGMi64cTvkxwXrhdWoJrjVIprDmSSZklRWomsQ/OJ11b4wlB+j5TzmFpRbpkeuS9QN14sl5HVIG1w8S7YA3V8QFqFNBRAqJVXkDekX9nEs6sVSLvhgTuJoQg+rhACxaE3dbsI4izfAwiVWzXl4zH4GBa8cc/vsafvnidR8+u8OWPXeGjD5ymn9mFEqr93jbQtbUX8N7jfYNzDU3jqOuG+axmNhdptYhERTRhlJicaiPQmdI6IWKScyXjY70Y56Ba7Z5OheHJWK6tHYk+HdQiBZa4GPkeHwNWK7S1eCf/3eA8PkLKfkhWGci4GyHBAzipHACwSuPgbwXy1GJHi9En6TPS7fUpTUh7nglvT8ipChjtb5NlBttZpQlgaCSKwySEouWuhdS8pMK1SXEmSp1Y+bWj29bqpUXEQmyv85MCqn1fctyIKWFjcy4+/CSmGOCaefIma/+WbRMh70djsMYICm8MHWPp6zl2ficpuSqayRE6dumvbwlypTUBy2x2TO3hzlGFH++wut5FD3IUx+S2oLN8HlUU+HKK1TOUMWACKhtSVYfEco4pVjl/5WmyzoAY30DNM0wVKSsvMRtegcoIqiHLM5rgKJ2M0qlB5zXOG5Sbs7ykOHKaEDv4GBLxvUX7FK2Fh3wSCpRZRL9srm9Rlw1Hh6PFRxXbzZeeQbq9Fr8XXRCJvAoLtHqBBmrFo1cu8MSlTbSr8Drj9KWnKIPhkZUO+cZ53oo1r7z4EsNyTlPX9HSNbyLv79W8ePeYy48+RM966tmYppnJHVLI2VdPp8RJQ/QlxkhSR8daRtOceWHpZIHllWViFQnlBjrb5Jd+7ZM08+uo/mWU7jMd7fDRjz/CH/7wezz2xS+xcmmVOKt47sdjolZYm2GzDk1TMZtVdAZLjEcjjJrTM4rx7iGPP3KR23d2GNYTDm5c48HHn+Dt115GeZfsNZyM7UJCa7046IeQzJKNElsY17Bz6zbrW6fRWS7q8NTHxhDRoSZgF2PsNmZHxs+tbY2YHOMDUSM3b4iExR7+l18fiuIpRkXtk0JMR1BJIaJlrJUbveAkqQRLKy0qvW5mGXYylvsZ3Vw+gCpoPBplZcgUoz5x940BHx1aKTJjk3ooweghUtVOjP4AFDjnmc0rjiYlg26HtZUhRVZQaMUwhxAUzliqoDkuK6aVoxcaOlYLr1+JXN/ohIKoiPYGZaQ71NGhQ5M4PRZju+gsx+PxdSUjtBTRorQgCCoogpGyWydI0gbZglbn5FmH5cESD1w8R/CeeVVzdDxhd2fEvb1DDo6OiY2jlJRgFPD6m+9w9a33ODwac3B0QLfTY2tznbNnNnj07Bk6gyHjYNgtLXdrw7G3NMHgfAE6w81nZFmBq0p8qTBLfdriFsLCiVfc0CPGy1ghEAnGoEKg8eLBgu7AvJRDOdOQstRUSGTCqAjakA/W0EvrEKOQnqNYKoS6JEyPwDVCPEShrMV0epheD2VzMEas+RNioO9bA1rDPBjGtU/nX2hnFmnuronRygw9BF57/4DXbuywPuzw2cfO8otPXuT86hCNQMAuoTjBBwlf9p6mqanqKgWCzplMp5TzihAD1mQibEDJum0LohQyq1NxrUJgkVRz39g0xpg62pYfny4BTojEKkjERTSkdZTwuaTk8j5iEH6BTGsEf4s+pmiahPzKsbMYFUWlxLIjeRvdb8r58/xq1UJaK2p/kr8mYxn5Dr34KKTbDUQOd+9ijMH2VmiE9S0Ea6NT8SQPuHIOn5AlQd1jevaxhbtOLm7VIkRtkK1aUBpCamhi6hQUEk7bNI4maLauPEoxXME14jkWk6feiZds4kQaMDpLQhro6EDP71Hu7TCfbpOZgI41urvJYGWTMnTo93pMjveZT+RCFxePnKODHUa7x6yc6dFdLrDrXVTh6RaWODhFVpxjdvA2vpozK68TyXG+II6mhMMJZDmDfp861LimIbOaJgR0pjHRYUOkLqWIbGJgUmmcD+Quom0kRkvhHBsrOfujQBnvj6/RKaB2QSknzXgQlZ1EtG+d3mQ+L5lXZfqchBOKiolSEBfPpEW75Zm5k+dDAK14/OJZnrq8hZEeFFusororrHUjR3dvomzBxsoKnU89y5tvXmPv7h1codhuPHfGinxtjVMXB8xmh3g3k7VnRalmbQaZpTy8R3W4g3aOTidSLC8T7RJYh+l2yYsB3nWYzgy2Gyk6q6ydOUNWDCnLI3w1ZmVrhS/+o38TpY85OrpJ7XtsrCheevF9ik6PwXCZxjfiGahyNs6dY+/GdeY+wvyYGze3qacTlo2iKI+5d3uHK48+wbW3Xk9jSwcxI4SIC6KOa/Mbo9EYpfHBc7izw/LKClm3SMhsij3SasFJVaqNZElrOcbUiJBm3wGvHGjZcz5IZFU7cfhZrw9F8VTkhgcurEIIdIpc1BvaiPeOhRiSL0lmyKz82qUQXVHPiUFW9BGrInma5S0Ok8T/iFHgdQGtErQehOtkFGQ2Tw6z7UUA86pmLwovZKnfoVdkdPMMYwyNd+RG0THQ8Z5+3zBvDI3OOKgbtKvo2sCwU2ASAbrl1pAqXQVYLShVjJHYzIj1DGUUynaIeU9I7qEhurmoU2JSlC9QgJYuly5GLSTOEKS46nUNvW6Xc6c2iETq2jE5nrJ7OGJ7/4j9gzF13eB84AfPv4w2miLLeOft94DIoN9nbWWJ1c11Lp49xUfOn2a4uoY3OQduwnbQHLiMsoo04yPK8ZihP4vq91C5JkazSMj2yKW6YCunC0EZ8bqJCjH082KGqmM6QSLpIIfgPHVVosoKmxcLUzulRMmn8gKlVlj0fCEID62qqA8P8c2M6KJ09bmQ1HXRxRS5OJ8jPB5rLOJ4kYqBNlog3u+lozDK4BRsTxr+4Ifv8cc/usZDZ5b43JMXePrKFsOOFhdhL1Lqpqqoq5qqqiirkvm8Yj4vcSl+wlrQuiXB/3TnIwpQFs7Ui7FQFISpPYQ1J1A1tOgTiaQsCIlCZOAqpK8nhMxH+TohsKY7yQFZRBYt4VkKY+5DV5KvWuLCyYGl+FtSO7XQEzEiKlujsep+qwa1WDcydnAcbt8l63TJBgMxXQyIOSYt+ZqE9LVKPYGvonf4NHK11izQpfYVFghJPBlJn5DyaJuaFol0taduYPPCJVY2TlE1jpZfpZIr/skl4lMRkYntgAnkrqK59x7H2ZzoR3SKAXMD/e4KyjuOju6STy1TbdGFImpH3snRNrBx+jz1fE51NCOEiqK7THd1g7VTBVYrDu7NmM4yXLOM8jmuKiFMmBzu4eY9fGebWBSU8znOZShjJIzdaKyOEDXRgwliRaMMNFWgdIq6UWQmYIua8SjQ8bssLy3hp5GaXLC24BfI0AmG1D7sk2bFaMPZs5vcuHmb4MNiPbRLo/3++DMF8ElNpiIXzpzm7OYS02qKcpHdw5pP/OInuHbzBueevMz/Td6b9Fianfl9vzO8wx0jIiMip8isyhrIYlNsW0ZDbVgbG/oCXsowoJUBfQB/AXvrlTc27K280kJ7CTZsoynD7XZ3i2STrGKTrGIlq3KIOe70Tmfy4jnvjWS7uyXA7laBeoGqjMyMuPfmO5zzPP/nP/RDIMUB33u6ruXs/ac8fvoI53p2ux3Dn3/KwckcHTqca0FFjDWZoqCIXlFVJYsn32Jx/ASGAegoioJUzOmJpHQAzZSkttjOUww9VfWCsqwJfkcMHjcE2tgwO5jy+ouf0jSedbfm6CBQV5p+6NisYbqYU05VNkC2zB6e0ly+oUaRVleUytCiREAVE30XeHL2Pm++/orgA3YioIrW0uCGJBzPZGTKtL66QivF9OCATIXKCHxkPNspF/9aS5MdiHu+q0piIeQHhyIInSSRA4j1b1i6/MXjG1E8pQRN42mdI942xBBpvReSLJq6rjh9sODB0YLppKIqLVZrLOLOm5QMueSkyEOvyWGDmVg+RiYQxTfHINEfQYamECIum2Jtd8KLGgZHCFFGailydbem78VkzhjFfFoxn00odAE6Stik86ChKgvMdEGrS1Y7jw0dsxwPo0g5PDQjSUY4CykmdCmjOoMC7QhdR0QRtIFigq4rSIkQBkLfYFIQE7C9t1Pe1JKEIsb9qEBygEiRolQcHR9y+OCAb3/8Xoafg2ySznN9t+Xlmyuuru9wPtH2d2yaltfn13z26S8p64JpXbJYLHn85ISzp0/51uNj6sWC66LlB7e/Jm4Tuj6j6wtcMqjCEny6l1Tnzk6Q0rgndAsfR85FytlocfDE4MAIgqRTgr4jtg3KGrSxY7vNuEHIgiU8Op0U2BJsiZ4ts2wVYnQENzD0Len2nBQ9JiUwltj21I+eSZRESsLnJBFzBy/IKMQogcpaWZQOBCSk+tOvbvnxry5YlJbffXHEf/TJY94/XaJVpB9acXTuerquY73d0nQdo5/ZSNAflSVSq6Q8YhkLH2E5jv4/0iOzH8/tXUqSZvTXSWk/uGFPXAZGWCGM6BQizx7cwGJeMZ1PMuFVgl69i3t0diyOYu4ERsRsH5b8N7x2fBOOlFEF8jMYQ9oHfo8FUMpogzyPgdX5OcVkQrU4yG7hUQwhkfteCL6g4ni9ESQvJpTJRsH5JokkzF8oUscRkNT6ecNPoxJU+HUK9ojj4YMjnr94hvPhN8ZMo2mq/ENlk1cqorRk4RVux+76C3p1Q2+dUBuKJbZaSgJCChjnsEkxqIh2ClMYlCmo6wnPPvo2R4+fcnf+mvX5S7r+ju16Sjn9FrXZ4PqX3J5vcUOBKmpC1DDUNLeefkjYZSTsVvgISRvAoI1hojXOB0FPiTjj0YPw8AYLQx/o24T3CZsU0zoQ+x6/W3NYL7npFSGJICQ74LCviO6N8pCKV+gedTXl4ekJ5+cXcg7VuEmnrOwdO8X8VKixmJZn5umjJ3z89AFJBXZD5M3VHR985+9y03QUR0f8bz/4jE8eHoDW/OL1JTeNo+lb8Ak3DPh2y/FcMZ0UkDzRSh5ciA6cI4UIwTO0PdV0RlHMsdOIrQpU6hk2l8T+mjRMSN0St1IsZ4rTRw9Zzj9gs75AYRmiZrNac3f9i3yvGFo30LpAXR9zePSSX31+hS47JosFwTlurm+o6gmnj04YVlek3tEnMSvtA1QmkWZwt7rj9PSU6fIA5wMVAo7oZPAWdCpkHYuJZn3H0DlOnp5l00xBd7XKRVPIPoIJIZ3nMd69ekaQ8qgySzBbF6WUEXlk7/yrjm9E8eSc5/ZuRVGVe3Xcg8WU5XzGYj6RYqkQBZrWKvN6WoKPWKOprVgQDG5g8IFd2+P6QDc4fBDCl9IGq0fVmGw0Rkl+nAuOphtwLmIMlFoxnVTUdYm20HXCRbFaszxacHgwp6oKSmNzNpIHZQkpQl3sI1Jq5TE6wczimLHrHZs2oaNjXmnKzDeylRC7dU60lwdW8nVsYTOvKxH9jjhsGYICW6EmB6iiILmWodnBMAjMr4UobPKIT0ipeTFN+r7qHld1xJm9NBWxSkxnU549OWEInvOLOxn13W64Xm3oO1E1Wmuo6povXn7FtPqUSVVSTScsFjOUUjyKG/7ue4ZyvuR2UJy3iovesE4VnZfNXymkGxwCqihzJzeiZwpjCqwRWanqs3GqD+jkUd6Rmg2xtJhiCQLsZT8n8V4xo6EnaT+Wk41IZOFKWWyhSUUN86P7GzIl4tVrSpMEbIoKpYXjpcaoliSFqtGKFMgPoBElopZC1STFqnf8n5++4Q9//JLDqeE7Zws+eXLAwcTQNFs26w3b7Q5iENJxEg7CuxMZQdYE8ldK7z1pxm8SuweVF+EMZ+YCzIfA4EQqPQxBRjTe44KQ9X0IzOclJ0fL3GUpuUeSjBlLY2iaFpKiNBZUop6U8uG0JniP0ZoYA4MLewRMjefk343qCbJ9iUtJgrJTwrzDyyTJPZFiZHN7ja0n1IuFlKpJ1qJcmoiy2GS/s/2IbRzFyVtWNocQJ/HSilphMnI7jotGlDSOBXbmzEm+Hozp8yHCi48/wA/93k+M+K5TOrkQG++8TJ1Inn79iiK2RByhronlIYMqIGwxJlHYSp6ZwspIxIgyr6gn2KrCJpgvnnD68JTdiw+4fPU56+svuQkBq0t2t3d0tzv6XjP0EItEnxQ4jUehVw5dQCxLoVCMoh+SNELq3jogJUXUiVonrBHRSzsknNe0Hejao4KhHlqW1rD2kqiXtMvqElGY7DfU/SZckJIYLh4cLNg1O7abNn+LoF952JCR4ndunUQunE54/+yQZDxNB1+fX2PKGUdHJ7hJTdv1bB384ItXnB1O+OWvvqJ+/j4DCjuz9JdXeGtZHmliGvBDh7EJpQtICd+2YBW2LGjWK1Yvv2Zycki9PKCoNBPVY30DIWFMwXR6yOLgKdW8oi+nrG4v0WpK225Z37xmt72ibxuCXtB1gZtrR6yntN0N337/EHe9YYiRm1cvmT44YXG0ZGh6/OAopodcr99itQQBTy1ErYhGUJ83b8958f4H8ljlvUBqfPn7pBN9u+X29prn738ozZrO+6aSXNHonEwpVFbm5ymNNCRZRKQQ6w6tMXUtzXq+KAbh6o5F1F92fCOKJ2sNB4dLge2czBoHF1htGra7ljwkFo+NFPGDZ/Axk7GFQC6QXsQYgQCVFRgwhJAluzp7asDYyY0y6zERWymBBnVREBI4l1Aa6qpkWk+YVOIfVWarAmMMhZ0IKTrJvFqhCN7RO4dzgb73+N4T4w4bEbVTOWUdFaFv8e2OQish8KaUxyMCU07rkmlVZW5WNoOMQuLVoSVuW8EeTIGt5+hliQJcv0V1UlyOI0IVyPJbKI29V0sh60JKEbzcbDF6YkxMbMH7z2uePj2m63vuVjuur9dcXN9wc9vQ7Has1luRu2tDVZbUk5KqKnj55St+8KefMV/MePrkMe+9eMLvP33CbDln5+GyX3PVWS6p6FIhRpoRdPZwUtqCLcTsrFCYJB2ljklsLHyP2wW01di6Rpc5qibd3y4hQ7eCwOn9hiK9dpSnB7KD+LjLS0dvTJl5DiqDWnnIkXk8McN7eyNOmddIV55RoCQVujy0IXK5anl9fsP/3G6ocZxMFTMbIQ5YK07RWkmRsgfREntHdfl0OQ9KjWMDGahoJZ9nbzmlFRcXt/zo0y+JSRQ9Y2E58p9S3igfPzqkLEqcC3T9QN852m7g6aMJLw4SzjeEGPF9JhtnEUBExkYoQwiRwkjBq9D0PlKU9Z5T9tt+SLaZ/GpHdVxKeJXu4bkUWF9fUVYV1Xwp905M4224VwvnpYSRTRaJuOzyGqLHGOHb+XAf11IkRchQYCKhxymbUnn0lNH4/B4xjqhH5LOf/ZTo5ZlPIkOS70x+j3qOiP7+UyVP2FwQ/TV97DBa0pxcv2For6grha9mmds5YFaJ2fSY2fKEWGmS0jQ3F/jB49otRIMxEx5Mjyn0jNXNK1abL+l3Hb5XDF2kaSQwPhhN1ApdaSazA+xsiQuO0DpQhZxqZDqgcqGodUTrgPGI2k8pprXGNIlmF3Ah0AwKU/UMPmHrgVo/wGEhmIzui2v6b8zk9h2OrA9aK05Pj+naN8Iby3+3H1+ruP969Ax87/EpZ6cHDF2gVfDVq0s2bcd/8h//Hj//4nNO/87v4J1nFwJX64Zp8vzOi8d8dX7OyitOzp7QGM1SO8pCSRZr3zK1M1JQmGpBaD1+63D1lvnRCUNVc/6zn1GVMHswgZMTJsszqGt2SpF6w3C7xm4Ty/mcRb0khAYXNE4f0ukJrQm0XcOwfYmL0F5f4pXmwckJH33nKbeXNywbz+u7FYenj+nQbNbbTLUQvlIgctVJWf7g2BBTQGvD27fXfPLJx/hx9JqCoO0KBtdz+faSJ89fCPVFeVBjYaXyvZ/EqiBmJqj2pGTyWooQw0MiIfsuPpLNpGRUjhq71r/y+EYUT4MLvL28oyARDeRZzr3cV2swKhuvZUfmKMx7k8NlM4VP4kVCBBf20R7jSYjRU+S8Na1Hk0BNDONIROFcwrlOFpw80VOkTESLKJ0ykbmUl83+K8ZojLVYI0now+AZvJjAic9OJBIyUVR+zhYF1XSGLkp81xPcgDYQvISwziY1s8qjdKIbBnbdQAxpj2xB2pNLUxRPEl0UTA8ecHRywnxZY5RHu07I54gvT5LZAX30GCOxHN7LuMhYQ4HkkimkSChMwdROOJof8P7ZY2IK4vq723FxteLt5Q1XNxu2Tceuk2JXIerCsix4+dUb/tUPf0JdFsznM45Pj3n/+WNePH/C750cE23BqoeLBi59ySqW9DGAkwLHufzZqmLPC5Ek+J7QbgjdQgorrTMIkEca6Z6wG9M7fA/YO4Tf+yKNmUcyAo5Z0qyyVYaMZWlJFg0AACAASURBVGQebHJhE3MRJaPIgNYC/ZLy/RsjJAcxx1h4T3I93gVu24bL1yu63YboPFVpmFWag3lJ04Y8khnHzmrPablXXqncxQqCFFMSu4IcAutj5Ouv3tIPMXMA9H5iMBLgkxLb04uLNa/f3OSwU/bo7He//YQ3a030Kqv8Qh4ZR8rCEGNA64g1A+Tx5nISOJlGdJVY9RK4+tt+jGq2kVQtE1YpmKOK2QsNbq+vKauaYjZDmGtBeHcwQhBynbONgKBSEchrD7JeKa2lmFLsR0oecadWmUsYUfumzscAIUpEi9YEHzNXLfHrl1/xR//XH4pQI6v5BO3K9zt7cHrflJASoV0Rt69xww5VKKqyYlJHApqm9UQ9pxluMSlgi4rJ9AivDmmHhGp3vL34jH61grKjLgvhDZVLJpNTYjfw9KO/z+3da66vvmZ7cwP0KB3w3hABU9eUdQ3VlGiXdNtfy32aCmkilL43OFQ5nqYMFCruY7USMFcaFRVNKyRhN2jKaSAMMJu2NHGand+BZEgqb+LjkUbOmYzuUFBVFcfHh5y/vdqvL/n0MdpDiLeT4uz0hGcPFigCu6bn4m7Dar3j0cOneO8pq4r1zV3OkVRMYqSuS5TRPDwsSW9vuPh8i1aaR2clKvYkbdmutpR1TYiKQifmJ8949bOfEW4dwTsWD55y9r3f5dc//DHB77DVIX3osKXYyXS9EUSqCJRm4O56Tbvb4ZOicYmLt78WTqopIfZgF5QHM4yqGYaek5Oah4/e4+7ult1Pzrl8+4bl4QHWKnxMHDx4QLe6oUDuSzD0fcPQ9hR1Qdc3XF9d8eCR7DfjCNxFx9Wrr3hy9gxbyD4l+bX3/maRiLalABJarnfMameTL8bY06WUR3kxI/vZfifYTIL4xgcDk1A+EHLXFZVERij1LgcjEfIDEa3UQ0UURYNX94G89xBtvmmNoshoC1pOos7zTe8lSHeE1YPKg5cY975AhuzFoaW6lbGhKPBSHuEYY1AmUMWEQ2GsjMaKwuwXN3mtAue9MPkD9INjt9sK2lBPqOcLinpG02zpdltSlAiPaV1SVyWFsbjg73OZoph6dp2QkRMR3Q/suo7LN1+jjWUynTE7eMBiMaftdtxcvKbfteIrhPx7isJiC0tdFDKOLAzTqqSuCqy1FMaIVQIRnQwpWiZTS12VPDg+4LufvGAYHKv1hjdvb/j6/Ibbu62gGL1jvW1k1GcsVVXw+u0lv/jFrygKI+TF5YKzJ494770zfv/pKbPFnD4qLlp41WqulaExU4IPIvNBZb8vSSMP/YAuHcpYyCNFbbSYZY6Fho8SuprJ9Ro1cgLZK8JSln1naF3Fdxa7EQUKaQ+7awSxk1eMey5XCgmCF05VGEiDy5E9Hc71JNeD6wnDQAyemDxtH9k1nsvbFtLdvtOXQi/f22pEmlK2Dbj3/3l3o4hBdvLQywIqwrcwfsr966XMDYjZh4vxdfLI989++hW//NU5y0nFfFZxuJiwmE2YTism0Uhwqk74qMRyQkXWveFykziZBR7NB2r72188QeaLBZ95hZlr8c7fra+vqespxWLOaMW4RysyIjhGrui9FT6Alm6cbKar7DiBFwwoiXBhjJ3yQQrjkJEwk9fBlBGqXFuhlWYYWv7Fv/jn7JqdPBd6bBbk89zH+4yqyWzxEVvi7g16aFG1Zegd3m2oakMXd8Te07Utk/mU2WJGNT1A24q761tW52+IwxqDw9SGuoh4p6mswYeevrlDUdL++qeUh+/z4OGHFLNTum6g6hzr9Y713UqmA0oR+56U1lhVMej8WKRExMm+MhaDiPgjaidedGiwlqqEOIEQFF0PfR8wFkqrUX3PQam5c1NcHlveI07IFdAjIieRUdkbhKMHR6w3W5qm26OBQL6mci5PDg54drxgMwQihtv1js1mByjOnp1xu7ojzg+J2y3GGLYXF3x8OAGlCQSKsubp0xPe/vxLyqqitDUhSWpEGAJ9P6CN4ertDY/eq3nyyUd8+YM/4/XP3nL8gaKuFCfPj7g939K5ksJ7ibYJioRnCJ42Bu5ud3z0/ACrHbumpe8dru0J/S3ogmLxmBAN/eCJcYstLEH3qAQHB0u+913DL3+9ZtOJzUBVVhTzGUprhr7DDQ60YV5UKBTWlvRuy3Z9w4PjByRtskjFc/3mNUenj7D1RFBUmwBLQhN01tPtR3Txfk3HMjr6B0X2c5RiIySfaRkgRpk5vi39xev9m8c3oniKgMsdjVEqG/5lie9I1E0IdGdAJ5tVc5KEY9CURpAOYy2ahA+OFNmniU8mBcvFhGldkTIpfLVpaVvPECNFPmHBh8wbkDGZMYqiUFTFhKrKHJkYcV44IcYYQWtKS1WUFEZRlvJ7o8SFXKVI7z3rzY7NtmGzbRh8JHgZK8YU8UPHsHaooeHh8Snl08dsdi2r22vczrGcW8rSMC1rUR6qLBfPjr/eS1zI6CslWUwihW1u33B3ETG2QJuC2eEEZQ1D1+G6BhccgxvYxLFbVlitMUYUINYaJlUlPLDSynkWzBkAhQQiT+sJHz5/wotnj+mDY7Xacnmz4epuy3q1pe06nJcHkATGGsqypC5v+PqrN/yrH/yEqrDMZlNOTh7w/PlTPnzvCX/v4SG26Ondjl9tFrwaPI3bMsSSZKdSSOXxhEoK56PMqrWFjJ6FxH23QYaOGJtrtR/BZdYPJqq9oWXK51Ll7x9DRFMcvZIyUhCkw094YvR435OGgdg3Ujj1PaGTUe3QbAmuk7GzzsaoSVRC48aYxg10j/nLoVOWP+fuNWVIIOXrJxvvaO4pURxkpHV8uTG0VtZykcirTEpPJGxR0nY9u7bnOm3zZp8bCi1qzEldspzVLGcVi/mUxaxmPq1xWtH1hq9WNa377R/biUrWi68VUFqLz4HOGmhvbqgnNfV8kVGqLFmHjB7JM3fvN5YtIFTGSZWitKPqNG8I+b19viY6NxSj41PK0UVJKypV4L1g8/dKscSf/PGf8vVXL4khF+S54EtKjDxHo9e0b0ojiUDo7ojNLSbKOm1MSegVq1VLPVVU9YLZ/IDZbIZWXhzAN7fszs9JrsPOLZgS7SY0a4UtoDYbrO2ARjbCocCuGuZnz0hGk6zGR4/rnTzfQ8/Qgi1LfHL7zy48FvKYUhFiRPsk/lLRgrEoEwSxiBFdGmosMSlcGHCDotl6isOCIUbqiWOKY+PKd7iGgRRNNkYG9qpKLeN1oyhLywcfvM9nn/08ryMZ1U0JjOFgOmM+qdk1HW2EXee4Xm1JCZYHB8Q0sOkdpuzxnYxPH1eWwiSGpiEaDSGx8wOrzcC/9+IhfbfGx4StZmy7nipYrHIkHbl6fcvpiwc8/97v8OrPv+TXP33JfGl5cDpj+f5DUBKiKwtlTxoUJhrwnhQ6bu4CZWXxsSKYivLBAYlv4Xe30pv6ge72LWHomB2/h9IlsV+TkmUxrfn3v7dkux348tWOV69XWD/BlJI4sWsdViVWqxWT6YQUPXVheHAw4+3btzx89hzlAudvL6imM6bLCaSY1ad5zpFGxPwd4CQ3nCM9Yc/pGK+Gyt6AyLOlYo4t0ipzS9mrlv+y4xtRPI2jFJK4GBty95DJ48S0f5i1SiTvwFjquma5nFLVlrosmNQVZWGZ1DVFYfZ8H7ElSJlHQC4yPD5Eut6xbXu6ZsA7L1wga8Qh2Wis1ZRWUxaGsrRUVUlhNIUS+FhlEGQc86mM5qATIciIA52Y6YrlZAIPs+hXsX/KhekPMQV8TEQXCEPDrE48/uA5fbLEOGDDwFQp6kkphEdrMoCc0EYTYiQ4STxPpDyaHLk9uYjwsgC6kEh6iU8SE1BNKgi9qPuSROKQFCrGPRk2xUjvA7d3a9yQ6IPbFxhDP0CKWKXY7Hai4onS+T05WXD26BAfPMPgaVrH7WpL07S0TUuzaxh9vQprqeuKi6sbfvmrl5TGUpUly4MZjx8/5P1nZ/wHDw/53nenvL6+Zd1vGeJAOxyzNQucsiSs8ER9L3NvYyhyGHTIm0QccfT8e/kq5U7F4JXwRFRgb/QYc0QKyHhMjCZBhZSvfxC0KXnSMEDfE32Lb1tc2xK7BtducV2Hy6iTcJkiMXg552r0xhr7U/YjOynk5PPs/yzfQ3EcLY4/mbJUN+dyJaX3xMl90QSk5O+RkiQFWVmUFHmjHuXxQLb4EA+onR/oesfN7W6PoihEsm2toq4K5pOazc79/7lQfCOPhGSoBaAwWpSXyGLcrS6x1YRqusgk7Vz0JkYvVkESMlfKvsOziLKgyJhIiQpO54QFuf8QUrpSe4eInBkvarrEXgI++kWNo8G7uxv+4Pv/ey6qwn5z30/o3uHmjM9Jip4Qd4TdBaF1eCVJbvWsYPpgBslhC8NktkAXJZ0P+K5h/fYNaRjwTYu2mTunNbFwhL5Gx0BZ1Bg1UABFNnM0wRO2d6AM3gkvabtp8S4Rhkh366iWiXJZYkuLtgjHRUVZ372n7zriLpB8LlqTppzVFAeTTMlQ6FIzURYXC5p1xIdEsx2oK4vfwnxRMgRDn8r8jBVo61F5KiFodd6I8/XTGp4/O+PudsWbN28zbJ1AGw4nBcczS0gDq0YzBMftqhHUGjg+PuHV6zfUp4/w2y0RsG3D/OyYFDVb7ymiwhSJL1+ec3g45cHUcHfZEE1NiuB84PJ8w9PHUxaLkq9+8ZpqpphMSybLgslccXPjsBPF4XyCMlIgx6xQdKkhDIqkLTjNbmjZbO5o1k6yWZcnmHJGcJ0YihYzpo8/Zmgu2a0uJbM1OaIG4awrJrXmux8dMJ3Axa1iGAbarWdSl0wWS/q2pd1uiTHy7PSQ2HWk6Bn6nt16jdKaxfEDpC9Qct/msc6+B0b2LVSUwXgWrYyjcZmeaFSSEXZKHpvk82UIX14n5rSPe3O2/9fxjSietIIiB/hW1lKXhrIqsaUQhmW81dD3gnBoVHYZH7szJeTsYYdSCh/u6DtP13UMzmG0wlqxNzDZw0Brg7WGsiyYVAXLaY21hpBRJec8MQW63tG04NyAMYZJVTCfVFhj8CHQDwPd4OjaQYI1fcB5L6gEuSpGRnh1VbKc18xnNXVVopLEV/ggc1WlxDiyc47gHM4Hws0tISW0rajmh2ysJVxtCUNLbQyFkQVbKSmmrFLY0mK0KPisGTlRghiURUFMkSpJsRbCgHcRvx0w9ZzJgwcUhWVoVrh2g4k2F4iSWzXVNUeLGV0v0QXyb5VN3YeQyeMwdA5jNEVlULkoKozOgcyewXs2u46Lq1uurtbc3G3ZbBv6wdENA3drGWcWpaEuSybXNb9+dc4f/dEP2e0a5vMZB4dLzs5O+fYnmvefzpjMCm67wKs7z6t15HqoaHVFKkqCtdmlWHLddEoyJiaPjZOMTXQmlusAh5Xhu89OuN00XN017IaBu13L6BRORvlSEsfwGBzRD0TfE4aO1LW4riW0O4Zuh2taXN8JipVyV6PE/BWieEyNCFk2q9z3SnskUbY5iVCJ8nN55cgsrjyaE35gjHKdUpKAbUEt0l6CnvLGqHKzUJYlVksUhYxARkr8aDA3LiaRGFTOAxul24YYEkNwuN6z2bZ0w29/8QQIhyZGlDY4H7BGsV7fUFZT6sUShSjwtM4ijdwhjwWxBlEVjTxNsiKVbPwwFk35f6KSkyZH5UJMMdId5G5QWuFCyIWZzt5R8v7f/4M/YLPZEMhq5JQy7UrsYfa+UPt3zVE+7R1+2FLOp+IAnQv/vm+oC0sMnrZt0H1Ps9nhWlFYGSWcT6sTwQkFQyvF4EXqTxspbaBICesCalDUB46w60jK4FKi7xJ970gxMGwCQxcwS01sExMFdlIS/YBve4a+FWf84OX+j4oYZFrRbweMrTGHhmQEbSkjTKuaNB3oukjvI8p6pjUE1zEpNMHbzH8KKKwUTjnYV4KEx0ZHLkbXDXznd77NxfklPkpjfjC1HNYVQxSjWofjdt3Se+H1VFWFMYYXTx7wqukwtmY6nxHiIMiyUdSqxAVP1/fcrHu+/eEhveu53bZUlWUIPSFAt2mITw+p64LD0y2/+OHnLA4rQttjygn10mHqKWAEBdKjWafGx5Sbwk5G821BMT+lO/8V7XrLxGvKWYvbbEBrJoclqYjoVLF8+CHt7ga/uQQteaQKCKFBmZrHj2qM7Tl8cMrNdcEXX+7QZSH+gmlCv15zfHSASpGlKbh+/TW2qjl+/ETWIxVzofkOokdW25Fy/aPz2pkbzTHYeVxfg0dFxT4vLwiKqJSWZ02DihFrvuFjO2sMR4sFzg2M8qIUwPcer2AIAaxhVlj5wEY8knwI3K02uATRebElSFBYy2QyYTKtWBwu0CrhvKiIBh9xzovnUAKXoiAtcc9ckeJsJKlnFn/Mr+1zRz+SRPdETsRcENh38aM8PmnQvcFsGq5vtBi42QKjhcegtajVlEKq8LpkNp1KZ5pVAZFE8luUS5jpjLA4ZdMO3NytqI1jUlsmSEeXAmhVCJclSlGmFITgSWhRSGlFqS0q1fgYxQWWDrfe0gYw1Yzy6CnWWnzX4HYrGDqsBaU1danQuiSWFlBClGdEQBJpIQv4WKwGH3IqvBfU0FjKouT4cAEfJDyJXdNKVlV2Qd+sW4bO0XeO1aZBkaQYtIYQt7RNw+3NNT/58Z9jy4LFYsnz50/5+OP3+PvPz5jPDbdtx+u7Dde7wGVr2aSKWM1zHl4+N3v3dgk09UlCTR9P4Ltnx9zdlkzePyYqwz/5X3+EC9ktPHoZjwXxoQrOkYaO2De4viF2Lb7d0O8a+r4jRokdyHgSo+uSDwPWVtk+Qf4swTscqpCL8ZRjNvLGluS6pjSiVff/JUQRp5JCx0QmcAnqBvv3ligPpNC1BYU2oNIeRVVK7e9rPRomqrHoMvvFKGW0S/5pIuJ4l4P423woJBwbYyAmgorsVivqyYxiNtsPvITJlPYou06ibtWZuC9S6/vtQE5u/jqlrHxTe3WwNbJ8J4EjsznmyFOCQumsrJWX0LJXcP7mDT/60Z9BSPuw6Tw/FGXpb9xHMvpNCfqmQW1XaDSz+QIXGmLvSCoRXKRPjlhahrZn6BPN7ZrUKbSpsHWPKQq880SjiYUl9OD7Hls4qko2wyFYnJfEAfqe0FnQpRQDTUeIYsbatQMgKtK2jUJ07h2h64l9j7DfhQQfDaQqEgbD0EHC46+uOV6eYaeaFCxBDZAGlI5YDc12oOujfDY0ZT3B+ERShSDb+dkBGN2rFWILoI08oW4YODg85dHjR7z++g3LmeVwYiR8PkPfvfPirZWfucXBASk5ppMFs80djamIMeF0yde3W07Dgq8vLml7x5PjOV2z5cef3jGvFckPFGVgvrQEBW3bcHe3xu8GWbvTwOdfNNjC8Oi0op7NmB3MRDwQM/I0VvJJE5IjxoFE5ObqikPzHscffoe3f/4pd7/+kvnxIfOHZ9y9OqcfrqgPl9joofCk6NDFElXOUKoAghhL92sKBU8eKLy/pe7XnB6V7LxjGCyuczw8PhI1pwerCnTqOTw6E09ExBxaxkpmTz/ImuN7/DTKyNooLX5jo91BQka4SbihKRqwCT0WWUoQKRUhYmTd/CuOb0Tx5L0UQVJEaGLUOWMrV/ZasZjVTEqxCSAlmqZj0wb6wd1n0uSCJcRI0w/iAN70lKXFFIaqrDDGS6aaTzgX5IFA5fFJdqnOmWHv+i4qrTCFprYlRum8Y+SIkShKPpfEtFCP0QhR4MMQAyFCivLgqBjwPoFJ+9fSSjhLt5tW4PlxNJS9n2IM+3GO0RprNFVdsTg4pl4cg4rcbTf0uzvqqqSuLFVZUBWWyo7qwsThyRGLg6UQ30OkHxzDbsdm21EksKUV/43YMVxt2fmAqmZMFieU0wkpDPjdHe1mJePKBMZYXAYYRDkhERMhRrwbVTs6o4UWnRVEWufbTwVKlbAHlsPlnE8+ekIMic225epmxfnViqubNXebHcMgHkVt51BAWRYUhXSxr99c8dNPP4f/RXIIj48Pef/ZUz7++Dnf+fAZf/9YDOi27SVvm8BFY7lJNa2eEYuCypb4qLBKvGQ+uxu4+OPPmZqEUoF5ZSEGCLI4EDzJO5L3BNeJYrJvcN2O1De4ZivuyU5GmuMh5q1AhGEYMKYApfdFUQwJ54Y8Ckx7tGjcT2MazdzG0cp98XQv02U/ngvkWX7cM14YeVLjWFBlJECsOzI3g0BWBwO5gRjZ9ChSzoZMyDM6jsfFEUJnl95/Nw4RuQhqubu9oZ7OMNOZnPeUspFvXlD26BL39ZHJ1+HdP98X0jlOWCXxvclI0z0GeD/mTdmstMgmmCM3zkdxmiYl/uX3v0/XtiISUDLqSiMCNVoSZE33yBcxKgqHJbQUSuG2K6JRBJWIwWXZvSF58Y3abR3tNhFbMGVDFQvqWRbjpEr4id5RmogtFMFV9N5QVuC2A1YrzNSQukhSHcpWtIMnJKkCy3mBNSXogHM5x7RLuLst1mh8KnBR4/og2hIlnERtHSkaEuLxZ1OBDgNJw3y5ZEpgV2/QKrLaOLo2YHTPJHkWE8+6NxmtM7mwBFKJMkJR2CdLZsVk27R88p2PePP6LSjDEHKTmWRf2LU+I5By/RaLOcvZlNQOPH1wyGcvzwU9TnA9DFxvr9DWMriO88trSu252Q5sN1IsFloSI6o6MJ+d8v6Lb1HEW/rViuMHRxxeNrx+vWKz7nn6wSOKeiIITIgkVQj3RwmqHrwT5VqMbDYdyb/i8OkZx+9/i6hkKdRYDl98zPUXP6dbXTA9PKBUELZ3IlyJPUVRkoLkBWpbiJq5aYh+4OD0kINqCknx6ec3tEFzfFQSBri4vWUyP2A2rdisbnlw+liSD8bGM9wX+xIgLOthdjeQ9SkvhEK3UEQViUkicWIGTkyyWawhFAV5bsZ0+f8PyJNSqga+D1T5+/9ZSum/Ukp9APxT4Bj4U+AfpZQGpVQF/E/A7wHXwD9MKX3517+HnJAYhPPk3IBLOYeJRGEsyqh95EgIGULWmsKYPbs+JZHsmhBISRECOGNo+oGopRMbTefGvBwfRd4b8zgiKgRSVSoTpscRoZHG3SeG6PFZRjdGmRRlhbbjBiSjO+di7pQiOknivcnwfSRQmJK6LJhOpCgMQYKEJVdKoEkfpHCSef0I20uh6AbH3fUl+u6asqqYLA+ZnD5lvVpzcb6CbM0QvZObRGsinzO6kUsXm/aAhdGaIivuxHfIUtUF1uxY35zjXSCoivrgmNnBU6pS49s7mvUdNoo5XVGKAk5pn8/dWJRKCrlC+FlKa0b+hzJWummAcYO3icXScngw56MXZ0QS7TBwd7vl+nbN+cUtd5sdu3Zg1/ZiZMlYGETabuDrVxd8/fqcP/yTH2KNZTmfcPb0MS8+fMaHL57xH549YTZPDGHD1W5gNShetgWrWJNiQHnF3bblOgaC7wmDJ3qPi47ke5LzxL4jehnPuW4gdDtit2PoGoa+E9sM1L3D8MhVCpHBDRhTorT9DVJ68J4YQi6O8n25JwnnAitD0/tnCPabtMojNvWO1DzG+xw/uc8F5RpfweTcvJjSO42DoHIx3X/uPXdDZfh8hMr3NgdJNiq56vvP/2/r+NtYv6SZFZfW5u6OejrDTmf76Ad5xtTeHsDmsGqJmpAiSac8HFUqKx4hL2z7ojrBnmepEFNMl8e3eixq01gRje+H8CijWMJcXVzw6ac/JeRGby8iYLyOkbGLF9+YhKXHDJfM1QV9GqQo6O7vNYzCWmmChfdnGHppYndtglZRO0/vFNZUxABKewoTUbakSwofNFpHdtcDRWkpFiVJ5eDwFEmuzY2YwZQFRRGo6hpVWVzcEZ3YuGCntM6jbQH1nPlhJPaJMHRQtCSv6LeacmoZmg397prUBoZOUU6mHL73hKOHB9TTHeH1Bbu7Ft9BH++oFpGJVWx9hbQkNq83AZWyQjKDszpDfW3X8+jRCYeHR7TtBhsF4fMp0naZ4pGkAC6LgrIqmVUVKnpsafk733pK3zoxtS01UVmSNsSpZXV3LRYpIQq6QsJ5UNGzHRR/7/e/zfFRie8XTArwsaeoDbNZyd1tw+XbWwZvOD2dQxgwKaKKiTRtbiB5Eb7oynJ0dsrbX36F1xZbyJ7kBkvvAhhPdbSk36zxSbH65RdUc0O1OKAolmhdENWW2HbCu7WGGAfqaY3zHakfSEXBi7MJ7VYTBlmHblcbNl3kkw+f0qw3cPKIJGZme2L32MjFlLAxe+oplQEjg4k5Wisj6Cnku90KZzn4CEn8ApVWIuYGWddMQrJI/vLj3wR56oF/kFLaKsHf/g+l1D8H/kvgv00p/VOl1P8I/BfA/5B/vU0pfayU+s+A/wb4h/+6NylKjU9RfIy0wibxrUpKCYl8TEqO94sDKeG9z52zTDnHIiokB14RlciHExGPbApRi737OKITGbpsTtqKmqyuLFVlc0Bn5hvsv0+JskXLWGrs3MeAzRAizsHgXJ5kZLO7USusxbBTJ0EZht5l1ZWQdJURREsrRV2WoCXuoa5KyrKkKizBezHi9IG+d4QQ6NfXssCYguOTE2JR4nYNQ7NhVmgmEyuqnUxKjjEwDJHBe2IQrpePgdBFCmsYjKgElUrYXKhGBnZvfs2rX/0cZUrqyYJqeQhas1utWV2/xu02pJQoC5vdfrNh3b5LGAUCMtDQSucvY0bxwh5FrKqCuiqoSkNRWIqi5MnjE84endB3jtu7NZe3a27u1nS9p+0GiIqkxjBiKTycH7h2juvbDT/+6S/QRjGdTDg9PeS950/5+KP3ePH+U7734gRjA7fbxGe/esnLl29ZbRxt1Ohyhi4rMNkbzHtR/fQdrtvhuy2ha/BDj89mr0J/SKM7oSy2QVRDtizlvvA5LyyPXiSzrMhu86LqG6/ZSHqXvfVdCfQ4RkikpPbnWDA/9gXPyLfR44gwfZhzIwAAIABJREFUITmKedSW3U0yvyqLNBh9f8biayykNDajVSmjs6Qsif9rVCp/y8ff+PqlkG53fXXBZHFAMZ2CgpDEY0bcp5WogpV4sgVk/G2UZlRN7pGn8TznEWjGrN5JlZBzvr+n9sghYISDNupgY95ctIooFfnj//uPabuevet5EsSEJOtujCp33JCUoyCQmjes336N0o7oFZiES8j1LzRGB5SRAN3gE5s7j49J1tKZJ/SyRrkhj0s8aOUxFrDkkOGIsTCZKcppgVUWFcS7TdclzoHWDlvJeEzpgqSF4/nw8Qm73Q7XrEnJZ4+3kro2YCyBgPeOalHgd1AuLFSerhlE2a3E181tN8SXcPDsmMl8wbMPX/DzH/2UXSdcIzsElnPHMJQEzd70JN8BGe7Ily9f0xQjXdvx4oPn/OiHP5FoLwUuCCovo3jZy+bzA7SCui4w1Jxf39APHY8fHTNLgaFNWFuRTAIsXSsS/lktz3mMYxB0TmmQYRSpvZX7SFmIDltECushdLz8819x+ark4cMjHjw+plbCuxuCoE4qQdc21LMZh4+WvPnsCw7Pjpgdz2jdlouvvqZaFigfmRwd43vxu0PDMOxwXU9RLqimFck4tCkY2i3GKsLQCV2iKogRprWntAnUgjevNrS9B3dH1x1jTGLXbinrRU59kMZDy+OAJom7v1KS8BATRE9Iksgg+03CMvJuA0YrMBpPwqaIVTbPtuUJSok8HvzLj39t8ZSkddzm3xb5vwT8A+A/z3/+T4D/Gll8/tP8NcA/A/47pZRKf00LqrWmLCqMD6QknkWkRJELy5iRoRRENZSSjCdkYZCFRVQoKku9c+hvVoPopDEpy/qVgiijMovkk8mHkNwjWZw8wxBxw4A1eq+ym05Enl1YcejunaPrBra7lq6X+AsfBI5lZHzk/xmtUTpgtMVYsy+6QpD3Ct5gi4KisExL8VYyRh5GH0XN03YD643I/L2XgkneL5KC3CIhK7F2qzXGKorJnNnhMSlFLm9uCEPLbDqV8acKQvJOsuDWlcEaTVFYyuzBpEjiY6WlYAgxUPSaurSi7os7dpcrvE9UkznPzt6DsqLrW5q7G/pmQ/SO4DO3w4wzK6nyRwQw5Q3XRwlMFh5nwrU966aTKBEfiMGz223x/ZCDdKE0htJa6pllVpY4Im3TEZKcD0Fkxrl+zFwyzXrTsNnu+OKLr/n+v/wTyqLg4HDOs7NHfPTBexwdTFmqHZNJ5PBwSl17rq6vuVvtaNqetve8Pb/FBQg+3Ls3q3EEM1KtMyqTJDbAu56iqAkjP0wpxmgahUDJMCIM7A39pL6MuRcai6ZxP323sMllkxJ8InFveKiU9MtKZwJz3nyJMSuy4n7DHQsueZ4ie9NRLeOhlJuYcWj0rpn2uw7o/zaPv431C+Du4hXTxSFmOhWqQRJuTvCC5EikkaBTIgAx+6KJd8YFKPJ5Za84VhFxyU9hr3gckSYFFMYiQdYmr2cZwQxhP6pFJZrNlh//5EeIq/JohyC+TmgRkMiRN440oPwV3d3XRO+laI+B6DVUBXaiqUqDyso+lTQRT1Fb0jDg2kDSBi1h9wSniMnjsVhrhAuKcEDLyjKZGnQpCM7gIrEwFKnAeI3zDlSF0sIPSIg3WRqcmOU6h6KB4CHlCK/LFkyFTjApPQZLoEAVCmMqXPB4p0caH9FAs96S3kRmJ47J4iEnpyecv73KvlgONfSUVrNN84zvskd4lc6oRubJjuTxph14evaQn/xYMbiA0YhVTYr7piSRmC1mWBSx7fnq+pbt6pLHc3j5yzuOHp1xMJ2Q4oAKGt+1mOwEP6ZFjFYjgmBbrl+/5GLynIPlMcp3uGGNKTVpI/zTuq74nd99j75fc3t+w81lw5MPzlge1uL5RYTYcfP2mr7dUZYeM1W8fbvmxcEpRZ3Yba4o6pp2Y1Fly/r8iqrUgg5WMzQV/fqGFAzV7AhV1tS2xjVXMPSUywdEXZL8ACpQmAKPx4WdePi5xKs3V5weTNlc33LybJHFPTLKDElQW5TCauGrkhtmv2sllq0oiEqLT6QKRBUIgzyD0UgBZpLCqFzIkvZKTPXXLGH/RpwnJYSgPwU+Bv574HPgLqU02m9+DZzlr8+ArwBSSl4ptUKg8au/8Jr/GPjHAMZahr6nrkpmi4qqKsUryQq6E5FNwzvJqxuGIavhpDAc2SIxz0Al3sRwODHc7LyUV1mpZI2WQN/5lNmsZlZXlIWQkGVMl8M5swxdCiHZuiRMU4h9PgZMJ3/lfCSESAiSHVUyjqq436C0QasSYxRVUVKWBSqT0Zzzgvh4cIMnBE+bhJMUMlE9xLjnMwi51zCpC8rCYrSid57BObwPEnCc1TJxaNldvyIlqOspZnpIP3i26wZCYDKtKaygPSHAkBLoPo/AZBEPPmZZZ5Y858wtY4V3tZxPmFUV9aTC6ihGaYc19um3UJM5ympwHam9o981EKKkeOeMQfHUyPydkBiCbPYpo4hay4g2Rbl+IUVc7wnOEWKga3v6rscYxa5paDvHpK5EaRST+Go5z2bXstm2+By8OiqdyBtd2w20b294e37Dn/7gMwojBWQKkcViwsOHJxweLTg5OeL954948+aGX372S/phwPmRMyLnTGuRMWsl8L3KX7u+ZTKZQQgy4h0fwyTcjBgkv0xQhjFfDGH6kvfad/hTKiOwI2Ihy3BWX+75dFb8yAowypKSoBRjUyLcKjGGFVXSfYZaLjcRoznuKU+wHzfAPRl5DNaUH/5mkJ7+ptevx48fU88P0NVEolny4j2O0eRa5LEBWbk6Dl3HQOE0lqAAomKUBj6j6cg1GekFSgkKP45XJRN0vD/kWR3HxJK3qPjs05+xXq951/xvRNz3v0rVJtdz6Om2V+jCUiy0cPs6qYmtFsWqRBFZIY2jiEEy+cqqxhRiKOx7Dz4QYk/CYicS61NYTVnCZD4V+xUtP+u8TA122wbXr6hnM+Ynh1QLUH2D6wdSUIRBEbyn0wPaCS3C1jXWaLqtAyJD7ClSQiVN8IKqiIAqEZxQO5QFS5SYKgKrix26mGDLFcsnxzRDR7/akopA3DmxrUn/D3nv1itblt15/ca8rLXismPvfW55Miursqpst3C3QU2D2nbBK98AREv9wJfhE/DYUj8gXlq8IFogcIO7BA8gZGHAt8K3cmVVVlbmue29477WvAwexlyxT0EVNkJlp9rxkifPiR07Itaac47xH//LRPYDNEJ9C01q66a5kCumvkwTwV/x5Oktb968M1FB4+jaZbfzZTEsWQwdP/j8S3R64JNbz5gVV0d++Omn/Nq/8XeJLlJyJk9nqtRGB/DGJ9LKmCrjWIi9cJ4m/uJP/ozrm1uurpds1k9xfeL66UDiHU+//ozF+oaSMk+ev+Ow3XO8/5LjHWxulwyLCLXy8sNbusXKzs9uyfH7P+HL7/85w8qx32bWzz/m9qOO03Hk5oMPmI47puMEU2b5/Nush4Hj9hX7u9eEvkeGAXC4xZLxvLMiPymhXxLWPVqF9abn+dMFb+5O7I57nlwPpNMDjkx10u7xmfPUKAvt3pVqFi0pjcTluoUxtObOV7SYargAAdfIWw5tBHS7GlaIyv8f5KktsAL8fRG5Af4L4F/7q/zcX/Ka/wT4JwDDYqmLIbJeD6yWHdfLJcOyJ3ih963Pbhlhc0clzl/Ge+IcWQyNEpSpGELh8sjduZKKEbhjsEy6Rd8zdJE++svhUMqcUN/y4Jx17F58M6CspDZOCk03sxgWrIclL26vKa1YsY6+WgdY7f/BkKdazLiw5EJ9T2FnFXTlfB45nSfO54nTeSQGR5mDrzCl2aLvWC56Fn1H1/Usu2gcJisxLxzd0iTKNdvmO2WDqKcpUbSDeEtR4c3bO9KYuFkvWa8GYhAOhzP785nzeWKaLPNqtrUHpes6mxGLkFNmlxKn44je0zZx4zQF/8pm0WGgX25Y3d6yfPEczcYNkvFoWV1i3mxeHCEIPlpx4Jyz4nEmEngbgQQfjbjfApCDt+dpu+FrrlS1gkDUvgvvTXVxOJ65f9jzxZfv+PLNPdvdiXGaHsdfdnOiKky1MKYjAuyPJ37y6o4mL2DOLpsdyC+TrPb/Ve0e/Fl4RcrbVoi4i9S5j56vffIRw9CjKhwPJ3b7PYfjyDiaTPli5NnACiNJchlb2xls/+gcbWO15ztASyWbB/5sEETwHoJ//yNQSm5Fld1T2sbLM6dqhkgeu7K5xGvFXuMVysxa/xt+/KL3r7/3a39PQzc0JLnYfdl2E+dakS4OKbUV1Daue+/F5hKUuZoXnRFAbdmL7aA1TvojwmcvYHYkqoZgzWiizJ55tgZ+93d/l0eRwXzFHThDFbUh+UjBk5B6h4RMyRXfQRcD2YGqJwa18YgaClkK5HOmTJU6ZboFhBDpew+rSM3KeHIWIeOFEB0xOrwTYhcQKqX59giO7cORcppQVznnwrmOLDc3xMWAIOQykU+Z3d2Bbu3xFbwfKBVcymbTUSzhAS9MJ/D0+GhjypILucxu+9qGEfbnMDjuXr2xceIQuH3+gndZyeOE0wQVIp5Mz6Oz1mOBa/Ch45KNpub2/fHHH/H61Wty48JdmhAa37SLdF3HaRr5aBXIFV6fOz54+QFPu0jvg+3wTpAQqDLQ9z3jeLJCKnhC33H9UdcmLcqYhLev7nl4+44YPN0ysFwu6IcbFotrBAumv+1f8OyDj1rz0/YZXzndveO8fUs63RH6BZubZ2yv94jPLK6uWN+s8F2EAqtFj4vCcLVkfNiat51mkIzvItMxcfjiDa6DuOpwPtjZmyppf8ItbXxWi/LsZkH/ax/wv/zOj9CqpAKxg+k8It0S1046VcuyM5sPQz9L+y769RppuZ4671c1mLlpfOTfauM2exqCL3Mc9mWz+5mP/09qO1W9F5HvAr8J3IhIaN3bx8CP29N+DHwd+ExEAnCNES9/7qPvAp98/NR8SJyjUjifz4goY+MchRgvieA+WHq9a+2uYCM+8cYtWnhHJaCl4+WVwzcHWHGPLr6zmZmqoUaIca5mOWTOGQvobCMXZ/l0VFtoMwelMP+MGQSiirhZuv+YD6eldXNiPAGH4EPz1ahGhFx1HXoFODV1gooVDI3A7hrh3G6S2uSWZtZon02sI0Ra8afUoKioyX+1HbBwWeQvFp7iOs4Sebi/57A/s1ktef70BhXPNE3UUiweJtq40YkQgs2OLa7GuEo2AhRzLM9pvmdMWTK+Y/v5aw7icSHSXz2h3zxnvV6Sjjvc/oGaJ87JrqsARUqzglB8eMzkqi1LxHyl7JD3ztR8qRS0to1LCjgjF1pOnXK1XHK1WPD1D59TauF4nnjzbsvrN/d8+fqe7e5IaiGpiM7TrsfxlHIptGZTyZ8qvNrjfSPLy6PVErM8XKVAtaL9mOCP/8/vm1FoZy7r69WSJ7cf0MWOWiuH45H9/sDxcGJKVpwZ999OVZuGulbYzeNCQbyNh2UutKiU8njIWkHmbFOG5oE2rw/7DiraVJ/WaZdSGtepUY0bkudaOzIXbl+lxy9q/xJxZBV8aR2sFkNTm0mslmZoGULLubPvec5GvBhfasVLI+vXx/tM7KZ7vBbyeL8JGHdjvtpzjifvF/XC69ev+fHnP/q/Efgb7Mp8DzeCbEmk7V+QDw+IN5Weumx7T22h2A2lz2NuFjOJfMhMp0LOcN4nwhDoVoHYd4grdL2HwUyIvfNWXIoSOo+PAzlnYoRyzkzHibAK+Fgsikodu4ctq2lBXHUsVhvKYOplH5S8O5NzsTOhWFP1mDhgKi+PBX67WJk42d6BM9TXK14s9koHcGPgvN/S0VFTYrnpGE/Fil4HsSbO5QxhyczdRD2ot1XgZl9223+naeT5i+c4b3uqtjVj948QY4cIDMvIYjmQ2TE4RWtm0XkW6wU5Jaozi4u391teffljsnQsbzvWTzb46NAEWjLjcWp8VU9RYSqKnM7Uh8JyU3j2tYHz3RuG5ZKuixA7NCfzwHMeCZamcfPhN5APP2Eat+ze/oR0OvPkwxeUAs4bYT5PJygTUC03dnlNvH4K8Z7dq8+Igye4nuuXH1E+UKbTlvHwhloqXVzQPdnQr3bsXz9wPB6o0cN4JtcVH350w6svdry92/HNbzxnfzhw2y+Mtzk3EV6oou/ZFkDAU6MYwXzmmrZaSKUQs6DO4QjWP4iNsUKB6ueILmnWMj/78VdR2z0HUtt4FsC/h5Eovwv8+5hi5T8C/sv2I/+8/f//3P79X/5lfIEYAk+f3JgrNY3I7eb8sbk4Ebw3+XvR0nwc6ntkVSNhW9dvhVJFkaRUSdYNZm1/b0okcaaMc5cOWdBsCIcVILZhee8bXC7QbNulmHcEIhclkyEfasqZOkOydkDVUi9OzIgpX1z2hGblX7JSpBmG+nD5jLUpCw30sbyeUs1DR7Q2Xxh3OeRraWaGqg3VMBQkeHeJcilF8c74B/0QUQphOrPYdBCu2aXC5/c7pEys+p6n12sWfbTNPQDVvEwIEaFiLh525VCo2HNR66hwcpG5awZcReuR6d2W+zdinlKbJ/hhYcG5py3n3RZPJbiA8/6xiJnJss1qX9X8tVx1TSkh832Lzgom75FSUClUlYYM2D22WniuPl7wrY+eIzh2hxN3ux2ff/GW1+927PYnQ37a9488Cgzsr/Ty94+/9z0PGN7DXi6FmKEyDWi2BQ2gBimfT5YJ+PbtfTsQhS5GhkXPerXia1+7oouWHj9OE7vdid3+wHmcoMlwzUB2vjfa4dqMZe1wl/feow2RLhsGc9MwK05dawg8zPy3mUtW1bgyVcktasiajrmg+pt9/HXsXzCj4eY0bahdU5u2hAQ8bXz/eJ/w3j00NzSF9xC7yyhPGj+mFetVHwUm87Vr120ev3FBRO36/NEf/iE5pUfUSefDRFuhbaitVjgf7yi7B3zNOC3UqdIvA24I5Kkh9BlO+wNpnMAlaKPfXCspOSQXcy8Xh/hE1w14l6gqF26d85HQR3KeOB22TOPE0HdM24SLDokQugpJUTeRinI4Vq66nhADoYfbl8847I6kQ6aKhW/X4myK5jy+Nx86V8H3A6VmqFas5KEyHRKeatB3bN9iVVxUjoeJfrXAFTtPsijOKcMQyaeCpISGghCBtt+oIi6jBCucEUQCOWeuNktWq5WlMcyP1ozFOFjT4gIfPHvKDz+9J14Jms9MBEJKTeofLBNOMzcfLNk8v2G1WpBTZRonilOmCXzITKcTXgaiN9/EUkzxvHKBcSrELvBwf88QF/RDpFsMBB/xriLlRKkR74wf9fB2y2k3Mgx2Bk5F6F2h5EotE+mwJw49VE89H1DZQNjQr5RyOpEHD+NERfAustx8wJd/+iOWVxNdrabuXq+QGomLgW6xRELkyVPF6Wf84NMdqTrycY8+vUWKoA2s0PlmbudkUEet1lhyAQDbPV8VX6rxn5xZFxhoYxOuNK9TEQTHIyn6//n4qyBPHwL/aeMNOOA/V9X/SkT+CPhnIvIfA/8b8E/b8/8p8J+JyJ8B74B/9Jf+BgFRpWixmJFsoxqdSZFiN1jSfKkEJ624YqoSe7alhzuxkEyPb5wP42KUYl2DtMKilMScWJ9nDkkrulIpoE1HEYx74L1Y+K404rlrFgSubVq54IJxnVQV38iyFvnoKFSCuIuRHd4QpFKVaTLmf+MbksZCKfW9mBQaGbEaHwXLmzO1zjyWsYVaGulY9VGG7MVGBVWVXABv1gU26TOlTIwRyRktO9a1sL7uSe6afc58+vaeqIUnV2s26yUiEMUkoMGBC214UJu3T01UrCM2rpYVqt47fBC8REop9H3fFIiFcnhD2inVBcJwzfrFLVUq+bwnHXek82honXPNfLQpIkRBq6lKaptGOVp+mF0PgBC6S9GlWhq5tfHZnCOr4qoy9JGPl8/5+OVzFOV0OvP2YcubN3tevbk3r6nRrCqkbXyPUL2+d3jRbly9jNZ+KnalERLR1jG1zzTfHo9O3oYijFMLWX44mJJQHME5FsuB1WLBsyc3hBDohsg0JU6nkf3+aGPaXFqwphHFDV1q60vsN7j2/dlzsHGxPJLKmRElCVgshd2/zjl634E4QrNXmNdsyYXDYfeXLv9f8OMXvn8p0MdHpE5rhVIhhLbe27PavC1rNb6QPKoiLwhSs4ZwbhYctEKJFj4885t8sH3Gquv3CnRt13ouzCwF4Hvf+97j4X65H+ff0LiZhveSxgOUjCNRktlQ5FGJwVuCfancv93hQqXkxhURkAoSaPuYZXeediOEAR8gxADHAyUpdB01WQN4PIyUqTBNmf27iXxOLNbSLGC8cTi1Etqec9yfrOBYdDa2cR3d5obzfk+VSFw4QhT2dyc2m5VlerYdcprMbT+EwOJayPVEmRQtE/iCZZ0pDkd2lfE0EfpCmhQtkEYln88slhbTNTU3/kcyoGvonylUnXhMBy7kLDx79oR372z8/35T1XXhcv1W6xWJyCGNDAHe3W1Zvrghj5lSPW/3P2T1QrjafMSyW6AKZ5mgCKlmqkART8Kz3R8uqm2HQvWM54S+2rLcLImDJ9eJeqgUHEOsaOxwXimjmQC//tGPON+/w8WArD0qnq7vLUlhLExTYhwD2i8IAj6f0RTA9Zze7bl5uuG4n3j9gx+yul6yvF3QD0s+/Lu/zLTbcXp4gw4Dw9UGwpJaRsZxh54d0ySUovR9x+7hQOhsVGo8pjZduJgE21UutLWFhQU7THQx59HijfJjjXDbE9te7S974rwv//y+6a+itvs94N/8GX//feAf/oy/PwP/wV/2uj/9Q/Wi9Ci5SdexgscKmNlPAy58E/tdZlcmzmbXzvLdqmuIjZP31EQGd5eSCWLFwkyqlHbD51rMSypZcWLS3eZF5AQR+xmPMqVEuCwBW9T6nspujk6Y88p8cx8GI3yXXC8jn6JNVlpKO1SbgsLJRYrJ5WYxeLGK8aQohjAEbzwXL/Vy2NVaze6hcjkoVbPN171HPW30Z5wg31sO1nJwaAvK7OpEvl6RQ8fdceTzz76g08LNZsPN1YIaPErLBGwjgxDtmxEnkNvmXBupXoFacMEIp96Z5ldRumA3fz6/QU8gBMQPDNcvWcbAOJ0Y9zvcuMcVJc/jWMzcGZrKsgiuceWqts2/WmFuSGKwr9Hb9azVumDTwM6IIaDK1SqwWi75xgdGZJ2mwt32wJu7LW/utuwPJ6ZmF5FzpWEHl59/fKkG0cMFfbRmXy5PZ77WvPcS0u759hraCi1VNWuJ3YHt7nBBDoIPdH3H5mrNhx88Y1gMgJLHwna/Z388cjqdKTXb67rZxHFuVFw7C8zeQ602be9JEFJDV2xdlWYBAoo0U1vnjIsV+3gZSf1NPf469i9Hy5Cbaxan+E7aHlaprvHGql4awfLeuG5+mP+RNUraumTRijY7D2n5jHOxLjKj4y0EuBVDc1E/d9vb+y1ffvmTy/Pam3zvM1druBralXO1dVjloiDNCue7Myllzg8n8Basa1lrxj8MbSRMVEox64I8Zdwp4WUPKxshUzw5VYKcOZ0T4HAx4NTbge08XiqSTqQqaAkQA5SM9+2zVk8tgZoTQwjUAMv+hjQlXLDpQfTRoqemMz4Y9cN5b0a+Ingn9F1H0gpTbvuzNVdFPETheC5sFr0h4m2UX3NFdxUWi8fxtLax+SwFaGvpopykktLIs+fP+eM/+bP5XmO2FAgh4r3go4dSub15yuH+M3rv2W3vKC/WvH14zUM+8rVPNixXV/T9ygjkRdASqdPB1JkloSMGLigcTyPb3Ym+C3TeM4yToYTbSneKDKslvoO02zMKhH7BYmVr9/WrV9x9/gVBKr0OlIdKt+oJC0Oz8I5z8nS3V3bu5MnO6+zRzrioGWVxu8IvPKfXb9n+ZMfVsxd0mzVhs2GzWLB/85r923ecpneU6qhlJPgeuhVPbm64Xgu1wMNxpJSMk4BKmf2XL41oblxBm0I5i2HxSiqZ2lJDXBWU0vhPBryoWIyYK6bfn1Wt+J9fIn0lHMZRyCkZkbILlyJhVqR4saIIaYGuKMHZKAw1RCPVjGsKJsfjOE18G494qzJ96+hqO2xKNtt4Ueu+a7EATi1WeHgxifBlUuRseXQxmtFhmc0gHyMpnHOt+5oJ7m2UAs388NEM0YjqjuptlOLFN8Ciba5tcZWcL5wty56yV1SZR3mheUPNKJUhTh4laSGl2opPI0PbRu4bCiNGsm6ER1VT3/ngWQ8LVJTjeGDoQZfPyK7nfrfj9Q+/5GbZc3uzYRh6M/1TpRa5mC7aC9ZmCmincNVKTnZAhBbai9CusaXSixhqFeuJ8X5Ldh6VQD+s8NfPTE1x2JHPe5wmainW2Tb75ZysENbWv4fgL+Ol2j6kjZ7sAHLN9tuiL7RxgKzoUzG1nBFgYXW15uOXzyzuRg3AO08jx3Pi3f2O+4c9D7sjh+OZabLYoNJy8KwIeq+haSjApYAygNH+2NRSUltT+/7zoA395xdsKGrLSjydTrx69c4QOicmNFgOPLndsPjoBd4FzuPE/nBgfziaV1g1DhnQENVHlaNJl0MrqPTyO+dD3Dn73jWbAaw07sTftEnmX8ujrX/FmoFcW1yHmA+ctmLUzl59HNnV+mhGKuYiTpm7ZjtY7VZoIeTAXBa52R+KWeo+vzbtWQ7EENlPP/2UcRyZX+3iumyQf/uBtis6B3hC7Ikhk88ZTTAeEtPJMj+h4Jwh4M5VUqrssjBEx7ITvCt4Vy8+fSoVCcFCy6viKATNlijRQSnY1MHRGrhMzcp0FNzCk0ogdgOFM32Emgvn057OTag6cqmWx1grWpLtj1nJKYF2dpiqQhBi31NLMdf9AiE6pmTLKKeKONtPyR58ZEqJ4zmzuVqR8kSZRooIwQvThUCqBrsRGhAw7/a2f7tmOppSYbO8l3lGAAAgAElEQVTZ4FujPj/mte3FoS3j7snzp/zxFz+mW2Uoe77/5ecs1mc+frpivV6zGNZ0cQEayEBxQqqJfM7IoeJHwU0QqqPHzspxHJlcoIuBqwWNi5pJ44QPgdAN9ENgmvacDpVUCvefv7Hct1A5TxMpB55fmZWBi55xzAyrJapwOp0Yoikeq4toLYynM/u3D4QILgZWL684bU+8/uGXrJ8mhtslXmD98iUhDJxOJ8bTAYmB8XiyicKYOCVPHSEGB6lC0ObKT1sDbSliEVsipsQsWqnFUVqihy0ZbZSOgncRV7VZm2krnKypNCb6+xvuTz++GsUTFmo7fwe1oQSl2kAht+R35qJCnBld+mAZNFVxTX5Nm9uL45K3JmIGdXOQcG0bl8m3A/MoT1WNKDt7PWhzwy7NXLDOb3AeQzVSdjEl3gUG0Zn3YLCtNjjQDmH36DatTWVm7CwrwEoz//cWMOobAuBjoJaKd4EZki+lGeVhTsNGPLfP6B1k0YsEfTYPvXTGHuN6qR2MHuhCR6lWmJZsG3BpsuY+dqZ+q5k0nnjee8qHH1Bjz91xT757RXTCZrOh680x21dTL2ptPlwtLNk109FczGG3uEfScmrFnXeuWU4I/dC1wkDJpzv0dEeuDhcGhpsPwHtKHqnjkTIdDBFUmWEb+wzOrhMIUkCkdf8iUGerBLsml7qg8d0cxo3T1vH7dtD5ZmpaFJYxsFwpz2+vbRMUEx2k5s91HM0P7HCc2B+PHI8j5zFxGifjDbQio2IbuP3+ee6ul4PzMh4QudwHclHhSevCuBTuqG2Sh9OZ43nkzbuHC6oZQuBqteJ2s8EHy7YTEY6nE4fjmdP5bHmR0Aq41Io0u36iegEwTI2XmReBc1iY6d+G4gnsplELRQZrCi5h094EIqUprPx7iJP5stlanGXXro3i5mxC+alrbRd4HvXNj9mVvELjTM1bpvL9P/tTq9V09uISLhyB+XVEMMLzmXWfDYks9v7O24SEicMWJCqhr6hY4bebPMfJsegzg1crFktlGoWchH7RwqZjR5lGhIx3FUe2qKZYwZkli689q0VgLJXzuVAc+GnA9YFuGTkfJlxVip4puWM82Kyw73tKzdSi1LEgXQt3HzOHhz2alfWNx9fMKtziOkcdz6SpiVOKUrKRz2OnbUrRvlgnHPcTcRC6TtHiqbmyXC8ti81KZi6bf9sjkDYeRe17FYVqVIV+WJAOZqJrdXRTeGONWk6JPgBxyXY6UuPE9e3I09sbFosrhsXGfBGlp+SKjpn8cEK3E/WQcSPIWOlQawhdILvCpBWycvfuRFpVrq56fDDbBHEJjhOnLrK46onOsf3yNdNofKSqjnRWzmliTIW19OAjsdsynSdw3hr8q2sKPYJHS2Z91fPlj94RhsjVk4FFHtg8fcpyecWXn73l4fVbljeB9fOn9IOjJivWBU/XDRzOmTf3lat1RzlZDFDKE0Mfmf3IbP+rFDvc8Qq1GXUKljEoM03FYUayEhEKTqDIZUeziQh2LRyh8UB+9uOrUTyJEEJHaMot2xwc+IKmZmyJjcW0Hfalvlf0ezt8nYldbExVKlEjeGnQ4VzXNNPHxi+pLabgopgoFiliFjmP72c+SAGTQmI/4oMnOEfwnlQs68s5f+m+jVckJoVtiIZzhmZ574ntc6WSyFqJzVmaFjg8w76z87QpyvJPHY5tr7ViSc3SQBvvx/ICw6UQLNkk/d57Q728waEFKCkb0uLmrLKKN1JFg1JtQ4ixo2ilk0RJZ4IT9Mkzqg9sjzvy9oFFCPTLgb6P5nFTKy4E67pywbh+doOHYHYQJVmeUHKF7Opj514e1VumaKzEKEzpgI47Q7zCCj+s6K8/MAXjdCSfd5TxZMhhmjlQ731nzsanqhkXuKB6qDZkz9SUtHFUeC/CxHtPoS3Wag7sRZXqlFyyjQWdZ1gG+uWCJ+1ezWK2Dx5IpZBKZRoTx/NoNgrbA4fzyGF/4nQaGadEvkQScRlZ27WXS0TB3CC5tp54PG+tsJpRy/bEWpWUMm8ftnDfQnzFeCar5cDtzRUfDs8JITClxPl4Zn84cBonppTsfTQEZebhqOaGZjan6vnL/lvwUGj5dY+eW/O24mr7nmi+ca3QydWaqjo3edoanXaNBPDN2uCCPMk8yn8snczCpUm1q0GXaZosJFyVH372mV0FbTSDRjQHrOHSGf0spPFEyff4Wii1kM/WdE0nIaVK7M2TJ2dPVUijpw+Fobec0DIJ02SIeFg54iISOk8+JXKh2ZhA1xlbtUwedY6KuWHHGPBROd5NeIRAYbPetAUbGaczi6XnXKAfluRyJnSOWgLnw57T/sSzF9eUKeOqEIMSV9FGea5yOuwIXW9GniWhycY34+mMZkeZHHHZZtW14L0wTpXzMSOpFURVzZqhOvANRrZwv8aZagXwPGKfpw5quMZyuWC/39kaamazhsYXnPdkEnU6cXu74v545MNvPWW9XrJYbFgOa7q4wktEJ+W8PTLeHTnf70nnCc6ZkJWl92QiIh4XnNkBlHQ587a7A2nK3NwsiX1sE97CdM6UMuG8Mk027Sip4p1nKpU325Gb7QF9vkJkxEdHKIqL0N0skOBQsd9Xjnv6MPDxL3/E2598yf1PdvDBQHft0djx4tsfcXy3ZfvqNen8GcN6hYTI9t0e3wlXtxuurp5y/awnT5k/3iUeHg4sbhNOLdJLLsxV45gphdwavDaDutz3ToTozSZEcahr1iuzsKhWnItWXDnBiZlW/7zHV6N4AlJKlDaKUxzUdFG72Xp3Nq8WGkrToNFSLg6juLZnNWPNXIshTsCwWjKezgZlV23kTCMGNmoAc0o8Ark8Opfr7ARdGn+H2tLn7VDy0ZNToSM0QztFfBs11vdnNBhkGNr7rZUgFlApDpwL5k0kj2OvykzsbqBXK9ykBQYH7w1ZUaULkVyMH3ExW2zKFkPUaLlynqLZuBeJxvFRXHsP1gHpxSTUOzMQzSXb4SA2uqxaLf+u86gmSjrROcU9f8FYle1uS3r3QBcim80VMTi0JroYUIQYYxuxKtIFQpTG4aKNGOx3eCdG8M4ZkWALlMLQG3k55UzJE9P+yPTwJQVHXG7orp6xuO1BM/W8Zdw+WLGscnGk9z6Sy8gj7tvk41JMjp/B+WaXMBeV2q6jN6hdPHY9W4FjzvC2ZebZf6px3qQVjcVZNlPnPIsucnW1AMQOv0buLsVMYY/nkf3+zG5/5O39lt3+zPE0Ukplc71muVhy/7BlTDa+bB/k8p/LYc58SPJ4YM4jyvYTU8qkhz33u0NbZzaiWK+WbK6veLlcEL0nZ0Oztrsdp5PJxO119OJy/f8Gef+r+BAxx23XMjRLKY2LOduNtDXkIbRip6jafaNi1kDyGAsh83hUS0OrHmnGrZ0E5HKg2yFgB7UPHaUW3rx+zdu3b208L9bR09AOayLc5dBBE6R7KJV8SuAK5ZxBYKwmyJERMpAbUuxCYUHFj5U0GUrqnOB7RxwiwyJSM6Rzsb3XzxusR6q5k8+cTEWIfSDGyOFwQp0dgnnKHNNEXAxMp0QfE1Id5+OR5dVge2MQNjcbhsXCALSaqZoIQ0X8CAI+9oYUj8kmAjWAF/xSkYMwnio1Z3p1xLUgZKpEnAjjMeG6TL+IFFGURHSJzEAV44haqLLtt01nZ2tCzYoGbKqyuVrz+tU7wIQcTfNCzoWSEn/wx9+n6oQfKt/6lWesV1fErmfoVkTXIdUxjSNpmzi/vmPaHeE44StIMbV6KUqtnk6LcVq17dnSLBQUptPIm6mwvlqwXA2It9PNir6KU4dKpTjh7enM/jQhVdht7zntb1luOtwAMTq02GdDKtN54nR/gnGHLpe8/OYv0V1d8e6zn/D5p685nyZWm56uD6yvr+mWgdPdFt93rG6ecP3i6xwe3pLPR2p/apm3DlkuqJNvTf5k0SpacdXUlLk1vYoigTa9gND1GG/Q4nz8nL3pPFVMQMBMHG/r0DlH7DyffP3rP3e9fyWKp0dabSPdacUSkqURfFvXrI8dGbk2IrUgwaNNnXbpwLTB1200Vc6TFSXe8mtKKZay/R7UKo1jorU5XzfITpwzbx5V23TgoiJz3ptfTyNya6nN46cdoNLUgDMK0GT7IkZSt4PXX2B1553xcspsAkbb7JTggxV8zjU7ByvQnBeCGB8lNBm5d4GqhZSMw5V9wTf3dN8qbdcUfmbZ0CDk+vgdCFYcBGxzWHSGOOWZoFofC89cjFPlAtRxi0yFpQ/w/CXHceLzuy0+T1ytVqw3S7w6pMVNeOcQ7y8IRq2GiJl6zpv7eU14Md6Sq49eT0WtyPbBMfhoxncINR2o7w7siuJCT7+6Jj79un1v6YikE8fttnUmlZztffjgGpfOPG+8o9k62H1qPkdNJVVMoWJ6mzqj9dZ9yoz42PvPc05dMdTJtZmtApPMhnlqXjqqOMyYcug6+r7n2c31hWtUcmW7P3B/OOBFuFou8eFbVBFyVaZWcE3jyJQSY0qM58w4tTHhHOtTmuWFNFXXXO+IgBp5H0yheb87cPewbzWRmXoulz3X1xtefvCMzkfGlDgcjuwPe05nK+7+djweCxrvvWVAVtuUSy2PyknXfGeKUsTWep0LWQwFEswCxVd/oRkAl5G7SLWioo3koCUwUC+FV2PW8XB/z3d/+7ukabR1KmLoa7M4ARAtF4PzmhNu2pvQpDWmMXrUCYvOUfOeaazMHkXOe8RXJMM4GVIdewvdHZYLXPTUqTAdRgiNq1lcE9b4RqcQfHQshyXH3YgXz4SF4pZScVLIpyPFCc4nQlcZz8kwh9Ibalcy6TDR95EYYJpOVKB4LqpGW40TogNFLE8UASeBgOfqesV0eKDkyjSBJI8P2oK9HUgg9n0ba0yctgdW1z2j9JyrgDeRDJpbEzHbR8w8NPvMtSrL1QLE+JfzeZVTMgU2cDhuURkZpGP3rrLqBkK3RKRDKyZceTiS3uyp2yOcRtyYkdryXXFEAlJPJBU67xid4NN796oaOiglcbgrnHZH1psF/So0KxJTcubieLM9W1ahNE7fVPni+5/x9GsvWFx1hLgkp4npDIf9kfMx0XfK9t2RD5fXaOhZr77NYnXLpN/j/tU9p63jyUe3LDfXLFcvqRWO9ydCV+iuA359g3rlJz9+zUlu6BZrrq7XrBcOHeG4vadf31oqQ5vUFKXlgHpcAXWKaVeMZmFnsNDypQgIGW9u/vMeL80uKAZ++Rvf4h/++r/Nf/JzVv1XongSNamm8YTsKHLOUdpmbhtCNa+KxtVwWCEgaqRv43u4CxnPiSnSstiBfCr5YibnsI3J03RM8gi7S9ULJF5raaiXb6o9cITmem1IVynZnMIdhBDwjSRbmj9T0Ups3V2t9fL7gAtHafbh8q2IcQ2xCMH4TUUNjUol24ars/+pWGEpSm6FyDyeqc7AzEYvNdlm+zzUbHytYllzwQnaOqOijRkvYDZ2bdyghVyF6DzRWZU/E5bNLBNyroQuoMURoyd2nvP5gWUpXN2u0OEl+8OZz17d4WvialiyWi3xUWEaEbHvUERtr6Hl6RW1TEDvG2RebDRaq3WuVFMwltrkuJbf5p3gnVJ1Ytp+iT5UxEfoVrhhQ/f8CdREOtxz3j2gmoipOUCHWcE385eKeSvNxXMrmwyONw8rEUPIBFoOmCGc3ntiiGZUiSO3UFct1QpzB9H5R1l7NdSLlvw9O3t75y3DKwhPbzc8fXJDqYVSMnmqHM5ntFa6qlzfrBn6p/joCdE4GTnly7UtFU7nkWNztZ9S4dxGh2NKjOPEOBXrYLW26CPrRFUzp6SctqY8pG1KIXqu1ks2m2tevlzgveP3/+B7v6ht46vzmBsc4RKlUnIC8ZeoltmrbTbdLVSkViuu4bKXWWizFdeztYpcUMRZZfw4EtVWtOtjTgVQefPqNf/1b/0Wf/79P7UVPO857be9T/inHfB5vEcPe0rO+GCE7VwToe9Zdj0uCIcHG/do6wglGTtkWEPXB+J6QT90ODHO3/HhjGKKOtEOxNRMWT3eObroqBLIxRP7HpVA1cxy3XM8HixAuCZUPGVKxOAtRioXpvGED5HVVTROqFaomZQzWhQviriKSqQmiCJorPjscZ15M5EdfuhRV7l5sWH7dmteecYgwHnjd3lnSmS/ECQMTNuRw/ZM3KwbWt3Uxm62grA9X1rIMjMhuRYWiwWo8MGHH/HNTz7h93/v/yBlO5+O+y05KyULTiuvv3jDeDzx7NkzNtdPiUHQw0h9OFG2ezhmZMo4bSFl3qYyWSviIowZVc8iRKZUmRriLFWA3E6IimbleHdg3Du6oaNfBbQop11GcqFSqGIipJIr06nw5Q9eESLgaQa6dmu5IBz3I4f9xIfD0s6UKRHihm//2j/g1Y9/yLR7y+svdoR+g+8mVIWxHNl/euLm+QEXIxICX/vk64YYutioFD37k+fhOHDY3bFYXeGcp4jhfbWYF1d11kz4huYCl/21zPy+tnB9c5bHSTMpHvjWN77Fd77zHX7p29/8ucv+K1E8md9RwfuA91CKN3VbheghJxNDizNrdUslN85FFBt1NJGV8XxEWgX5Hrm1jcJqzqDQ953xbLSiRRvUbRl3RlRutvvVRmd2qLeU6jZmUywbCbHpXE2Z2VTTDnorhIqagd7MtUo5mQkmYs/xjqkY4TE6d+HU+LmDLTNsZcWV9/4S+FnyPLdt/jHNGdo50AJD1zFlm6VXtZtrypnQvIJKmeMawLtg/DGxi2LFmKNmO+Sp8yLJF4+f+YYUEWLXWxyLs98vCMvFohXChVr2DD08ffmU0S142G55+/odXa1cb9as10vGlEErfR9xTeLtW5RIqbMlgjQFmBWPiF0zaRtY14VHfk+p5JqJITRoXZjGB2TamedV16NxweqDT+wwyWfS/oGaz9Rsajrf+aZIVKoUvASkOAhCrhZEqlqbMtQiB6AdbTJP9JKVsC0JHmzUYJ5KSq6V2XhB1EFwUJrK0xuiUHTm/wm5qG3qIoTYESL0K/OymnKmlMr+uOc8JQTjMg2LJbGzYOouevquY7NcIMDQ9zZOnX+PKrnYqCblREoWczROifP5zOE82r9nM+cbk6n8aq3sjzv2+y3mbTPHx/2r/jDfpJILk5qNhOUVPvqSiShdtBDfVOefsk73MRwaLiF1M7Iujz5uir5nXzGr7Ob3YCPnn3z+Of/Nv/gX/OCHP2Y6j61Ierwnm/yvjfmsESs5cX74An8+ImFAoscP5mMXlgEJQog93SCksZLOtaHf0PvIsBmIcba3MER8OmVKyoShUItQnXnegcPHyHIl+BjpumvymDmnA/dvH1huFgxXHbUkyjgiFIRiPkZEcxw/Qlg4Xv/kHVJv8b7iQ6CLkdBDPm/BZ+NnqdloTNuJsKqgDi2xqWyVrCN9jMha2OiSdBrJtvkhCDE4JNgon7Jgtb6iHl+Bg1wmK5J9bNczXArhCwLdCmfFDIpjF0HUHNX7nv/wH/1jfvd//R2mknk4V17cbhjPI/f7E+PpTDpWDvcnNqsHrhY969jjDwU5V3w23600pTYddIh3dH1H7ILRWortOzlE6thoJU2l6cRZHYFaR5UKZUqc9qDqCTFw4zxjFU4YAFBSIZEJKKVNdlTmyY1yPCR2+5HQdSw2tzYqzaZGFOf54ONfIk/PmdIf8Pmf/4Dlk54+OoblEt9NHN69xQ8d/WoFYvsPLlKmzDQWsr9iKgHfLzketyz6FS4Gs/wJ9vk8+igcEhtn0oQbj2QCb4q9BjCI9/Qx8s1vfJPvfOc3+Tu/8m02V1c/d8V/JYonwWaWmhMSWt5cLXbIqBBCb1CyGjnXO/N18mIGl67xUFofBrXSdX3j/TQkqZZmnGg8pWmczC9JayOQ2Sgu6yPyo6rEYIvC6EuG/Nhhboc30jrD5uukNBPNYt3eXIhVrY3YaZuYb/EpuSpOZx+XpqBTpW/IyuU9Y4WMoo37YwRlA9y8+afMEmTx5pSOt3Gammw3hoBIwfdmByGq1Nnks1S0mSmq0BzJraCa1V6iVuRqUzGUbAswBuv6SjW1YhCTD1fNjWDdpppI66wT/XTiOlRuXj4nucjucODt61csnGe1XKLOiiCKhar6CKm0XEGZSf+uqcGaik7sXDhP2Yq6xtcJMTQyJtSS6UKHeIjVUuB12pJP78h4JC4Zrl/gYkTzidP2nnE84WuiegEchdxiINRQR4SppjYiNsSxtvshlxa8q9AF80WabygvhqpJG1VmnRHPiibjs83ZiCIzR2Weqj3aCNRiX7APDqng1TEsOjRW1gZLkEvheD7AGWqudDESu848ucQx5eOlKQjiiN6c3YM4YjdApxe+VK3Gq/Dzvd/QYWhjVyOtIcA/++ff/cVvIH/DD2VW4to1qW1075EmUBFyG6a1OmoGImwUK57Zn8LuJ71wPed4tDp/yY6mwHtk1syDuqqFv/jBp/zWf/ff8/kXX5JTfiSEA3aKGA+nlTnMi7mUQh0ToRvsVCjZFJjrBSEE8nQGoOs9wXkWK0+/XFGnienhSNfGWrmYF1RJmf27M10o5lXVmpmqQi7CsK5IcUynE1PJhHVPiJ44eNKUcS7YCD05nJuFK0opE9PJMR6Fq6uOftXx5s0Dty8W5PsTm+ubxtZOaC1msiiO5VVk2o7gK95NqHh8jPjWshQKXpTQRRvb5Gy4TGvOvcJ4GElDNdSweQZ1vaNOZsw4F6j2hc9/njMHZwd/peusET8eD7x5/YrxfORXf+1fZxxP/MWffw/EkauSphOrvpLHxOtd5Lg98RA7rvuBWxfpxaFFSNMcReMb0gJ4R3WVPnZ4Mr4KJSqHk8n/Zwdt8Y8egfgKSYnAorNInKzQOc+Ap6uZbcnkbFxiczAx5bs2j6ysibvdyJSUp9crvFdKzTjfNXd3hw8F/JKX3/pVjof/nf1dZfOt54RVZOkCaX3k7WeveLh7Y0rNxYBfDBy2E9u9sn75DOmM7xQWV6TziaBC6IKFBpdKEKGqKV4LTXVeDT333uGB6lt6iVrRGfrINz/+hH/3N/8dfuXv/BKbzZWZZv6cx1eieFJVzinjnLkUuzZysQ3JtXDBSpR2mMyjvNaBzQRNLdnGOd613DN53OQvmV8NKWkETOMRYVwmJwRtMTDveRIJME3pEnlRy8zSqj/1mqZiaxJ2Vy81rnUcFghcikHAs89HaAha1wwcs1oRVxpqNXcs8yhREFxzLpZGhDBehY1+Si0E+0gN/bHiav6MRZWgbeTlpN1UM/ncXVy4a1PtlTIb8NlO7kOkastJc0b2nCbzB7rkobU/19rhvHG8SlMSMRuUIXTBEVxGpj03XuD5C7Lr2O62vPryNUNwbK5u6aLQZTEeV6gXGDalyQzT/HtjDHUtpBmcVOtSRztkvLcIlznOJVf7WYs/6fE1U9KO+rAzh23fsVrf0L34iFwy42HH6eEeyRNVit07XhDfvL1aEV+1Nqf6bFB+e3u5XSd7q4ZxO+fbfeibtYUFVZZq17W2jEDnzBV5GBZm+NY8zdQp0Xk0F8ZsmlIXAjWrzR2bKjN6z6ZbNuJyoOREKZnD/mhncvAM/YBXR2ojYki2KcvsDm/KUoo1DuJnTzLm6sm4gK3bzq0R+NvwMGZMK5Th4szuvNjm3ZoHccaD88xB4YYESUNHROciq3HR6jxea0VXE7oo87jfOu1SKn/2p3/Kf/vb/5I3b99e0G1rQhvihMxahAsKOxdesyq37woyDEzjziJWDhPT8Yxf1hZfYrltTJmqe8RXhsHha6EaaxfNheNustF715q/FkdUslI1Mx4r05iZ9pkQHUtdQLTszvNpwru+NYs9RQ3V87GgKVMna9zOux0MK9ZXA/2wYFisyONoXE4XybkylkC8WlBRphBgyviQ8cGUWnnc0Q2xHSYevzCvQXKi88aHEQfj9o6qQoyONE6IQtREpwU64Vgan0wELnEtGXBNQGEOqKpm4Cs4Tscju92W4IUf/OAHPHnynH/wb/0G3/+T7/F7v/9HLAfwAsfJg4PtKXM6FQ6M7F3gynuuXDRBjxNrcl0rCgfFB8/5nG06kQrrrmPrPacy3w2274TeApolFzMuVqHHmtdUhSKFcaosBKKDfXKca6YrlZCh+oA6YayV+8PIVG0EeX1zxXg8oGWJixUfe8QVNJklSuiveP6Nr/Hln/+QL37wimff+AjpKjUHNi+foiVxOk6MxxMyTizWCzbPnpJ84FSaiKhUXL8kpyPu7OiWFuti8WmAKgEPzlsmpPW/NlFoxqaW5dnxza9/wm/8xq9b4XS1RlUtbeTnPL4SxROYMaLzhoZczBWdVevBCajJ7B0RdU24K1zGdThHjINxkJrBg2MeLYFKQ6honSJGENZqSIvz3nhJKFOeTKUnRgBVta5+JguLM/RrjlqpuTS3b1M4KIpWJYZwKUicCC4GfGiI1IQdbEojExuXJ6XJ5uVOjOztLEhT2mjOyHzzBX10LYaWn6cmoxVnfhhahBj8xSzUFHTNDE6VWgAtDbVr79MbqbS0+bHBuyZNvvC2ZvK8GtfFIkPmDdmZMaioBdA611hXzdBTYZomgg9ogL7rbCRRR9Jpb0XOR19jqo6H7T3H11sW0bPZbFh0ZqIn6gi+5Ud5i7Sw1WLFn3fBPms2h2YUpqQXJ3rzYTFUZyblz8IAaR1oSonx4XNOd4qEjn5Yc/Pia0wKeTpz3t2TxiO+HWqKeWW5Vkx1jbw/h0LPo1NRJZmTHtqiJ7z3dHNRLBYia/YQ5TKiTTmhLUPNN9GANpTTDmvrhtGZ6NoOYGnQtLaiFlOZOu/o+w68mNo1l/Zf8+sJ3uNnw9Ji7vwT1jwE7xhbBwe2aavMflRWyD8Oi/7Vf2j7TmfRQ/BhhqtBpDVw1ig5GgLVSKqXGCZo43356S9OHpEjbbRFaT5xoIdYui4AACAASURBVExp5A//6Ht893/4H7m/f2BKEzUbxqmloLPwRez5M99JGhSmitmEoKSixJLphp58rORzJnSGpKgGU5k2QYtOBRc9Iko+HxCfzRpGlTQVfF8vE0h1tiepTKjA+exgSugESCIfC9obym//DiIRt1gxHs5IERuVq6e6jHOV4WqgALcvn+CDGZPmWqhUfNdTnCKjoDlzniqSheoUSRXNR4bhmq4fTDxUC+fDyH53RFQorQkOUeiXjtgv6QYP3qK28lRI48TmScFL5lAmoLsUvjYBmA8oQAJzmq1NEezavH79mtVywTieubt7xem045d/9e/z8sNv8Dv/02/z5u1bvI+sFpE8FYomtoeJQ0ncTcIVgevgWcSOIXY4UZa3nrhx6GhNT3G1TScC66EzAj/GqeuDY7m2UT6jJzPhkkIFp54ojf7SVage1Y5BC2/GibtxQlSZZIRoHn1QCR6icyx7I/2fzkf85OgXBR+t0CoOpFaWVxtuPrzlzQ/f8PrTzxhWHeKF8ymxuuq4+eA5YVizvX/H6zcTkhJXm8fFoVUNNewWlGlk3B/o1leWV4fafkiLOjR1lu1Tzq6T84EYAp98/Anf+fXf5Fd+5Ze43qyBRlEpP5928JUonuaxlB3mxsGpzXQyeks9ri3m4zTZDF+rHfginpqL5dNVu9CFSgyegKOLARd848hg9gAxErxjmrJ1yg0+rzkzpsSUM15s8TgHsYs2vmtKN22dXAjhsaNsB95M+AaYUiIlK8AEI6Np4yz1PpBa5xm8NzmpM0O5UsqloJPaRlVgETDaMqgum1/byGQmm84wMZjB4qysaR5QwRtyVgWo/F/svUmsLdl1pvetvXdEnOb2992XL1+TzIY9JYpMklKVDBiGYZetpmx4VAUDHhmoqQEPPPbEA4/sgQEbNbNHNXB5atiw1ZBSiSqKElUlJkWKYpPd6++79542YjfLg7XjvEeKSbFMsUyr7gJe3u7kOXEi4sRe8a+/aYKAOCNgDolpOwGbiI+7y9AH6s1ZJcT6OlsfFSVjvpVmrfmDYjYMakR/wf4ZZGrv39CVMay4+k+1gc4HKAPSr5nOZ5TjY7YKF+fPeHz+jIPZlIO9OYmy47E5543ALZBJxNQz5htZ46ukWJtDlEiyMMhBX7jYYY2gYsiOA+c6vLP9kPor8nZB1kJoJhwdHeO6O+QYWS0v2S4uKHkgeLczobR9ZY0FtfEU7/EYodZ4dxmXTSbtmmqXgTm8e2eKrJQt3Flzqcevmno6h9sZ8snz0XAN9NVRLKTWFKbq8+V8jVEpdu475/GNjWm1op+aC9vY1xsR47w1TdiJOUo0d/2SM7hIcIZOjWOs4J5nC/5tLkOayo4HqPUGVyvy/QI76YUcQ61IRK5ondCE8ebjhefWEbWy6+S4N0tV/277nj/+6lf5/T/4AxarJSmZJ1iuPnHIyHGxGwUcVUnrGHPuxmtD0USO1Ruu6YyZMFFyzJWsa0huiiYgCBIIwUNJaGMky5LFfNwAaevzS2OvVwouKBo9MWZ0AHGFrkkgjpwMYREXcUWIWmjDxMbuxVC9og7XeJJTuvmejadiwUtDSVvEO4vYEA8aaEJh2Aw4pxWJFnJvqRtD31NcwDnh6mpLScrk8IjgG9rZBNPFDqjvSastRauYRe1zqOLZbM3R3Gm34w6Z3s3XplfGaWn9KNQPpNqx2W42PHr4hLuTGd47Do+OePToATll/t5/9A/5oz/8Mu+//Zc4EuJBiildN9vEgJCanqyOLkbmcWDPZ6ahpevm5HU0899c+XIp0TqhcVIF7Y6gQistmh1ks+ARX6riW3f5sCF4MoWcIIhwb+qY9vB0iHhRtqXgvSnyHMKs6yAltuuedtpYvuy60HYduYk75ffqakM3n9POl0hSvCu004am67g4XzH0D9g7uUGRxLOhY3uZeX3eGZdU1RR19oEgdFOIA5urC/b2DkyFD6iza7rWRt6bZAz1nqYJ3Lt7l7/zK1+ojdMBwTlSipSaAPJB9XPRPPVD4vvvP6WPEbQw6VqaJhikGPyOhB3rRWGzGViuB9abDXEYSNHuOhrna0RKrXpXN565Y6abeOvIjQo1/r08D691nqbxTCYN88kEtrYgllzYDANDLMa1USP/zbqWWdfQTTq6rqVx7vlM2T1f1AxBUIuScZ4Ga+p2BGMtOBxJLR2c6heUqklZkBpmK1V5VS+QpSINO3PLF9EUMU+ekbjoXDGDylz/SSH4wKTr0GCLNLUBVAppsJVAfGIM1xy7dtHnxpNOqE2SULyp00YJtFSESio6ZheZsjMd9d6z7SND31dneSM/GucmQVmR1j0v7c8oZ6estgPvPzsnb9Yc7M042t8nKKTSA/ZB96H6q6hdKMyKodS4CEN0nLrd3TtZEG+LkvcW61KyVJSvetrUMWUXWrJGhsVj5MoWmpP5AQf3PoSIcH7+mMePH7I9v2DaBnxNS23bBgOHrBlugn/u01XMIDWWaueqQMrVdsLTVqdz5DlxXEsyLC8b1y/4YHeYdfRTsAtGSamaeNal3DpMSsqmMKljBFc5TFpVjE6MLOsqWpKLjYdKigQxJajgCC8Yy9U2nZIyG+13I+2/zSVgTS2OLLbw5GpN4VxV/IxOxZUAqFDFBGaYq6XQjokBI7eRSt+pPkGjVYVUlGqz2fCHf/iHfPkrX2G12ZBSMcl7scepsxs7rRwnMPWX8Rp1J6YHRYLHhQlOt3gxUQZeIdn2jnxLNKMlohvT0IkzqxSNhab1ZiGQbDyeskMlgJrgwvmMFqHgGVRx6glBcJOCeguGp7R23jURjxnqTub7PHu2ADyawXslTALboScPCgceJxO7lmo1xfMO7xuakPD0SEk4X0jZU5yQHDx6b8HZrQNQz2bw7B92OK9oP7Bd9YZMl4h4mO7tMWw3BtxJoQiob1mvCl2XIVCRbF/vMp3xFOsUxDhPhk+iz61BQDl/9pSmbXjttddZLBZ47xi2WyiZz3zu87z6+mv88Ze/xLascKK0nWczmMI3HEBRYYgW5Nsv16y/PXB4sGVGgJiJOZGzHc6ApxVDfnAFTZ5+MZAjuIo2uV0eVEZDbaAqqJ0HNYNn57nRdcy84xLlQJVViWxq2sE8tMTlFnIiDRPaSaCZOeJ6RWpa2qZBPFw9uSSlLTk7pGSmkxl7x/uIF+Yn+5w/fEZ/9ZTJ0ZxXb+/x9Gk076lk10DzcB4nMwVtza5is7xkenCI+KbaVdTzvn6WXONoQsvdu/f4O7/8y3zsI29wfLiP87aupmz/hiF+4Of+56J5yrlwtVrXqAJhs41GnJbKIRpDdZ1jiJFhG+ljYTPsHB7xFOJIYK38nqLWUJR6Jy3YGxaoSi0z3cSZTYAT8N6yf3K2zKbVerBtqEQzVVMYOS/4YJ2rDwHxYTcGTMasRksyRYeYTNx7I/QlLTtlWMG4MFJMvlzUuFF2QU67SJjgA/14UVPzwHJuHCXayEZTZpeG5RxDtMDfUr0Qxvfhqqu4kmuDZwRoQehzpORCHiIueJxYXpzzlfCtVP5Yqq7SA43H1GjAkEwmGYIn11HrmKc3xnnkvt6R6tjU2sLskOpjAlrl/zlHXHZQErlfMCyeUWJkv9vDH95lEyPf+v77BFGODg+qSWEh4PBNDVgeTSvFrA9iHOoIIVLGu0EHDLCz5Kl4gd3te8B8VDKZHBMqhq7lovRpxXK15Onjd3EuMJntc/vl24R2ymJxxfvvvQuxh+WKEBpCTfX23hGaYCO9Apt+sGNbidk55ZpvaLEoI7KKE2K2uzegjp6FbT9U7yZMgODdzvqhJHPiHTMLUxxAHMF5cj8wEojt9WqjXRHI4kCrSnUnfAjGn9vmiNYw79GnzDk77m1onnO8/haXaqnXFxvf52Jopn/+iGq3orvrVZ3boWILEVL7lFzqiM/urJ2zMzHvECyIOdGvN3zxS7/HV//l19isB3LKpJTqGMNML311NnfjNVFqA1Vbax1vxcXRNC0bVRwRcRMKGfENo1rZxDEeyWaCWQIIpuf34qFrcQ3kTbTcynrjViohvfF2Xg85kPtCd9gQL2x7YzELkJwaCK159ahDXDHSewCalvVyMFRMPb5TYh/RHGgnMwqZVGwM6LyhfuLsps8riKvmuNiasH9wgOY1q01itexpA2yutpTeSPZFLTVietjgXCCTEBoKAyU68Frvb5Smfl5sV9UBq6Ni8tZAiZR6HbEbNJsMSB2hw6OHj+jajk9/5tOsVquqPAucXzyjaTo+8Uuf51tv/RmLi6dmEeMcs2lgPmkIEsxiZwpDn0jrRL+95LANzNvO/AirOEpcoQueoRja55uak5pHZHFEUMWU5XW6QTaqo3hFI9WKx7EfWkLJLEvG0+A00QM6ZOJyS4mOoY/k2YSYMtP5BDdE1sk4tsvFCqeJ+eGUFCOrxZqmmzA7ntFOhLN7t1hfWvD5wTxzdLLHk/MtYMioeeUF1AWymGGmiifM91leXTLdP8LXzNNGrBcIEmhDx2uvvMoXfuXzvPH66xwe7ONDsHVUCymn2kD9nCNP2+2GP/3TP7Uf/pobVWvWdYes/PjHjw8af9IXfnrhux9Eyv9KjZwieeEX4++c7AgJ1kzU7fuBl/kJ3pP80Pc/8o69jjd1nAvwQxv+172u/MC7eE6e/xE74Mf97ce9i5/0/9O6GDyPDNEXnkV2j/nh97B7lBri1rSd+RxFszEYkUrG5/2BzfjBnTL+ZLtSXtjnMu6E3T57fu48P1K7ZxpRvvHZtY6tmoamaen77a6B/eG9Ik7+yrF//j75MedOHf/80EaM+3XcwheP97iBO5L3Dz/fj9zCH11/9TlG/t3Y1GdQYfg3wKpgzDCMLoE6czEOI7fJUMxcPb20IiNFwXlD71xF7Zpxp9YMPFx1DB/VxGqeb0/Pz/nyP/t9/uytP2e77as1haH2oxJSwZzwVEHNT2r09BHc7jyQOtYzg8tCU3mCPhs/xLc1OqXYDVnXTXF+Ze2cVpVoHoiXittX+iLE3sYpWjzeZ1vsi68Kskg78eTNUNMilNUldJ1YLErrgcB2u8S3YBEukdme5+JJX3mwwqSDEntcUFZXa7pW2CxXxlPyZkNAqCRup5QSKhKGWQz0EZzw5PGSSYChhz6ZwlAolDIQ1SGN0E2EFCKinqKCSq7eeFASpG0hu4hzEwOaxvxB9UiN+jLkHdDKB61HA6rOUgtvv/024hy/+qu/yv0H91ktlzShNy8whTv33uB9cbzz3juGXkqiHzzF1wB7CsU5ShtZxsK67zkcevZCy6RrcMFRskOcIyYLhx/SAEXqWNOmJQFwKpV4b3FLTsyGg6S7RlxyBhyztqEtDZd9j0uwksKyH4gxMU+BUAwdb7aJYTUw2e/o9hq2gzXzMQvNfJ/9/Sl5veLxe0/ZbhP7Nw4pGhHf8uSycNpEZHtFSQeVU2LYd21j8VpjjNS806b7B/TrJWE+s5GeOELrmTQN9+7e4wu/8jk+8uE3ODo8rLzOakALZttS4o+6UO7q56J5Min9v56L7N/+IcK/WRV/6Lz5efIVGmICNv9fb8Z1/YyrbVtW50/p9o9ounY3/qyyll1TPSrxFAE1k96uGqGKOERNTIHWO/ti436Xq9M+cP70Cb/z27/FN779HfqYDJ3OaZf7WUrlt1TDRoUdV9H0MmaFwCjuqCR/LcU4Sd6joWGM2ilJca5DnDV8280aEaGZNcRtRoNHixD2hWavxSFs+wWl5r9RZfDJejhms9ZycnvIcUsqmOFmLLhiiPd8b49+E0h9JMWeOFyxd3zEwWFgsUgUFfoIEjyTiS3yKWeObt8gAGmb2Gw3taEQSmlJpVAkkZInF8em39BvCo0rlH5AqIKiYoiVGQ461lfWvIQWfEPF7GoyA8bRSRkk7GPaaWvuRlR953wqVDUcL/j8vVh2rB4+eMAXv/S7fPoXfhFVuFpc0PgJLgSGkji5dZc+Fx7cf5ccC4NTcorElG2UZfAyUpQ1wsZFDlPhEGXaWbj74JRFTBVm1xFbNJW7GGPXYZOYxsG0ac07D63myHZjZP52Dpc8bXAcdXClPU5hS2FZTXYnCbqukCfFMhNTZNh0hM5xdHLI5bMFm2WkaSc0kxknL2cevfOIoV/RTBqca9hulT97a8u9D90h+w6vAWkqDcHuNFBcVcQbrzUrTPb2bQSKYzLfo2067t67zd/9lb/LRz7yunGcqpBnjCkyAUfAufxjkZWfi+bpuq7ruq7r/6+lCHfu3uO999+la0/A+2oa+LyBUpHKt7CRqhdvjYt3+BElrRw8VcWrmSiGECwjE+H8/Bn/+//xf/Kd73+flAY05aoUK2Ry5VMZciLiODzYZ/HM5PKMo3MZqesvThANTcjaQEhmj9EreUioCjTFcs+0Nn8l1JGwp/QF6QRtk6ngxNFMHMM640TJUSCa2XHwFnoeghBbQ0Fyqgu4eHLx5hadE+18QtokghcohdJvuP3yKW+7K2IJ1sQ4IYeGPhWmbcNmtUZ7xTeerpuCKAnHel3NHZMnDo5BC9ttZhoSrVN8J+bVUIdosRi5vmgG9YhTUo641hk3so5gnZjZpIb2eTMKFU0fUyDUkDcEinFgh6H/K+NsxRpcQ6kzv/u7v8NHP/oR7ty9y9OLS9wgzOczFqslx6cnNtJ7/JAStyQsemm7MQqH944gNr50TeHKK7kIB1GYejPxjZJMgFS0bp7lugkjDcQakKY4+pKYpkBw5oGlxc5l8Y6M4opxbn0R9rxjizADRHuWObPdmgp9kjFqSTbH9xQ9J8czOBMu3n2Cd56Dkynd/JDjlxJXT5f4EJgeNrx2fMDRSaa4OVTenise/CiGeG7xUaF/EE8sSrc3Z1guaUPgzquv8oXP/TJvvPE6B4fWOKGYyhVIOe0+H977nQr2R9V183Rd13Vd1/XTlCratNy9c4f7Dx4wPzwiSPvcCsNJNbasJHsZB8BSQ8rdzsZgRJCoSr1x7Pngvff5nS9+ie++/Q5p6Cm5ELWglZPh1YjDI5fz7u1b/Nu/+m/xv/3Tf2oh4LVB0xENYSSj25aYkMXGNRmpQhuTmeashGDIjCRBCmwuNjgPftpQyT7VwiDhipAGiOsB0ULrwc0FL8lcwmMm5YYwcYROGZISK9/Q54x3gZQj2leie07EbQKNvPTyDRJ7bPvMdjuwjZlNiVz2BSm2APrO0ZSMipBpWOdJVZNlimb6aKbIRQQ/y4iaatC5zBAdGns02kBIWmdoEmA8MRtlEZT940OGxZJ1DAixEp1Gcr4z9A9qJmslkItju+13zat5eY1UBUM/4pCYzed865tv8d577/OJT3ySAjy7vKSbzIixsLe3Tx4yVxdPIK0JNWKkqOWMZoTWmwt7Y6xqNqUYd7EonRdiGQUktXnbgSz6nNPpRig00aqZNzs3NuHGxXNoBaNMQDRBSQhnM4/bbtjETO4L25xo3IQWRbpMko4iynzectXB/ftP8d1LdHOh2z/GbzJPrwphOkN9IrhAqoIfp5WjmatYCRjd7aXSalS0xnjB/ukJh7MpH3r5JV5/7UPsHczN2kXthmMcoY481xExbvwHt0jXzdN1Xdd1XddPU2LBrm3b8dLNl3j06AkHJ0doTc9EwYkZuGoVbIz0gTFuZ7RLAdmF9iKOuO353ve/zxd/54vcf/rY/JtKwmdF1UYMlSBlIgQnvP7qq/zmr/86+3t7NCGQqqXEjrOnWpWRxRAXBaQh5wmxrMlZqk1LsTF4hlKDfHNM5p9GIXQt6q0Z01EsEy1OY9hs8VpwrtBOhK4Ts2VwljLApkBu6Voh98lcuoeEECmywSGkjXFYnCvEVWK+WrB3a49weIvNcs1qrSyvzompchzVEhBShr74us8FaadotugiCYkwoar+CuuSbPEfHOIiOUU6aYAEXSA0gVgKQSYkrSRqJ2hSNoueoXe42QHqRnmAGrG+plYgo9LYGUEfYbMaqoCAqowczyNrYi8uLnn9jddNdBO3fOPrX+fuKx/i5MYJF+eXaFXC7h/s0zSB86cPyXFB0yj9YJCWKjSdp20b2raj9YGgQolKXishN7apNZzYjFd1hEnN8w5rJrwTgjODzwEliI3HRhPnJGpCgqYiQAqNt7/dnO3zeLWkjxmS4HKhPXH02w1xEdEbU1w35+DkkCeXT7n/3jNOjwLqLH3jcpG5ipcczhsOjs5wExM5iHpCVS0WKTgJ1qRqFcuIpUtIMIX98eEpv/zLX+CV2y9x8fQpx0eHu4g3xPTuoUao1aNo/oTuemx3Xdd1Xdf1s6kK5gypMOlm3LhxwtPzcw5OThBpbXxXvbicPOdkvMgxsTDzEakwEnFJiW9961v837/9Ozx6/Jhco6NyNt6P5JoiEAwDcL7htVde5Td+7de5+dJLxBhp2pZtjVbROo6pt+U7bo7gCBJwocN3Rzi3hTKg4izVoRrkglgeoygT3+GDwzVGtC0Fy82MkWEYEKeIN1VycY4YtSJZrjqGF4KAzBwxBrYp4TTTNuaIjlqsTYkNCWHWKqFp8GlDmxa0h7eY7sH+/iGp3yDOcjr7YUuOkVwKXRtq/JCnxMRitabfrJBoHLFSHUeLQiQjdEhQNpqRieAkk5zQA+t1g25su1QtZiT0men+PpO23Y0+dwKN+r2UpiJOJjsREdab9Q9yb0fb9+oKNsSBzXrD6ckJvqx5+uyK997+Hg8f3uf23bs0TUPfb0EzbRc4PD7mPGcaXZFKjXxywnQW6LqOyaRl2nSE4snbRIw9LiqhgNT4nhoGS0HN2BfZhVgXIBY7ZwFizkhmJ6hxqHknFU/jDanzWrNiRTjbm/FksTb+3lBgoWgoaNlydXFpiFEJNN5zeTHQ+szh2YzTkzmXy0suh8KTy8zhjT1QZyHIYr6Ho5yHlKsFjje/Q+fN6sY7Tk9O+YVPf5pXX3uD22dnDNsrvv2tb3Dvlddp2sbsXcRipZqm2RljB++J4Rp5uq7ruq7r+pmU3f2aD04qmcneAce5sLi8ZO/oBGiMgAuYdYDbKWdH00yL8XlufhrjwFtvvcVv/fYXefz0GZuYqq+aUGKpC64SFCDQhoYPv/oav/Hrv87J6Q1iKYj3TCdzFssrYBy1GKdFqt/Q6DmFA5qOxfljDg6CoSAFwv4JiNBvLqEYzydrIa23RJQw7ZAmkGJhu+kZBvMMIlg2mjpHzjBpzD/MaSW0e5BQaJrAZJIpgyFcUoNcHY7QYl5ZbcOksUUyp56yfUQ7O8GFQ0LTUfLcjDp5btCqWonPYrYHuWSmez2b9YLFYk0cVmYpoYlchInXqhw0ZK+6dZpfHOY552oGYakh9pPJhLabmrwd2AURUtMaLEFth26IekrJrFZLay5rzzT6PVHPD1AePXzI3sGHcX6fUi7p48Cm3/LnX7/k4PCIO/deAefYbDfM5nNKTlxRQLemGvTCZOLouhld2xEkVL87M0jOxYjvRaVaJ1SDauT5ZtQx4DgU2xl+1gxOqaPC0S/MJ6URs/1pnafJhabxdE3g5cM9nq42SAGWPa4zFenj8ysuL9fVe1HBFVZDw35suHyyZchCGgo3z45xopRiSkZXndpt1uiN5E0lutcWtgmBG2dnfPpTv8gnPvYxTk6PiCSyazg4PuEv//Kb3L59j+lsjnOOJoRdlq3Um4wfJzC7bp6u67qu67p+irJEhGK5fyr0KTE7PkK8sLi6YO/4GKTBEhGwoFwx2XzGgsF3micRYt/zZ3/6L/itL36JpxdXOCwOJ6aCK7nGU4ErwlCUJsO9V+/xG7/2a9y4cWaeUwVCEzjYP+Dxkwd1+TOEQMefdjYcIOKZdnMuHynTJuJa6waH1Zam83jXEPNgjY/aOESUmtdpWXVx26Ml4tU8tl2jhEaqhYvD+QEJgs8e8TZS8sHRzow4nvpoaqfRt1iEprF8QNcGxBunalheIs192sN9xHmyOCjeMgQrkqc6uih5fDESfeMCvu2YzCI59ZXAX9BcUwiSklIkp40lBLSdWU74FsRUhX1cE9cLvG+eGxKPaNMulwFULWTd+G1h16jGONBvt6PS/gNr22+5vLykpESbCi4PxMHy+J49WnNxfs6t23d4+fbLrDcrusmM/SPBNyvK1SVQ0Bzo+0SJilOhZCVvInnbU5KRt6nJHLsGbjc+NusDrRRyM1iVqsSz3n3kBkHZIak21hOiCF0MaGpw0uHbhtN9YbWKqCaaKJQOhqIMOTM/mtA0gc3Q028j9+9fWZ6n93hVugZUPKKZ7Fz17KpGwMX80Bz1q1jax9npKW/+0mf42Mc/wenJId4JQ9+z6TfEPnNwdMJf/MU3uXP3Ffb2D9DJBB9SBeGEmJKZzn5AXTdP13Vd13VdP2Xt/Ga8LT7DENk7OCLHyPLZOfvHpyZ/AsxDvuDMgdCWqLpo9Zs1//wrX+H3v/xlFquNtTqiNDWsW9UaIFshBI/y+ode4df+g79nY0LvCDUlwQmcnh7z7e+UCoqYd5Pgd6MkrXwrccpkf87V/BBttxR6AlBqpEnTNuQcKb6YuVGwBglp6DeZxeUKiYXQ5IpOYGGs2ZOL0DYDvvHmJK2etmsIncd5oZs4nMLa2T6RKu/XaMHXbetpJhNyhLiJBL8F/x5+cgrt2S7txOWMulAVjorTigg5xeEpnTDJjty0FCb4bIMyldHx2/wURI8qKmQh5jkLaejJKVmDVwKp2L7xlbMWvKCjMksFxKT9RX1VP5oL9ma9JabnC/JzkrY89+8zMhSPHtzntTfe4MHblwiB0Bame3NWixXDpuft732X82dPuHPnHvvzfTQLOQ/s6z790NP3jmHb15gmNSJ5TGhKBFGLU3Gys9aQouRosSzmojzyoaieYKUig1pRp5EVZc0WTs2lnBpJVsfVMWUKQtO27M1N/Yg6pkkYQqIXRyoBKYK4RBAbuXVda9mPs8BquWR+eIyFrlU/uyKmqp54wgAAIABJREFUAq2GpDYWtm06Pj7hs29+jk998lPcOD0hONjGgVTUnPiHSO6VGzdv8p1v/wW379zl1ku3GESqAajQDwPr9foDP/PXzdN1Xdd1XdffQKkYAdeJDQ62Q+Lw9Iz86CHLi2fsHx2DC3ahrx4GZTcSyayWV3z5y3/IP//qH7NcrSk5GqpVY3WCFxuFFcXlgjSOV195hf/k7/99bt56yZRFNcnAfJmEs5tnZFVDX5xSyDY2RJFKYDZUAZqmYbp/RImPmE0m+CCkIeIkENoGnyOokGo0iHeOYVBWV1uLcVJMyu90VIqTYiIIeF+wzjLgWodvzIFd1BIG3MTc6NOQEAUXQF2NCfJC2m6QmnRQXCD2A9uLb9PuZ5i89AIpu+DUmys+DilQXGLETNTX1yyCeCHs1FaGY5TaBqd+4NHD+1w8u7AMvBwxetDYJlsDIK4qF53Dh4Y2tLSTjq5r6NoO5y32SSrqeHl5tTPM3TVMI3Ilo2eREd1jjDx9bNy5y6ePuPXyy5zdmPP06SVPny7wHtb9hm9+4+sc7B9y89Zt9vYOQVd03YRf/IVP8+DBfb7x1jeIcagGqmZIOtlztNLiXaj5lApDQrR6hlVjT+rWjfiayIuKNGu8glhOphMLPfcYwdxjvzck0FIOfNMw2XNslhtcDsxEuNJEf7EiOIdzDW3rCaHDOWG1ifR5jU8dqAU7G3cPiqtjRqmx895GgTdOz/jML/0Sb7z+Kmenx3RdS07RTHwrFy2WQk6RbXbcfPll3n77HYY+cvPllywxpHLottvhAz/v183TdV3XdV3XT1HjwlxUcFUpp7UhWfeRoxtnPHr/XZZXF+wdHJtSSa1lKl6QXFhcXfH7v/fP+NqffZ31Zgsp1Uic6hhekZAgFgmkFO7cfIn/8N/79zk6PmC7XVKy0MfB8hB9zXYU+0J4HgSso8lQTZcfCcNCw/7RTZ587zGTqaDDhtxHcnG4Zo7HkTUTPAxeGZKwWA1s1r1lzokZY4pTBi34kVTsHSkLklpCG5BQzNncuR0q4sSyxlBHHhKZbIsh4KTgnBHKnZgvT84dw2pJTm8zuXFA8RbcboF+tQnRjDojvKM2WqLGbxTnDKmqxGO38zcyd/xvf+ubXF6c74AgVSPbq4wojBh6Z4eFnC2HMg49q9XCuDfBM5lO2T84ZDqdoM5z/uzZC15bdq6UUhGnsUUZ+ymF86ePefX119k7vsFr9+4gonShIfiGbT+wXg84lPXVJW8vl8wODji+cULTNDx89IhP/cKnOTg85Pe/9AeUMoDAZNbQTVsaH2jEAst0SJSs1gwGtSwWZZdrSX3fTmxcq8W8xHxVpInauMyQLGcO5ZW7VnC4itRJFpwLdPOOtEjMcBw7z9KZum3SNZXELQxZySKsrtZMZoVSkplXAr5gI1oXcF5oxCEhcHZyxmc/+ya/+OlPcnZ6SufNFNaJjQCLs4iy1gtDsZHkNmVu3r7Nwwfvst2uefn2HXzTUEQr/+1H13XzdF3XdV3X9dOUmCmiBb4GG8SNirkCyzxw9tItHj54n8XFE/YOjupIq1CSsLi44Hd/74t848+/ZaiOJrJkBi24oiQpkCxkOInNqIpYYOsf/8kfk/8okVJmiJGYEjkma7jq73LOuODMxbxu7w7tqIHdOGv22knH3kt3yMMjQulxKKURYk40wRGa1oJ/yaSoLJZbUqmEYV9tCLKjZJPze4XSFJJv8J35UhV1iA9mHTBkJARSifTLaAiIVAW/gJcMZDQXCIVMQbKn6EDB0bktOS7w7hRcVdZpZgxCLsiOn6NVMahii70BcNlibERILuCLMPQblotFJVZnaqjkTqEoLljmoCkA6lhrbISsCQMhx0JMkeXiwjhekwlaMk3TEGOE2hRLjYbakZOfC/ZAlfvvv8+rr7/GYrnhYO7x0nB2csr5s0tm0y156AFBNLO+vCSVgcOjI+7evceTJ0+YTmd85s1P86df+xfkEpnP53RdV99DjerJ3jJeQ0GKNxNMpI4lsZGYM8yy8YLWENARoPLY6HXnYeYtGucFjI1UR9C+WCh8mSlpgH3nkUag8fjG1/G2Y9NHNv0WrWiYjP4OWhMD64jaBY8PDTdu3OQLb36eT/3CJ3np7JSmxiGVFE052ppdRavFRox9oN9aHugQIyentzh/+pDFNxfcu/cKPgT62H/gx/66ebqu67qu6/opylRzRjxODBY3lRIpZzRbWPCiKF3T8vb3v0s3fcJktkfJhdV6xVf+5Gt8+7vfQ+NgHI9SjNCrStS8W6iKKq4UM8N2ju++9y5vP3pAJ45hyEStPCY1grkt9CA50+io/Bo1STLq/yq3J9RctsL+4U3O71+xF5ZIOzUUK0GKxpspWtAsaNadV454h7pckS1rVIYBgrc91IRAcJ7QOkJnYdialUGFtBpIfSL1A0imbZ01NzKq/pyNN1NAfEE1WbyJzkiSaNdPoT0YOdnWjOSEU7VFXG1/7Y6TsaJHwI0iDhGj0menhLblpbt3ePT++/TbjLzg4eS8jTmLFlx2dZhlDdNzw8kRU6r/VUVTZHk54Jzj5s0zNustFxcXNU5qlNw/N2ushwWAfrvh4fsPcLdfZjo/xGlCh56To0PEwXK5QHPN9lS1gN3LZ/zLr/0J9z70OrfvvkzTdbzy6iu8//Z7rFeDjdCCr02PoFFJsaDJjov5PylennuVjfvOVRTKO0Fq4Lowqt1GZC4jZENZncOrmas6hBDAFYdrGmu+tLBHIIYOaYTiPIv1lkEHhs0GAXK2c68NUv2XLKvPOUfjA6dnN3jzM5/hU5/+JLfObjLpWkpKpKwM2w1dN6NpWwLQekfvPSvdkIoF1VOUzbZntnfI8uqSt976OvfufYjhr8ToPK/r5um6ruu6ruunKFUoKfL4/JxHjx6xWa25ulqy3qyJMZJTsoajZOaTCd//znfoplNwgcVmy3K9piRFiVCMBzWOgbQYlpVRUimkojukpFDQQclgf0sFlxXXejI1dsLbiLAU4wt5NdRlVIo9X/SlLoqCa1oOTl5h+XjNwZ5CjgzDugJWClLdxhGC80iXiBuQEGrzlBEKbaM0XWC239G0gaZ1NI0ZPJZSEHXkoqyvMo6IDwnnc23kbNF1HmKCmAUfzOpAdABtGMoW8EziFZrO8e1tc6BGQLyNXHKuYzsqFlWP2Uhqx7g5ue4Nr4USHHc/9Cq37txlsVhwcf6My6eP6bdbclb8aJwolfsk7HLingei274dWUOK4oM1lqDM5xMms5d59uyC1XJZZQPl+ZhwbKLql4uLc6bzKSLCy6f7dPM9xCnzYc58f87i8pJM9TyNSthrmbSOBw++x8MH73N0eoJ3nruvvMLjJw+5vFjbyM1cFAzNKVo9u4wQPmkKjTeyvdMKB+ZiZH4FTVrlB7prFkUsjcYJ+Gqs2oiNzZwLSCn4CI0TQna4xiMqtAqkzJV3xE1klRKrxQI0W5NfDBkVb9FGXsQyB0PDzVsv8dnPvsnHP/JRXrpxxqRrbb87tSZNBN8EnChNMB8nX7+64FkCGym47M3sdjpHNfPNP/86x2e3PvBzf908Xdd1Xdd1/RSlqvz5W9/gK1/7E548vSTlZAhNyZgBoI3vwLLSGld4+r3vMdnfh9BVIqtSNBn/x9eMu6qEy2IhpyWbjH+MF/Y10NQ4QIZwZQWJ4FTxIvgq6dZcEBdAzINI6uIGgNQFqo62RGAyn7K8PKZfv0sbLC9Ns7HcxXnbXpfw4lDnaSfZOEYC3itN42nagJ9OaIPQBIdrZecRVFTYDJn1+RbRxGya8S5jRBuHTMwSgWw8m+xsH2jxCBZAXIoR0jcXl0BGTqf4cGLmiQIaGkbfgxFtYteiWPOko4HpiKwURZ01BU1oOD454+jkBusbR2xWa5aLBcvlgu1mayHOgsXwSN4hWWInBSYDHNsKV9VroyuSmQCcnByztz/j8vyKbT+GiNew5vr849cH9+/jg7mf39ib44g8vThnWG85bB1ZC5vkcRRiTLQh0E0bypC4ePyIWBTftMz39ykxo2q2AYp5eqWiZLKZTAbF7Tu8DwRpKrIK2mdKXyjRPKC0FCLmO2bMPxvfOTvb8R5CI5ZhuCNsO9LESNnD1YZmNgEvTFLhcog8ywmNA5oLrrp/p5JAM42z8aE2QhcaXnr5Nm+++Saf/MTHuXlmjdM41htd+8U5ikLwjuIEp0IjINrZZ0kLLghbdfROSOsNuIbZ8RHf/fa3PvBzf908Xdd1Xdd1/RS12Wz4v377i1wul+RcTKSkFefImaggWVEnFAa2uTA/PuH84QOmR0eoD5CLEXYFU6dh4wxrEkw5N46aRkLVyK9Jav+vqo30nBekGN+nCBQHPgmhaU3d5arS7gfk5iM3qObxedg7usXi4UO6mdCqo++XSBOQIVGGnklTONiHYWs+TeIgNA3ONQQPvlXwYl499fk1Z1Iq9NFx+XSNpMzekccHRSLGGxMlRYdINn+iCOIyzqXd1hbvazNYSH3PcJXx3duE4z2EDq3ZckY6L1XdqKMLgH0vtVNUY9Wr1gagyI7jo07I6x6njtl0xnQy4eTGKdt+y3q5ZLG4Ig65qvRGNG+MzFFGM1OT+L8YMmtDupIjQQo3zk7o+4GrqwXDMFBK3vHTdOT5aOb9d9/Df+gVclrQr65YPrvkpBUaN8V55f4i0lBIKZNTIvaO4Dz9sGF1taaZTghNQzefUfKApo2dX6424YPgBSbzGu3ivbngq5AHyJXnJaJmeFqbG9mJJSqJHkHIlOJJOePUPJocQpZC2mT6baTxDr+NlABu0nLTOfrU87jfmqhgdN3H1Ic4h3pH4ztevnWbz33+c3zsEx/n1ukZoWvGjrjmLBZyLjUh2cxaffCUIubjFWCG4PE4acxlv/doUfoUYfCcvfzyB37ur5un67qu67qun6KWqyWXi4UtVsU8bUydZSOOXBdmjYVSBPJAj+Pg6ITzx4/YOzrGBTNdVC3ElCjjolGl4SP84NQcvo2fbkqiKvqqeWmGawRxiHestz0Dii+J6aSDUS1VERhz4G4oTipvxVoAj2Myn7BqDiGdk50ZeTr1tE0gbSONU2ZTR3BCih7vG1zwyChbd7UHqdtosR+FWDL9JtNIoZ17gq+okFOKiOXEqSclIGWaUPCdGSAWHEEbxDVo43El2zTJCcPqCa55H9m7jUqDNTFSG8JCUV/HbNaU1bbqBXTIFnaT4hsPSkoh9QuUTFYz6cw5U3KmCZ79vX2GYUM/DKSYyUmrwt/8qnbqufGf/ckQJRQtEUp9Pu85u3mDSTdju9ly//59Yhoqj8qaqJwi73z/HT706ius1pGugYtoZpcvzTpOp8q6OCYHM5rgWK8iq8UFOUWCE/J2SwCavUMOb3+Y5ZOHrM4f4kVwRPohol7Z25vQta1xojDUsfhcFZpjdEvZva0x6odqDDoGHYuYTxZ1v44jT1ctHsQVSs5EARJG/A4Nz4Qa41NtCVQZUjReV9Nw9/Zt3vzcZ/noxz/G2ckpTWPO4JRq7ZEzMRmSW0QgRYoEChGKkusxFx/wrdIWJQvM6jg31uY15r8Bk0wR8cAfAe+p6m+KyGvAPwFOga8C/5mqDiLSAf8L8DngKfAPVPV7P+nrXNd1Xdd1/U3Xz/L6lXMhJhublQK5mNrNUe+CtVB0bCAyZSjglV6Fg5MbXD15zP7RIa5pbaSBOV9LFW7peKEfxz3OOCCJVMd7VVVWeUKiltOl1bIgl0LKSirZssdsroQ6G2/4OtKqa34dPRmvyXd7DP1jpCTjNDmPc7B3ekCOmc1yCRSaxgEevJGHtVCz0KryTIGiJFFSUrQknIcQxMjFihlcikeLM8K3JELnCKHBTVrIht7M92eUXOg3vRG+c2K4ioQQiOsHtG0D7S1A8OoMWdmhQJX7pLbIl2qMOSJ6Ugn1xdm4c7teWDObDclJ1YU8xQ0pJeMIZbM68K4gQeq4NuzsJUZEa9c91S+lYAu7c7v9rzmzXiy4efs2+wcHPHr0iO1mw3q9IpVcz7fIO99/m7v37jIsHceyonMBcQXclLt3b0Iu/MX33qffbChaEJSi5q1FPxDTJf38iNOXXyX4KVfnD8h9BDFyf9tMaZtJzewTVAo+96hExENJukMui1aCfP15bMDHAaVZHDw/H6zRMgsK1KFVqZpSAhW6INyaTHhns0HV+H7jvmmbltt3X+Hzn/88H/3ohzk7PaHrGrPfyOOozviC3nnU2ahYVYklk3GVl1WPiFpT7htPSyCXwIQJh868u8bG+kfVvwry9F8A3wAO6s//LfDfqeo/EZH/CfjPgf+xfn2mqh8WkX9YH/cP/hVe57qu67qu62+6fqbXr1xHZ2QjNRctRkJWG6dlLHk+abZWpxRy8agLdEdHLC4umBwdEUJTJz82SirUO2etJpMUnEJyGD+HsbHSHRF7bAyoCEFwHgrEoaeZeLN/cs85OOyewRo853c0cvzkgJRmHMyNE9VvNzb+mDW4DN10gnjH0BsxHg0oiTyAhKq08gFxxluxWBAjBvnGGj/UkVVtYSsCmnFB8K6hmXS0XUfXTek3W/IwsN32uPL8/QuOjBIXW8qgqLxLOAqo7pGlRZ3gxZMBVPG1ucworuiuOdXaCIiIRd/0C/rlhUXH5J6cCilHco7kWCygOUdKidYwqTUUzoMTxfuGpp0YKXy1ZtJZBMmOJ4Xi1EaPqrmS3I2r9vjBfVIuzOYzDo/20Qz9MHB5eclqtSTGyNtvv8Odu7dZb4QBaIPn7huvMA3mlfWJD7/Od995j9XywsbCRRhSZtBMmCjy+D1Wq0tUTXRQxNN0pqh78nhBCNvqVl8NL4uRx0WsGcNZg++qwpAiu7w7qeegcy8GUFP9sWA0GJOxNynGiVIpSHEctzNWJfMsJ1M7qiPGxO079/jcZz/Pxz76cW6enTBpWxvP1hsAJ85yDaunGQgxZmKJgEOKjWu1KhtH7pkPjpbOQqKd2Xp4hObFSesP1U/UPInIXeA3gP8G+C/FJAX/LvCf1of8z8B/jV18/uP6PcD/CvwPIiKqP6aFu67ruq7r+hnVz/r6parmyqzluSJtx0cCl5WsGc2jPH7kHEEUc/yeHh6yenZBe3RA4wKK4L2jZEOhyNZ0qRZ8ZSWPMa6uNlup5OcGkRRQW4xNbZfZbCKTydQaF6xBKM/dChj5OkX9zshxPt/n0fmU2Swyme5RvGNYrEnbBCmDCiEE0EIOUKJZNrjJGCTrKRl8G8i5kLbW3NkiByqGiuFc9UoSino63+CDR5In5UhcbAnTBnWOtB2Q4lBHjQARCpl1H3HRDDrDYkvKgf27n4GmISE1189TpFgzWrKFAyNEzbaAuwBO0TiwvnxmsSwZUoqUksh5ICcLDy7ZJPSlktzNB6uha+dMp1OaJiAu8ODBE66urljIgqZpmUwmdJOOJgTU+/qeK5UtKxIcOZvVRVor+wcHzOdTJrOWybRj6A/ptwOr1YoHDx5y4/SU6f4+Z0eHTJzgfIfvWg5Cz707t+nzGbHvWS1XDEOyJJViTWBZX5FV7DxTbFSpxTyVqkHkdihstzaGdUUJWfEFggijN7uMiFI11XRijZSTsWmqAghGPlRFrcbmvxSIVNcHRyBwazJntbxiyNaUTro5n/3sm3zsEx/h7PSQpm3Qug15l7NXR4riKTUnUUXNfT/XZkkhkXBiyj0TFJhx68wJfQhEehNDjOLJH1E/KfL03wP/FbBffz4FLlR1tN98F7hTv78DvFMvKklELuvjn7z4hCLyj4B/9BO+/nVd13Vd1//b+plev6azmfGaRiRIi/F7RNFs6m6tw7VR5e4KJDEjy4LdnU8P9lleXaLzOUECEXPffjFMWMSy8bSYrw7VCFAlQ7YRoarUvK+MFqnkaTHkKyXatrGGb+TmWAaMGXcqO+6Tqin/wvSE8yfvcOP4ihA8ZRKImx5coURr6nAOr1gCi4OKuxlgJmJWDPqiUaVxYFQdzpmdZUmOITlC40mpsH62IfdKkEI7D0y0ULw5iJcab5NT5cykUrPpIr5f07grmmYPyAimFsuMI9QM2YwXc3EomYQiako1LZnN1VPiekNRpRQb2eWcrVkaj7NTgg80zZS28TTtlNA4vO9w3rysLs6fcXV1QT2fiLEnxYHlwlSELgRCCDQh4EPAAnk9oW2REtGUWS0WrK4uaacdk27KdDoleEc3bRDx5FxYr1c8zMqy85wdeVwLoZtxsTrn2bNLJq2nayfMp9bIxNjT95HNEE0JhzU8RW3g5oNZMgTv8a0gPjPETMnKNiecsxuBaYuJBRI0mBWGEyFgGYwiQqgj0OecL3n+/fjrOtoTKqI4FCad8Mpsznc2S7IWgm944yMf4eT01Ew+cbublVHhV0qqnxND8Mx2wY5r05gDek6FnKSG8Fkb54uJFjKKqkcmHSKFeZl84EXlr22eROQ3gUeq+lUR+Xf+usf/pKWq/xj4x/U1rlGp67qu6/obr38d16/j01OVZCMoQ6BqusUIJ1SkR3wl0mohiS3C1diJbBp/pvN94mqJTCZo8ZWMa2aACjZ2qA0alUgr1YNHJUNx1a26ZseJjQ5DHZ2sN1uatjUeiFSkDF+VaFqVaZYBh9j44uTsJu8vFywWj5nPjdsUgsM3HTFkNEdiTGi2XtSAL9seVYvxKFnIMZIjlCKo+hqLYmhLyo5+I7ig5H7DcpOQDC44/KxQmsg2+TqGND5RHiJpm8yQVIvtXy+UXFEtt4Z4BU2HU0fR56RvTQktoJpIFQ/BKyVl1stzhvWCbFkzaLYxrL0XITQe7zp8cIQQ8KGx/eFaUzqKB0zt9e6775GjqQR1h+6N/811IY9EZSevd84R2gmTrsOHYCalBHIqLOOyks/NsNN7YTqdArBabYAJm8dPOD0+ZOoTQ7+h367Zbgo+mMWDOOH0eM7+QQfrNbKNDDEbT01kx0XzziHOFGxdYwKIvi81z696N7WOPhWcjMykeq5XwnijniYLTW2iRhjKKzvXd602B5mKbIkFQpOFg7blVjP5f9h711jJruy+77f2PufU4z769pNskjNDzpDzEGTJGgh6wIJsR7YRCYbjGIoiQ4AGtowB8kKCfEgk5FOAfEk+BJGAQLZgxVACO7YgR9BAcGzLI9n5kETW6DUakeIMZ9gkm+xmP27fZ1Wdx94rH9bepy6pJsXLZrPvKPtHXnTdunWrdp2qe/aqtf7rv7gx9IR+4NLODpO6So0UKeuHQIzWZJEGaFei9ifi0x9jOv6+qhAd6GMWu9tjV97hvDn4i/Zm88GEcQzhfXgvmac/B/w1EfkhYIppBn4a2BGRKn16ewp4Pd3+deAjwHURqYBzmPCyUCgUPmwe+vlLUwdcjOvSHDHNb4vJ1TsJU22TsBl1fQzrYbPOPvU2VQXzKe3xEj+d2hBfHQi+Nm1J2mxG/bMAMZDVT5I6uUQs02PTXELSTcFqObAx76nqBsji8txeHsd2elUrWTgsu3Lxiae49Y0DvB7haxCpiP2KZuscvm4QX7E82qU92Lc2eXGp0y0J3cWyIeoCfRsZkveV8wMEZxmdEAkr65DyXqnn0EwddWMi7j4k3dhkgF7pFz1KT3Tm5RTV4dSl4clC3QRWB19no5kQZduySCFYJkmVQS0zFkWpRRg0cvfG64TV0kweqwrnrLvM46lqG6LrxON9hfMW2Ip3eCf41F5onlmR/f0Dbt+6zbrie8J5PHenjWHUeoMf4kB/fMTi+AgRwVcVTTNlOrNSn5xI0/RDpD86xIljMplyfHxITJYWXgJd2xFDRDzo0FuZVh237x6iKkwmlh2yMSspOKyEqq4Q1u7iKuYoPp16Qt0QetDYJyuBDryz8thE6FuQYM7tsQ4ctJFKQFSY1Z4qCjXpSxzeYaaXqVQcJM3IAwjKY9M5x8tjVm1L7jrNfwepaQ/x6W8rVjZjMUZUhDThOAVVka4PVGJjZ7IGTgVUHE1V0XhhqZF+UFQbZtN3rtu9ixxqPDH8lKo+papPAz8K/Lqq/hjwG8APp5t9DviVdPkL6XvSz3+96J0KhcKj4MM6f4WU1eiJDGl8iLk1M84tG2Jk0KzriYjGNHhVLEgSYYiAb/BNQ3t8bHO3gloHXz8wxEgIFmgNkjrxorlC584+N2am7HGjOAiWtRpUWS1sExK1YmLAdEg2jA/zh0o/F3WIVMxnG2xefIrVSvBOcVRE79HQMbRLk9/GgJs4XC0WdDAg2ls3W1A8ntnmBPVCEMVPlHpaIZXQNIIXpWqU6QZMNrGfuYohevrgGUIychxIJpUD6pJfk4OqgroB5y1wbXtY7N+lP34V4pIYBoZoc/JCNjEVew3UQVgcMm+U6cwCgcViwcH+IUeHS9rOAl3nPFVteiznapzzmOpGxiyGOCUMgddevW7t8uhoTZBHuaT/LegdBesn3rcoSrDMWN9yfHTAndu3uXXrNrtJgN73A5VvaJoNC17blQUIXcvt2zdZLDua2QZ1PaH2nqYWKueIQ7AMKZatqZspzbShqjx17ajrBu9rvG+o6yl1M6GqJ+AaliuYTLe59MQzXPnYp6j8BHN0EppJw7RqmG+YSF+d4ivLYobGozPPfgzcDh03Q8fN0HIjrLg9dNwLHftDx2GMLFF6zH4iOnMDf2prE+1butWKKovO1YLOqJEYIkOI5PF3AF5hyDPxktZJBIKawWxT1ZZhSiaqUc08tmlqJk1jwXL1ziHSg/g8/dfAPxaR/w74XeDn0/U/D/xvIvISsIudsAqFQuEs8YGdvyx+SZtx6nazYGbtM+REkZC0SDHapu9S8IPN6xIwTU4MNNMpoe9Yro6op9Ox7d3awW1WPWobb/DWpaZEG7uSvHFsdzFtlJKDK+H4eMFkY2JZLtJg2CzelWAdVRGykEQVxAkb21vcvDVh1vY0s47abbBcLECVPg4INU2zibhjVHslIEqIAAAgAElEQVSIuTRm69ZQ40XZOT8lpjJhvxqgX5pIeYp5V3mHqyIaK/ooVAgiEaI5qg9HLaKKS7ocV2Gdi1qlUo0QBiG2kdVxx/Jgl6mfIvXjphHCnk+DR2tH7SraxSHt0THHi466Ejbm2+ycqxliT9euWC17DvdWxBhAoPIVk+mE+cYG08nMPKhSjccj3L2zy53bd0CzsF/HIIv02mSJc0awMiyMzWj2/sr/KanDb6BrFxweCE3dMNucM5nOaZoJ6muayZSubTlaHCMibJ/bwXlYHh+zWrXMtzZx3nFuc8b2rEFDZNH1XL95i0lTW1bNeaq6YTKbWvZq1TOdz5nOdjg83KO/+yZXPvIpPv3df4lXXvwyN1+7Zp1qwVF5G9o7BKXTmsnM03Uty0U/5t6CWDVNVFiKuZJ7ESoilQpN8Mx8zab3zKmYTBu2VFkcrUavUU0HSlIkGoeYrDJSOVijlQBzxjaatg7BnMqjEpO3GgpDiEk4ZeXL2jli9o+6D6cKnlT1XwP/Ol3+BvBd97nNCvgPTnO/hUKh8LB5aOcvVROIq5opX3I31mDjRnRgnCUnfepEctZhRVSifUQ28Xe0gKUPymRzm2HvDmHZ0syniHjzNdKIxjiaEeaRJyntYZqUZIZp3gDJDBLLUnUxsDg8ojq/k5yhc+9TFnWnDEnySLJxLBWT6Sb+3CXuHd3kyhyQjo2Ll2kPltD2+I0KpxOk8mjfExBiGMwTSAcLMsVGwkiAIfaE1UDlAl4CQ4ROK1Stnd+p4HzEV4EYK+IgIION+XCpY08cMVRWeoyBrhWcG/CIlReB7niPSoRqK1BVT+BchasapK5RFfrFES52bG5tMZtPOTo6YG9/j6E3I8zJbMrm5gZ+x6Ma6dqOvXv73Lt5gLg7NPWEzc1NNjYmIB7vHa9ce40QhmRfkDyFLDoey2AijAanSSpNdpHXPN4lK4mEFDjHMQhGIl2/ot1dAveo64bNzS3mm3OqqsFXNUPfsWqPTdw9mzHf3KTrWjZmM7Y2ZkwbT+h68A4/mbPoO3xtHZTz+SbOC6GLVF7ZPzyiaaZceeJZYlhx89rzrA7v8olPfQc7Fy7x5isv0q4W9AO4SUOjStt2DP0q+UUpuWNCTjztmDVPqsQAvYOVRI41sKeeC9ScwzGfTdm/d4/afdwySGkOH6S/OxRRa1QQZx9IYrTj76KOHwbsUwtA6rAUe++HoFbWS5OPxXnqD8jnqVAoFApvQwGGaGWWEFPDf0juxgPgbOSH7YBWEgtp+0hjVBTF2+RT8xpSoR+U2dZ59u/twvExk41NXLCSH0lwLk7SOBbFudTFpC755lhGKUjaRCycYQAOj5ZszDfwtRvdxUniW40C3tr/HR6vpgnxdcXlx57g+vEhe7sHXLyohKN96ukGYRkJbaDZPmdO0ZMZUg2EYYmTnjg4ggacQoXQxx7tA6IRX4GXSBzEbB3SUXUOKhcBRwxp7Ix6BmcbYYTkYG4BYPCCi5hWJw3gDa1j2UV0tc88Rvw5YbL1DFJNCENPt1jikjD87t1b9MPAZDrj4qXLOMyIc7lace/42Mp2As57VBRfeVSVrmvZ3V2yu2tjdLzz1NMZF648Ttsu6VYrhr5NmSkZIweNY2opBVknrsM0SGTN0SjHTr8gmoYwj68aXb/i3l7L3p7gq4amaUwj5c1MoF21pt/yjm6I7O4vzTASJcQevKeabHF8eISTGu88fd/TdQNBhcuPPcXy6JAbr32Vx5/4ON/+PX+el1/6Mr/zf/8rrnzkGZ587lvZu/MGt27cYLVoLUs3ivMYzTElicazhYEJ0N2JoN2edkjjjW7Fnr3Qc0Ei/8+/+b/4tu/8Nqran8jUmvjb/q7MliCoeW3lrlLtlcEJNWbOmRK+Fs/ZHyIxu/erZcLyZIB3ogRPhUKh8ECYDUHUaB9qA0i0MpjmlnqxTV6Ja6F33gRzRiYo3psVpumfAl2IzLe32bv1JgpMphvgBRtFljIQQ9LtpO49xYMqA9E6v9KoCTOGtM27Gzru7e5y6cpjRFU8Jq61uEtGk0NNpUF8wEWYzze5fPWj3Hr1a1R3O85dcgzhiGraELVCY2S+dZEw9AzLfbSegKuIXcSFgEvt/iFEQhfTfDlHFM8wOPp+gorDMaB+IAJDmzJp3gKIuoIwiAnDFaQCn7MJwRHVWunNOdyCjBgG+sNIPampN67QdY5htUwml0KIyvmLF2nblsPDu+zv7YIITdMwnUyYzScMoWe1WNG2LVFtTIjZI6SvJPYe+mgdf75mujllY9vZCJY40PU9q6NDwtAyhDC6jysWOJk8JxlLju8uXWew1K4ZO9XyGL2sq0pvuL5r6fsVIDjvqWsLplJSharqAE1BiKfynu2mMZH31gZt23Jvb5+mmTKZTtk7OKC7e4Odi0+yfeEK926/xksv7HLpyac4v3OR177xdW5eG7j0xFN89Nlv4Y1r3+DwYBfIHxlSxknWppoC9oEBGUXbItEGwuSsqtiHikE7bhzv8diTH8NVwjD0aFg7w/dRR0sQ5yNerLRt8x2FECMVPiWdLNOaKt8pwLKj6BDarmdS+/vMI3wrJXgqFAqFB0BRa7+31IHprscPrOZqLA40BCvX+JO/7KzEgAUqIQ5UqTPINFQW7Jy7eJn927cQEZrJzFyVJVIlLx3QNO8OothwYttYBiQFbD6u9R8xKq+99hqzjRkbm9sW1JECJwlIAO8cUUwHlTcSJ57zFx9HUW6++iL9rRXnzjmGRpluXiYOkcXePeZbFzlartC+Q53DVwOW0IqECP2yI/aK1ODFE/EWbEqPc+CJoIGhd2j0OA917UzP5AJ1I6lsaeJu8dYZFwcQafC12miWENEhmmhZPO3yEA6/QZh+DNQzRBP2t23H7t1dnCh1VbGxOWXoI1030K5aFME7CFGTm7jpwlTNAd45j3NCXTlw1q3lkot1CMHWQMXG9jkm002GVdaF2c+HvmcYBvp+GLVTeSyKIWmgcc5gRvPwWievGIfipmssXDHn+zaabYFzjrqqqWqzFqj6CsGE3VZ6zuN7hMXxiuVixXxzk62dS9S+5nB/l36IPPnMZzjaf5OXvvy7bJ/b4erTH+Ngd5cb175GPZlz8erjbO5sc+fGG4S+Hd/uuftS8nqx701qZGXjVElD3DqwTIeDW7u3GPpAHOx4BVUcQh8CQzRT2klVM6mF9M4HcdYooPbBwqXDKZoDdyGPlfFObT5jCqqGOPBOlOCpUCgUHgBRy2xEl4S9yV3cdBPOAqcYU/t0tLJSmvQ1ap/SaA/7FG0ZqhgHNDqbMYfj4uXHuHv7FqjiJ1PEOTN3FFImygIGSZGbfZqPRNtrUWKaWyeEENnbO+CVl1/hk5/5NFVdJy+jvI1YQGiBnWXQNA3udSJcuHgF5zy3rn+D/u4h25sdGt5kMj8P3rG4twvVFF81SAW6OrSMCkpMQU4YIs65ZF0QCUFwYiLfqvKEABqcdUbNp0xm3iwYGknlURPj27BfO3ZBBzQoLCKDBuv4ct6GLosQe6E/2qfiNr2/bB5b/QAxcG5zztHxIUdHRyhmYgm5GUCTmalHpLEMTy7/pGyQ4vFSITU0dZqwg/l+DcOA9oGwOMA5YTqx4cZpK7cMVCq7asr6tW3HYnFM267oum7UQlm5TtaxVHr0MSs1lvryz8faHjEG2i6walc48cmnyuODvR+ramL3IUqMHRqFg71Dpn1gvrHNxac+wXLvNl/9/d/i4uXLfPrbP8trX/8qX3/hD7lw5SpPPvtJ7t64zhsvf5XZfIvLV59gcXzE4b1dNAYbjJ2SOS5ZE9hYIPuQkO0KckYopudiwQ7cvnWboevoup6+W9GHgKAMUUEdQWCoBkLwVOIZlGRJAOodWgV73DFg0rW9hxOTZKXMa4jKu9g8leCpUCgUHgTTntqcr3HanBkIIVgrdHT5k7VLYl/TKjkHOqSAy1tr25ACLQGcM5+ooBb8nL9yhXt3brOhkgKoQEwO4k6jdRPhxu68XP6JyeBRx8yYzWl79dU32Dl/gceffCJlcjQFBnlTF2KW6cR0X86yRRfPP85svsWtN66xe+8Ws+MVWzu3mWxsWsdSVkVH8NUMDSsLxiL0/QHtErwODCJEvD1IpeYF1Zv2pG4qmllN1Qh1npOGEj0mro42Fy4GcwC3IMTjG3BUuAmIN0NLy87Ya7NaLfAbVreJGhmGQN8FhIq6DgzJgVzwyQncjl27WjGEgbqep0HFgh8V3bYecR4vDqlrKx2pad/UR/BJ93OyXJeDm1Q+irFHEOabM7a2NjFFE1RVxWq1pF21tG3LYrWwYcV9IKo1BuQ3ZM4+aUpByjjjNqeqTDvXti20FuRXtY0wEdE0g87jfIVox/I4sDw64OjgkGc+9W1c/ehH+cPf+bfc+f03OH/lCo9vbXLn5k32bt/g3IVLzDe32Ltzh5vXX2U+32Q232BxfDg+51zKk6xJSktL+VuydUCyyk8zAJW7d95kuVrSth3daknbJS1Z8tiqq5pYrehXNXXliUAfrIznK29mmCKI91Ti0nvZjTP3vLNePYkmbs+zI+9HCZ4KhULhAREX0qT5JFTOYiccBEW92vw2VVRNgyTRW7nEx6TL0NFcs8LGjuAqQFJQBDhh++Il7t2+yYYT6kmNV5JBZJrzFjUZXEYkmIdRihmsm46AqtkqDEPga1/9KhubG2yf2zHLA2camzyzzBq8xHRbUdNYGPNqms02eOrpT7K3fYHdN19ltXfARVkxnfqkdQroAL5SmEyI0TGtGzbOHdF1R7QLEwu7SaCuwEXLJnlnm92kacy9W+woOBzqHBKweWgEM/Spa5xrEDGDSpH18bd5bZUJit3AMmxQb17C+xpqUFyylxiI2bzTJb/1YMGZSIVzFdNpTd/1FlwF7DGclRNdmjmYfYW0720+XbIXGIaO0Pc2HHoIo2AZsQHKLmUqq6pOjQCOKpXtgoD0PbWv2NhqOHf+PHVVUdcNQ9+DQLtqGYaBruvGbFXUQAwmqg7JBynGMJYGs2YoaqRre/o2gCje2/F3MuCdw3nzhVrceZ3D/ds8+bGP89y3fZZb11/mxqvX8M6zfeESYWg5uHsHRNi6cIFhteLocH/MmJlIPAXBwrpgJ2vrhtH3Kr1xRUB8BPHs7+2xXLR03ZLlcsFisaTtuhQwV9RSo5Wj8VXqaMwfVpS68nZMXU3thc5XKWBy5nflzMmfpFusfIXai3xfSvBUKBQKD4Cq0p/QnphwNZcbUqks2LyvONoCADoQo4PU3WNBl6R5dlbeiKq4YOWn6P0oFD9/6Qr7d+4AW9BMkxTd7iOKGVzawFxJLudYJmwsgSghBpSBw8NDXnzxBb71z/wZ5rPtZCkApOyIPY+k20rz9iIe8abT8lXFpctXmc+3uH37Orfu3mTiV1y6OMFrT5AaxNvIDFX6sM+ly3M2Nifcu3PEatmjIkxqaKYV9dTT1DWVrxEXTICfMxIasRm+A8QBX9XUsznVJPn9xAFziHDWtq4eFWHQAfAE2WbjwkepJhsg3tyt/YRqUjFMJ/R9z6ptrSTUDkmLJMQY6LsulV+tDJsF++2yJ2eHLFgxF/MY+iQKj+tjiWUgXRZ8aw6LUy7GmVYqFbOsJOs8zjm8r/C+omoamqrC+dpGqCStkziIOHxds9lU5n6exOW57uXE2fp0sEATQeNA23YcHR0yJIf8GKK5kTuhrmaE2BO6HtWBruu59rWv8Pq1r7Fz5SpPfPyT7N16g7tvvk5TT5jt7DC0LQe3b+MmNVXTMLSrFMSs/25EU1dqev4xHaMcZGkykbWMniA+sn+0x7JtiX3PcrVisVyyXC0ZglJ7j/d1SkI5YhRmsyl5AkDlPL72NL42M1BvQaqvKkQ8vff2fNPxakUY+hI8FQqFwkNDU1lNoo6+S1mjkqx5AEXFm/Yjj5lwalJpTYGJ5FErlpGBYMGQeJwqIY9mEcf25Usc3LqN21ZcXSPexL8uRMtUKEiyNZAApPlsgWgu0yqgJmp+8+abbMw3+OSnPkNVNzbyhJgE2ZYh8CjKkAJAxQePOsGpzcCbb27z1Pw5Fhcucef2TW7cepPtScdsIxKGFukj2gl+e47fmCCypLq0AU6RSiA4fOOtW84rEhVfTWCA2KdZfrUQQk+lNsTYTyp8bTYGDIDUeG/eWlGtowxRJvMZnTZsbD6Db+YnutrAVRGnNY33DJM5s7nNy4v9sBZyDz0xDhYEedMJhaHjlZevs7e/Z4+jKUOo61E8Y4NcKu3lch0xpighjUZhrV9yLuLUNFQRJYYeHWAQez5yZDdWEZyr8K6irism0yn1ZIavKusyy4JytcyXRvvXUpC5vT+FaapUlZitgTq0TmJr52nqGUF7+q4dXbghMgwrbr9xjaqu2dm+xJWrT3Cwu8vh3TvU0ynT7S3a5ZKhbdN7aK29spJiLltm4buS1dxCrsTFpMGzQP04GX16Fwg2FpIQI90w0PYdGhc0lTe3/z5QHTY0Pg+SFlzjmfoa33gmVY0kAb11JFZUIqycR1Lm8Z1DpxI8FQqFwgOjMWV7HNYhl6a8Ope1SPYpn+R1pJIGkw6OgA1jRdM2oRAloDibeC9QabCJ7/l+oqLi2Dx/icO7t9g6t8MwcbiYrRAsKFI1geyggkQbCaPeSjeiFiAplmp65dqrTKYTnn7mWSrqJHQ3HY5dZixLIrrOGZgzghXJfMPWzuPM5hfY3dxh783XWO4fUw+OSV2jXYsbFtSbgel0RrOxiQw93nvLlOmAaE3XtnTdgtD1SPBWQhPFqQ0lpvIwpLKkwKARFwPESOgDxIp6MsFNGqTaoA8V0/kVfD1ndHXHAhAlpNKepxaITqh8g2tsY1YNJzJE9kRXy5ZrX3+T/b19y/ykY2Ez4k5qZSwikuxunSwH1hmWHAynUbpZsJzKlKPixqUg/ERpy0T9Pao9QxAWyyPyEOm6ntJMpjTN1Gb01R6oqdJ7Igw9MQZcsFmCo+0FJPG9HaEYAl04RkOgchXByXj8bOyQMnQdu3fewFUN53YuMNva5GjvHsv9PXBuvMtUxF4nn1JQPgZOybjKufQLOfs2jr+Bdrmi7wLNuSnzQAoAlSAL677rBo6Dacb6rmO1WiZjWMUreC9UrsY3FdOmxleO2k/wladuKmpfUVUNKtZdGYtVQaFQKDwkVO1TvYh1eqmiwXQkXoQoHk3C4dSzZb8XKwIRr5YZGrNT0b4GBnLXl42yALBP/pqnBDvHdGeHvd1dNi+ct84yEQua8uMkDU5MQZAXoQ0xCcrNtkBQ4jDw9a++RFM3PPnUR4EKZLBMREyjK3DmpeSUKAEf01gZZ2Lb5GSFr2suPf4U5y5c4vDeLe6+8SqHx8fU0uDbwcwKly3ed9B21HVNsz0HiTTNhHq6STOpif1AHByuqgmqqI8Ipi9zvrK+wAj1dEIcOmiX1N7jNjZx9ZTABPXnmMy3ib5Oo1KwmX3kIMeNwU4KdVIgY5kYVetidJgmbbXqeO3aNW7deINstDRqeMRZoDW6MJLsIZKOJ5VDI1iWcv1usEcWxnWlYltypzcnbn1bB5gbS8DpfaiREANhGFgtjwDwvqJpJjSzOdPplKqaUlezZDA5EMJAGDrC0CFRza4Ce1+4XI4U0zzZoN04rjnnWBUhDD17d25RTRq2ts+xWhyxXC3WWTdJ7w5JPmVJkL12uLcDJONr4U2DJiZiVxz90BFCZDabmharsqB80jSsuiV9bevUGDlyQt+m0mnoWfXDmNP14qico6ocVWVmos47mukE561r0jmHuBI8FQqFwkNDo/nuDAIqIZlMxtR0J5a9Gct5ktrSI07iaFwpCkGi+TRpsgcQtSFgDnPVVsbslN0XNNUEd26bo7u7bJ47h9aVTan33gTgakLvvA7bvNX0WKzNMAOR2PW88PwfIc7xxJNXca5hlKroejMXlEqTlD0KNn7F3LXVqQUa4mkmm1y4OmPrwmOsjg5pVws0dAAMXcticUwXj4nHHdXhPpNKaaoV84sX8c0mTeNw2jP0AW+pAzwTVJ0FQ0Ng6BbEoaVfDcRlQGsLVp1OmWw/TtXMrdymbux+y6aIlvRIQn7s2Hi1nE9U8/jJ3V8oLBcrrr3yMtevX7eAchQ3r4fVmkRs7beUjTBztous6Un3q4A7mZHKJS0VgmryI0qm8Tomr+yWKYrJbtiSF5yfG0IILat2CYd7OOeZ1BPmG5tMZ3PqyYSqmhLqQOhbhr4nhD6J5O0DQAik97NmMZKVDFlnoUj6LE2v6/6dO+gYUKafj4Er6zcUkIMxWdc37Thp0mjlmYDAoANdGKjqBsSjzlNPJtSzKV3f0a6C6d66jqqZsOpa2rYndB2rbkXoA33fEbqWPtiHCZxj4j2u9lSL2oJyAVzFpG7e8W++BE+FQqHwAORNMAhpJArJ2zhtljGsy16Q9ETW7i+S2rUxkXaMA8S0WbiYyh1WwkNdroIksa09etCIayZMtjbZ29/j3M4Osa7xOUuhap5DTkDt3rJRpv1YT5RiIqvViue/8jyo8sSTT+EqyZUcCwzSKJiQpM2IWiYhKkPK0pgTqIUGEUfTbDA9v5GCgWCaHUyIHYYV3WrB0eE+xwf3WHUtB/cCoV+ysSVI1xO7HmkqBEcM6bhWAziPrzfsCMmU+uKMeraVtD8zyyllPZpYxsmTjBjJmbIs6LbNPgu8XR4ZkoLN4+NDrn3jGjdev2GBk5xoZNf8OPqWgHTtIC6pvJfzWlg2xSItK06NWak4BmFx7NpMjNq5/LoxZnRyoU9yeTXflnUAGGNg2S1ZdUvcPaGqG6bTOdP5nKapqZsJLjhC6JA44HE4F+lUCG00F/sszsqBUSohWuwzhn8gFoDlsCnmY6zmMp5LlzlDl12f7H8r8pmzesBbuI6oo3KeZjKl8oHK1YQ4MG0m9GGgn1uXauh75l1L2/csliv6YaDtlwzLnjB0HC0XxGFAQ6RPf38ardSn0logG6D/oAYDFwqFQuGPM5Y6SP40qaSmtsPYJpoDFBjdqXOqIKiCmohbUHCmhhWX/Ins7G7BioImCwLNnXWquKahmU452L3HuQvniZWd+G0Dd8iQslzOPsu75OacN3tsKQiwWrU8//zzhBB48iNPUVWVBVA+mKGhmrN3dIJEZ0FazjREK+k5L6iTMasTnflRSXRJG5xMRJs5Vb3BdPMClx77CDENJ27bYw523yTWPdWmxWNVPcFXNaoO7xvq6ZTK1+m42eNbp2AcjUNTyGdDhJNNRCRle/LGLznbc2KkSxJVq0aODg956esvcevmm6aBAkjrzK33Ym+EJN3Jc+zsNs6lYM3J2B1HCijG4EhkdCVPIZgNPyZnyFLwlV6r3N5v2UA/BjaCZTmzhmp9BHI2LMualKHvOOo7Dg/vIc4zaSZMpjPqpkakAQ044qglyxk4J+ZfpmgynFzff9LB40hu5Zo7ES2bakLw3MmZvM9SgGVZtpxBi6nElo6vE5qq4eK580ybCcEFvB9Aa4YYmISIqDJE63js2pYYlOV8xaof6PoF3Wqg61Zsbm2z7FaEfrDbDwEdgjn7h8EsJmIg9v07/s2X4KlQKBQeCNuSYtK6aPqELRrTuBPLQulYpbCtzEIZMzLMbdxK1j45nFNkSKLZtCsNpA1e0oyw9HhpuDzNbIOoyv69PbbPnzffGrFwYSBlYNTGjGQTTXdybWCblyht2/LC8y/Sdj0f+/jTNI2HVNIyryorCzpR1OXtGbMxUHNKd4Hk3GwzaWQsVEnSZDmc5Il8DvWVbagxMpttMb+6aYENECScGLCsY+aMMaszCozs+GrOtjmECDGNHM5lyxy8pgxO1EjqMRtXGUNgd3eXb7z0DXZ376yzTcqon8oeRgg4l8p3Y2ZNEWev5ahBGx8z/VLO6o3ZvbR2SQGmWOBhsaGMruFmh2EZK3ERXG4ocJblHLNeOTuVQvcxGl8L2+259iyXA4vFkR1T53A+adpiMnJNJqwy3nF+Sum6dHxEXMqC5dfLTE9TJ4UFd6Owft1tKqJJx2V37NK7Klk1cenyE1x6/BJ1Zd2fnprgodGIQwjBPKyGGKzrMARm8xmrrmXVNnSznqGbEYfAsuvMtiEEhiEPQLas1WplJcxxVM59KMFToVAoPAgqyagyf59KMjB+ehaxWsWohUm3iaqYhYBtOBoECIgT07Eku4Bxd84CWrARJTmLkUodqpHJbM4qKAd799ja2UHEW0CkzrItmDEgkrQ/MWcN1sFI3s37ruXrX32JdrXi4899go35HBFze05zaQhiG6M4e5wowTyE8lqj+fk4te1GRCB5RFnwqGPwFiUFOt5DjKhzY2diFczUMKQSlXM5CDL77DEAkZyFEju2J7rWYgo8x4G6qmmDdCkbsy63dd3A7Zs3efnlb3B8ZOLrdZCZj9ja3NGLdXONY0XWbgQ2hy5fToFyiqHH8pWMbx7Ltpi7exaOp7mEwca4eJ+dT1MJTMzwIEQhWK02m27jTtZc06pNO5WyVCdKgKonXv8YR21YiueTbk/funZsrI7FdNnaYvwFO/5JJ8X42uT3oTl6u/z4OYOXnvd6iLAZWf7Fv/BDTDdnVE7AeXoXaLLpJkoYekJUamqauk5i8TT6RjxNExgmPWFQpilDFYbOynpdzxAjfbdiMu3MbLQrmadCoVB4SChdCKiLFgBhmR2fjAst9kkbksQ0ZPdEqJJ2fR0ChIA6BzGOY1HWHjn2KXjtAZRnbgRGU04sJzHdnNMeKYd7e2xt71jgNpoLQF03iPPm0p02T1uMnLhsj9uHnmsvv8Lx8TGf+tQn2Tl/wQwyQ2qpz5tyDNhubjPoIsnkMH3FLLAWcOrWfYdJQSzJqiGarNvWIie9s9JGnv2U0qbqEGsp1zjqihSSm7t9F1PZNCemHOZ5lQ0qLUCzrFzUyOLwmOvXr/P69ddNB6OkIb0pXMBBsQwAACAASURBVEjdjk5dOrakoETHbJF1yeWWftZi/7TRi9PxNUueqBbtpOAkpu65t5CMK52YC7oFSi5lfhRXKVU6VqOAPWWqbAixpAxZfikcxGyomnNpMJpragr4crZQsnGnjA70FgylrJKGlGHKr5e+JUCzDxFj7JTesHZb55STGbWcyxTxqDg+evU5fuTH/n3r6nS5LJjyly41RjgH/UDUiBNH5SuIA22oqfEWcMce7c0ctAsD/dAwCwOrbmDV9fjKo9MpTdtSr1bv+FdfgqdCoVB4UBQY1DbYFAxFIqLeNljNH/1l/JVUvRl/ZNu3bTIuCcntE7OakCdrp1IZRNOmkwOEvAnlLWi6scHy4ICjgz02N7etlJLSHLGumMxnDPt9ruuMK1uLkNN/aqXCWzfvsDhe8vFnn+Hqk08ymUzXQvNkJ+gRYlALACXZbGqeBGubavaisiJZsl5A6NPGTLRRJ0IYy03J5oisFVoHUJZX6lWRGHGadTjr45FfD00BBDHPAISccRI136qhHbh75w6vvvYq93Z3iWEdvKyF3mmzF5c8sFKZNpVAR8+mdDDHzJqYxikHID4L2Eg6sPS65kyiCcpzICTj65JNFkQFLw6NNtpHcIiP4/3b+yJ1EsacfbNgxDI664yQS8di3bHnxucqTpPT9/q5m91Aej+PZUDScY/k0Sq5ocD+SfehWLYwB2dj8GXBVW6gyN5TIkLTbPC3//Z/ypWrO+vgkRRECXSDZY1sLmSyI3Aer1Ycd5Vn4i2oJ3q0Ao01rh/wPhCJ+HpA/JKqqtEY6VyNvMtk4BI8FQqFwgNge5SNEQkhpgRR2ly9bSZO82fxEx+5xRQq2VMzi42zdtuRSitpY5dUF4xyYtNS7FO6xDEzlRuiAjDd3maxv8fR4T7zrS0b35HKI+d3LtAulvRdb5mtMTuQnlUKZMbvCRwdHfL8V15gf2+Pp5/5BFvnttdiaUgFMjfWxWJOuIll01wqGwUigwg+l7ec2SlozPowTZkgb/ehOSDScbMej2XKJAlJG0QKWHIYqRYooFb2UuBkD5vNtQscHBxx840b3LzxupkrnnitstfSqN9JiRbTtqWyWg7w0uri+ObQ9e0Ey6QJSBSyJEhjlkwnG1RRMzbN4vAsTAfTN2lyzU5hYIwyPkfvTGclqkl+fiKj5BRJt7N7c4izLJxL7wtNZb6TQbmVBsfCIrBe+yiER0ffrTDmpaxcrJzoyNNsnLkO9MdgM6bnnIJ8cUpVNfyHf+Pv8Ff/xl8wYbymvyMRXHpdNOv3xNNHGxKNV8swRhvdIgAhEr03fZgGG8XiHEEDHgg6pZaeGDqgYQgT3okSPBUKhcIDINjmFzRtZfbRnZg7ioio+vHTtJW61jYCNsJFkRBRnzusLFjKYum8Oed2e8v4xHHzyYIrzXW0/LsR5tvbLA4OODo8YLaxifVPKX3XsbW9zdHRIX3XJf3V255bei5j6UZtgO7rr73O3r0Dnn76Yzz2+ONMp1PTPKGoC2mSraSALFj5LWWi1JnGZbQfFIeGkMOG0ebB1F5W6gspOzRm6yQL7YMFAZrLTnmTjrYGTgZROgqPc/AZVVkcH3Pn9pu88foNDvcPxqBMxwBjXRIlH/8TGYms24J0M1l3l73FJCt9H0ZRdArkToi71+GJW+uNJIvr090El3y6SBnL/CxTcK2CBMVJ1ofZHUcVC07yrUWw2Tcwvho5bnF5NZbRii4XB5MoHnsNnPOIVPiqMquDaoL33srXckKPJY4smVeJeLxp8dKD5jJhjY1K8d5TN56PPv0s3//nf4C/9Je/l6bxBA0gFQ6z6NAIQxxwUuEdDMNg44/iwKCgIaSOUgsSJUW0IUbzTyN9SInQq+Cd4KqKHqUKkUn1ziFSCZ4KhULhAVA0nYdPtojnFnYdA52cUXH5k/W48dkn/+yZg5qzeIjjULxUBsv3ZVkGzWmdceO0MocLyU08dTx5hc3t8yyO9lkdHTKdbtCulgyh48KVK2xsn+PN16/Td91b9DtjCoxcWllnCURhsTjixRdf4NbtWzz10Y9w/vwl6kmDxKS/SWWjrIUZfakjiHoswMRGxuSwRwIuJlGMjvkbch0qh4ySnM3H46P2nC0gWg/itVCKMXDJ/kwxKu1ixd7eHrdvv8m93XvEEKgb2xJPSKxSNnDtNO1OzBh5qwGkSwHiOuzIgnVzHrfXaiyJkbVAjMGX6XjWmZdcbpT0HFFlGAIkzY/T9ew3K7GlUps4GxqcA8GUIXLO4wUkBgLmhk6ErdmUZjJhsnWOavsczgmVt/dP6M0nbDqd4Osa72wej/eOqqm5dP4Sz33y0zz77LNcvnCZ2XyGd27saJT0YSA4wUWlF8ty1VVtHyJiwDmzPnC4Mcsn4qkn1RjAI+aNppp0g6ocrzoGVSa1UosQ4oASEA2EIRCHnn6wJgEPhDRLKH/g0BiJ0RzJuxjRENHYW7l2raC/LyV4KhQKhQdASSWIEydaE7LmzSunOyyokBSY5CYoq4y4dLNUMiENcomWg8n20utRFZYBigout3GlLM8wttvHUTQcY2BjY4ujw3329+8y9D1XnngK1DGZznn8I89wfLBHN/Q2EHe1NGHuKBpeu5Mbtsk5YHl4wLUXv8q9ndtcvHyZnQsXaSYTsy9ItzdJy7poGaOO5SpSJgm1DjGzXnCImO+OU0cUAWyGjaa8VE7/jIFTZPQvspKQJMG1hTOaNurFYsnR4SExDLjK89jjj/HY1cdS5kdxUiEu2Ufk45i1VGOwaoGteNC0rhAghkgMMT2HaN19MYxZrhhNBB7j2pQTFI0mmJYUPNn9ipUZUzdmCJG+a1m1LY0TMyON9t5wHirJtgUOXA7Ckg2Fmh7MO2+ZH6lwXmhXSj1xbM4nTJuG6aWL+MkUnFDVFW3bI1s13gmVr/C+srZCNc+tixcv8plPfYZPPPssVx+7zPbGBt5bYNwn13NVZThhyIooQ9fjxLKsQxgQhdo71DucOLw4JAn01+Nb7P0TVNEYWHUdIQRCiERROmzOXt/39CEQ254w9Cz7Ho2CRwk+BaTRukCDRIaQ5iem5oQQB3OuHwJdP7zj330JngqFQuFBSOUdy0JE1t5N0TQZafPKGQoVm+2VAws1i551WYx8OYmiVdHYpX02GwqGtBnnLBdpSK6A+LHrDEl2AUEZNOKds0GxJ0TNqkpd12yfv2it3kPPavfu2Gqv2Kd2fJoBpzbnzkkSgIuta7l/wBtHx+zeus25ixfYOneOWdpMJa59hkZH7CjJ6JFRz2W2Azao14KVpOmRmFfLydLnOl5ViHLCGkFBrNVeQqTteo6OjlksjoFIXdXU9YRRESySRNGKUCVtUB6unDI0uYwnef5bbrv3hDx0WddBgo6ZC8mrtopqxAJhTNu0DnJMO2TaHyvNarTXeIiBoe/p2o7KVzbkeSzUJT8lb9kayQJwV4FTJNjzs6lvlgnzvsZ7z3RierG+H+z5HR7gxJsQHSUMgcZ7nPO2nmDvX+8dOzvn+cwnP80nn3uWC5cvMZ/P8JWV7Ehl2bEY6WOqLNvfiFYVXddR+/QejcoQI5Xz1N7nZ2U6Mu0YYqRpphZcarQhwCFadilG2mWPqpWiV21rvk3tQNeuWPUdQ7D7zu8pFUEGJeRsbsyfZOw49CEQ+kAXilVBoVAoPDSyTodUVlBVfGoRyyfr3MJu/j05psot9Gk4RbR7Ipg+x2bbhbEw51KWI0rS1LjcjeYtkyM2L4+0UWUhePSO4XhBVOXi5cdpjxccHR2yubWN+mrMUDkxJ25XV7RHq9RCL+YkTm61d1aetDQHKXVkz3NQ2v1D7h4dsds0zLa32d7ZYWN7m3pSU3kHePI4Ecmmm8Q07CVbNOSMlEulrxxgpu03BZs25sORDScVKzERoO87jhcLlkdH9EOPOIf3DpHKbqfZqAALUAXEJYF1BHK3X0xHPz94yoZYstBZFm28L/PnGiVRmjNecbysMQVQksqyqesuC87tMcPY5RiipsCppa5rtA/4PNqFbNCp4/0LaRSKJXlwPmX/Ys6eeeIQ6UIk9i51/gXz5drdZT6do3VFdzyYnUVvuiGphSiRKnrOnT/PJ597jmc/8QkuXbzAfDbDu4rcC2oZy1z2NUf77C2VuyK88xaHOwc+uTllzZ5EFoe7vPrKyzz/+1+hXQU++13fzSc+9Um6PtBHC/j6oSd2FuSEONC1Lau2Tx5NLe1yRdv3DKG3od3i0sOnDzKqKCYYJ2ULBYfGgb7vWR4fvePffAmeCoVC4UFQJXa9BRgKQzLlC9E2Y1J7tCd7KsW1EDzmclva4NQ+GYe8USvJNdnuS2LEpq7ZhpPtC4hp83NxzMyY35JlR0K/Yuha5tvnWHYtdV3BIBwfHDDd2GRQTZmsCCFYp5dXK390itRCpVUqpwguCjE46zLM02qxbJQj0gWFtmNxdMi9W29ST6dM53Pm21vMZnOa6YSqqnFiG7JTl3RFVoJxKqzDkSwiH/MsuVY6Hr8YrXwztC2LtqNbruiH3rIsplpGYmQYkvA5m3QmXRqsszbQjyaaWdpNMtcUIZWb1rP7whBTiW4gBB2PR4wWVKuapiYHUTHav+thKUm/lTVy6VpR87sKg40aqZqKoeuponUrjk72SZvmSPePveeEAR8hJpGWjQiKxKAM0VkAm8uGK2FjY0YzRBarJa7zRDXx9BA8la/xoab2kfl8zmOPXeX8+QvghMVqacEpgkvlQlFsZlzO6gCDMo7HCTESwpB+J1kPqICLHO7f4Q9/73e58cYt7ty6R+hXOBWuvfwKTz39MT79rd/KuYuXCINl44aho1+1dF3Pql3SdQOrdkXXdrTtim4YCGHAhl+DF5tvmP++YlQrMceUMYyRxeKIe7v3OD46fsc/ezlZp39UyJhjLhQKf9pQHT+C/qlERNRXqf4AjG1x9k2+1Xu/Q2vzesu3f+wxT9783e5dGLNCoxA5/yBtbuNcu7cswUIHqyRq0uu+7XZvX8RbHvNtt1FScPDWr/zzk/f9ltZ1xmLnOzw9GbNC6wHHml6C+y3kXZATS3+3HWk8FvoOt82lO956LN728/ve8R87kCdei7f//MTF+7yEvPf3nB0/cSmIc+6tPz5hRSFiAZKvKrz3yVNK3vaay3if93mkE9/oiduvbxH6PmmN9K2/JMkfy1dUJ7rgRluK/B5I933y8nsl3z7GdQm267rfVtXvfPttS+apUCgUHpAwhEe9hIeLjqHCW657p9ve/3L5jPxgvMvxu++PTnm8Q3jrv4V3xf3JNykUCoVCoVAoZErwVCgUCoVCoXAKSvBUKBQKhUKhcAreU/AkItdE5A9E5PdE5Evpugsi8msi8rX07/l0vYjIz4jISyLyZRH57MN8AoVCofBulPNXoVD4oDlN5ukvquqfPaE6/0ngi6r6HPDF9D3ADwLPpa/PAz/7QS22UCgU3ifl/FUoFD4wHqRs9+8Bv5Au/wLw109c/7+q8f8COyJy9QEep1AoFD5oyvmrUCi8b95r8KTAvxSR3xaRz6frHlPVG+nyTeCxdPlJ4LUTv3s9XfcWROTzIvKlnEYvFAqFh0Q5fxUKhQ+U9+rz9H2q+rqIXAF+TUT+6OQPVVVPa3Spqj8H/BwUk8xCofBQKeevQqHwgfKeMk+q+nr69xbwy8B3AW/mdHb691a6+evAR078+lPpukKhUPjQKeevQqHwQfMnBk8isiEiW/ky8FeArwBfAD6XbvY54FfS5S8AP566Vr4H2D+RHi8UCoUPjXL+KhQKD4P3UrZ7DPjlNP+oAv6Rqv5zEfkt4BdF5CeAV4AfSbf/Z8APAS8BC+BvfeCrLhQKhfdGOX8VCoUPnDIYuFAoPFT+/zAY+FGvoVAoPDTuOxi4OIwXCoVCoVAonIISPBUKhUKhUCicghI8FQqFQqFQKJyCEjwVCoVCoVAonIISPBUKhUKhUCicghI8FQqFQqFQKJyCEjwVCoVCoVAonIISPBUKhUKhUCicghI8FQqFQqFQKJyCEjwVCoVCoVAonIISPBUKhUKhUCicghI8FQqFQqFQKJyCEjwVCoVCoVAonIISPBUKhUKhUCicghI8FQqFQqFQKJyCEjwVCoVCoVAonIISPBUKhUKhUCicghI8FQqFQqFQKJyCEjwVCoVCoVAonIISPBUKhUKhUCicghI8FQqFQqFQKJyCEjwVCoVCoVAonIISPBUKhUKhUCicghI8FQqFQqFQKJyCEjwVCoVCoVAonIISPBUKhUKhUCicghI8FQqFQqFQKJyCEjwVCoVCoVAonIISPBUKhUKhUCicghI8FQqFQqFQKJyC9xQ8iciOiPySiPyRiLwgIt8rIhdE5NdE5Gvp3/PptiIiPyMiL4nIl0Xksw/3KRQKhcI7U85fhULhg+a9Zp5+Gvjnqvpp4NuBF4CfBL6oqs8BX0zfA/wg8Fz6+jzwsx/oiguFQuF0lPNXoVD4YFHVd/0CzgEvA/K2618ErqbLV4EX0+W/B/zN+93uXR5Dy1f5Kl9/Or/+pHPMw/yinL/KV/kqXw/29aX7/d2/l8zTM8Bt4B+IyO+KyN8XkQ3gMVW9kW5zE3gsXX4SeO3E719P170FEfm8iHxJRL70HtZQKBQK74dy/ioUCh847yV4qoDPAj+rqt8BHLNOcQPYR0uL0N4zqvpzqvqdqvqdp/m9QqFQOAXl/FUoFD5w3kvwdB24rqq/mb7/Jexk9KaIXAVI/95KP38d+MiJ338qXVcoFAofNuX8VSgUPnD+xOBJVW8Cr4nIp9JVPwA8D3wB+Fy67nPAr6TLXwB+PHWtfA+wfyI9XigUCh8a5fxVKBQeBtV7vN1/BvxDEWmAbwB/Cwu8flFEfgJ4BfiRdNt/BvwQ8BKwSLctFAqFR0U5fxUKhQ8USd0ij3YRIo9+EYVC4aGgqvKo1/AwKeevQuFPNb99P21jcRgvFAqFQqFQOAUleCoUCoVCoVA4BSV4KhQKhUKhUDgFJXgqFAqFQqFQOAUleCoUCoVCoVA4BSV4KhQKhUKhUDgFJXgqFAqFQqFQOAUleCoUCoVCoVA4BSV4KhQKhUKhUDgF73U8y8PmCHjxUS/iHbgE3HnUi7gPZ3VdUNb2fjir64IHW9vHPsiFnFHuAMeczdfvT+v76mFyVtcFZW3vhwdd133PYWdlPMuX7md/fhY4q2s7q+uCsrb3w1ldF5zttZ0VzuoxOqvrgrO7trO6Lihrez88rHWVsl2hUCgUCoXCKSjBU6FQKBQKhcIpOCvB08896gW8C2d1bWd1XVDW9n44q+uCs722s8JZPUZndV1wdtd2VtcFZW3vh4eyrjOheSoUCoVCoVD4ZuGsZJ4KhUKhUCgUvikowVOhUCgUCoXCKXjkwZOI/Lsi8qKIvCQiP/kIHv9/EZFbIvKVE9ddEJFfE5GvpX/Pp+tFRH4mrfXLIvLZh7iuj4jIb4jI8yLyhyLyn5+FtYnIVET+rYj8flrXf5uuf0ZEfjM9/j8RkSZdP0nfv5R+/vTDWNfb1uhF5HdF5FfP0tpE5JqI/IGI/J6IfClddxbeazsi8ksi8kci8oKIfO9ZWNc3A+X89Y7rOpPnr/RYZ/ocVs5f72ttH/45TFUf2Rfgga8DHwca4PeBb/mQ1/D9wGeBr5y47n8AfjJd/kngv0+Xfwj4PwEBvgf4zYe4rqvAZ9PlLeCrwLc86rWl+99Ml2vgN9Pj/SLwo+n6vwv8R+nyfwz83XT5R4F/8iG8pv8l8I+AX03fn4m1AdeAS2+77iy8134B+DvpcgPsnIV1nfWvcv5613WdyfNXeqwzfQ4r56/3tbYP/Rz20J7Me3zC3wv8ixPf/xTwU49gHU+/7eTzInA1Xb4KvJgu/z3gb97vdh/CGn8F+MtnaW3AHPgd4LsxB9fq7a8r8C+A702Xq3Q7eYhregr4IvDvAL+a/kDOytrud/J5pK8ncA54+e3P+1Gv65vhq5y/TrXGM3f+So9zps5h5fz1vtb1SM5hj7ps9yTw2onvr6frHjWPqeqNdPkm8Fi6/EjWm9Kx34F9Qnrka0tp5d8DbgG/hn363lPV4T6PPa4r/XwfuPgw1pX4n4D/Cojp+4tnaG0K/EsR+W0R+Xy67lG/ns8At4F/kEoFf19ENs7Aur4ZOKvH4ky9dmft/JXWdFbPYeX8dXoeyTnsUQdPZx610PSR+TmIyCbwT4H/QlUPTv7sUa1NVYOq/lnsU9J3AZ/+sNdwP0TkrwK3VPW3H/Va3oHvU9XPAj8I/Cci8v0nf/iIXs8KK/v8rKp+Bzaj7S3anUf9N1B4/zzq1+4snr/SY5+5c1g5f71vHsk57FEHT68DHznx/VPpukfNmyJyFSD9eytd/6GuV0Rq7MTzD1X1/zhLawNQ1T3gN7BU8o6I5EHTJx97XFf6+Tng7kNa0p8D/pqIXAP+MZb6/ukzsjZU9fX07y3gl7GT9qN+Pa8D11X1N9P3v4SdiB71ur4ZOKvH4ky8dmf9/AVn7hxWzl/vj0dyDnvUwdNvAc+lboIGE7194RGvCWwNn0uXP4fV6/P1P57U+t8D7J9IC36giIgAPw+8oKr/41lZm4hcFpGddHmG6RhewE5AP/wO68rr/WHg19OngA8cVf0pVX1KVZ/G3ku/rqo/dhbWJiIbIrKVLwN/BfgKj/j1VNWbwGsi8ql01Q8Azz/qdX2TUM5f78BZPX+ltZ3Jc1g5f70/Htk57GEIuE7zhSnfv4rVnP+bR/D4/ztwA+ixCPYnsLrxF4GvAf8KuJBuK8D/nNb6B8B3PsR1fR+WZvwy8Hvp6/9j701jbjnOO7/fU9XbWd/9fe++8HIRSYkSTcmSJVnySJYXeSI7kGfkBOMZJAFsTJAP+RAg+ZQvkyB2PECQBYPAmEziGLYDOGPZM5ZsjTfJixZKlESKi3h5ecm733dfztZbVeVDdZ9zSJGUXsO0qUz/APLee5bu6uo+Vf/+P089/fG/67YBjwDfqNr1NPDfVq/fAzwOXAF+G4ir15Pq31eq9+/5WzqvP8JstcrfeduqNjxZ/fdMfa3/XZ/Pal/vAr5WndPfBZbeCu36fvivGb9et11vyfGr2tdbfgxrxq9jt+9vfQxrHs/S0NDQ0NDQ0HAM/q7Ddg0NDQ0NDQ0N31c04qmhoaGhoaGh4Rg04qmhoaGhoaGh4Rg04qmhoaGhoaGh4Rg04qmhoaGhoaGh4Rg04qmhoaGhoaGh4Rg04qmhoaGhoaGh4Rg04qmhoaGhoaGh4Rg04qmhoaGhoaGh4Rg04qmhoaGhoaGh4Rg04qmhoaGhoaGh4Rg04qmhoaGhoaGh4Rg04qmhoaGhoaGh4Rg04qmhoaGhoaGh4Rg04qmhoaGhoaGh4Rg04qmhoaGhoaGh4Rg04qmhoaGhoaGh4Rg04qmhoaGhoaGh4Rg04qmhoaGhoaGh4Rg04qmhoaGhoaGh4Rg04qmhoaGhoaGh4Rg04qmhoaGhoaGh4Rg04qmhoaGhoaGh4Rg04qmhoaGhoaGh4Rg04qmhoaGhoaGh4Rg04qmhoaGhoaGh4Rg04qmhoaGhoaGh4Rg04qmhoaGhoaGh4Rg04qmhoaGhoaGh4Rg04qmhoaGhoaGh4Ri8KeJJRH5CRJ4XkSsi8t+8GftoaGhoeLNoxrCGhoY3Qpxzf7MbFNHAZeBjwE3gq8B/5Jx79m90Rw0NDQ1vAs0Y1tDQ8N14M5ynHwSuOOeuOudy4P8BfvpN2E9DQ0PDm0EzhjU0NLwhwZuwzdPAjbl/3wTe++oPicgvAL8A0Erix+JII4UlaUd0+13ipIV1gkWzdzRiuL+DGEOn16Hf79JqxeTZiHZvDVEKrGE8OWA8GRMoxWA8YjDIcQJaKwSw1qKUAwStQsCCAiUKpQSlS1rJKipwZPmQdOIIowSlQpwpcc6gFERBQqADnHMYayjtiG43oJOskxUDsswQhUK7tQoSIsib0M3f/zhn2dq6y/b2NmVpsdZWr4MADhABrYRAa6xzaFEEgcZai8NhrfN/dw4Rqc6zw1SOat3zUm3Q+tOPAFK9aKzfV8Obg3Pu++0H8F3HsPnxSwmPLSQBIpCXDusgDgSlhNJYjAWlhNrlD5Vg8dep35bfphJ/fQYKRBQiDueY/Uf126i+EEUhKI2zJU4CRIQiL7CmJAgCRBRlWQIOHUSUKExZEODfL4oC5ywOQQcxYRRi8hSwIApRIdYYoPTtdKB0gHUOp2LEpmgdYozBWAsqwBYZWmtEKYo8R4KIMIwwZU6WF/63HLUo8gnOUY2v9Qjp0FqjBLq9LoOjIc6WGJ0wli51kKQeG/76OKgvSXGzgWb6tvvOfx9z89MB5xWvvc5nefV7r3eE9YfcKz/zmtuu3n+t99wrP+bmxsQ36tj5pr7e4RyHV+/qFUfnXvVC3dZqz6/VQ/WprN98/evk9Trl1Tv0FIfXd5xza6/eypshnr4nnHO/CvwqwGOPPer+6//y5/ijX/11fvwTH+Jt736M9uIJ7m4PUb0T/NYffY2vfPY3CHfv8vb3v4ef+viP8OEf+SgvP/cZLj784xwd3uKbzz3OZ/7dH7MzzPipj7wP0SX/+7/6HHfujnj0vnXOnerz5WdfZLEv3H/2EgfDAeMi9T/0osdROkTFKT/58Y9x6dJJ/uVv/BvuXN8nLR2Bjbn//ke5fvfblEXKQi/h4umzdPQiqjVi7dwmH37/w5xa+EmevfoMv/uHv8P5c6v84qf+Be3kHpQSQE0HvX+fcc5Vk4j/88qLz/Hz/+hTXL16i8lkggikkwKloJ5zO4lwYrXFeFyytrJGkkREcYg1jrt3N0mzgrK0KHF0ohDnHJsHI0BjyhKthDBSWOsoSofSfjLTStA4BqkhMzIVXA0N34358asVavcDZxZY6kUEAqNJztGoZG0h5OXtnI2lBCsli1GAdcI4LWjFiklqccqSpQZRoEWQQBEojbEONqWTyQAAIABJREFUJY7lbkinHaOVUJaGNC8oC0tpHIaQ0ji0EpQCrSOipM3w6IjeqQeIAsvROKO/dgpjcg52t9jcTWG8zdm1PqUxDA93cL1TLGxcpJNeR4UR46NtjO7SWb0Pe/Ayw8EeWoMVTTsKcN1LZBj00WVanWWs7nDrwBKZI0y6Q6QjFtdOcevlq/TOvws32qG/0GHr+hVK3SJcvcTBjWfRSYfVsw+TT/ZZW1lmXEAnFjpxxHve8yhXnnmSye4W2+OclzZ+hpvFWjUhOhA3FaNCLS4dSgSMxYngpJpmXf0thzgQ57CiUM5hxPqJGkEcWAViXf2V6nUvMGeCxM3tVBDUdNtW/OdfoUZE/FjmQOGwUr1ffUbmxJtvL1jlEOdwSlC2FkE+UOSmoqlqZzXpKxzWKai2L9Yfq6PuC3DiEOcVk6viTmIFJ9b3kyjATuXJdEQU3z+u3qeAqsWKmzueOQ3i5tXu3LH59vmdiwNb9adUYs9V+5r92Jgqqvq8iPObqFvoRFCWuf3747FTjTwTRvPSU6ptu+kOq+OuBLQAN//tL17jNXgzxNMt4Ozcv89Ur70uIoqf+pn/lNORcHBwh83NmyyrgKLU9KKQINQEbYW1AVYgiAIkjvj2C5d59tvPYw386dee4vkbe5y9uErQaREkXYxxrC1E/NNP/cc88LaH+LXf+Zdc37pN3Am4fW0HggQJBcwYh2Wls0CW7tCO38ZCO+L5owFiQzbOXeLS/R9lYK/jsgmdOOT25g2KdIuV5S4mWOHbL5ZsdZ9AF2fIJi021i7Qik5WgqkRTTUzAekv0nsuPsDP/+N/zD/7Z79MEGrK0lSDjUIpAEduBGMCBMdwNMIYw3A4wjkIHKhqMIgif1ccBwHtOCArwVmF0gKicTYnEqFwyv9YReGcQeMHmYaGimONYUqE5X7MQktz5eYhS72Qwlj2RyXWKQIFV7YyholhsRN4Z3xiCJUjECFIAtKimsysJitKSmPotkMOUxikGVEoOCscpYYkDIlCR0sDzt8MFLkhz0uGozEWIdx5kf0sIyugOLjNuXsvoE+c4dzJlNt7GySthPHNZ4jbbU5euMi1ly4zKEecO3uGMlpDrVzE7F9msRcxHHvX3ljDQWlZXolw+1dwVkjHQ7rrG+hRRna4g8ZiTYYpM7rdBZJWi3R3j2ghZlTGBMkSYTEiEtDWUJYDSkkY55ZOS2i3W7SThBdfuk7uEuzSRdrqJieGT7CZfIxSvOMvThAnOHG4yrGe6qRaONUTLhZBVS6LmzoYpp5BHdUkWwmjanOuUge1kJBq5raVKHP+5M+MESdTgYKzvh14UeBdRZnJEXHU76KUFybC9Hte/8zGSv89i4h6hTEyE5PincxaONXjmZKZEKxvWgWk7hMADD4E4xBq998ilWTEeXE4dT0rAeW714sUL8q8iJm2TSoHr7aDXPUZJ9O+rUUrzvrX1FwmUdUnU1EFM1Gl6uOp/zlvn73aLJzzyirx6PDbdgLKML2WavtKqnNn38CKezNynr4K3CciF0UkAn4O+Ddv9AXnIGr3eeQjP8PKmXMs9tfpt1c5e/osxhqUUlhlMYHChgpjhOsvf4PP/vlfMRykfPDdP8HHf/j9nOy2uPHiXX7/M5/m83/1aQTD0kLMp7/wGZLeCT7yIz/FxuIi6+0TrC6sMkwzDvcyWq2YhZU+1+/s86VvPseVm4/z6DvXOX1uFVTJrRsv8OWv/C9culBw5mRCq2VZWllBt1vc2d7iypVDvvjnu/zpHz+DyYS/956PcfpECNbwN2Nw/v+LWkCJCEopfvoTP8vFe84TRVH9CZzz4ThjLGVpSfMCrQVjCrIiwyFYYwgDIQgVSStEK9BBQFaUhFpTmBInDqXEh/y0Ig4V1hpMacjLEofydy1N0Y6GGccaw6JAaCvBOs0os4xTR7cdkZYQBg5nHaEIgQhHWcmNg5S0hMHEcTgxjEshiSHLLKFYrDVYhHEuTDI/yY4yx7Ao6bYjjLWMM2Fv5NgdWTLjCANoh7DU16z0BFtOUJSIlAxHA6488xwvPfEXPPH44+zfeA67/TQGIctySifc++BDLJ+6jzQ5yfLGaaLxbQ52dxgOD+h3exjnJ3+9eB+mHNGKe4zSlPHRCEPISjCkp4XlRJHEgjIFwcoFsqNtxnmBMYbF9ZPo/knSvU0KazDOUk5GtJKYLDXsHWUMjsZEoXB365BAWS6eWyecHBHsP8+G3KnERaV4VPXn1Nlg6kp496hyXagElPFujnUOVcdCrX9XOSrnQnCipo6VOEUtKQwWW2sBXKVtLOKMb5czlVDzglqhUKKnYkdEEFEoVCXmfDRCTRsPToHVgr+/8220M5OqElEOq9y0H/xXvVtUi0pEeUFVbdq7Z1W7na0EUeXHKVV9pm6qd9NwygudWrHU/SzVzWbths1Pb8550YStHC6ZCs3aDXRK/EYqYScKpI7OOO8g1eIG53yIW1F9fk6g+iOeCVk3Z1JVfSsOlKtF4EwICTJ7vRJRIgqxMvcZ/9rr8TfuPDnnShH5L4DPARr4V865Z97oO3k2IB/ukSycZoxl//plLnVi2kqjpEO32yWQmMwIg8E2X37iC/z5X97m1nZGL4lJVpf52Cd+kVLF/NqnP8sHPnyS9bXz7N/8Eg+s3su506e4dftb/N+//escDIZ86N33sn7yApc3h9jCMhlk7GyPyPMJo0nCOM05ffbtvP3RBzD2D7D5mL39HY4G67x4eZ+7N3KC5IA4jqE8ZHt/wtbmFvdePMHheJ/7zv0gq6cnSNBiejk2IbtXICLTPKWTJ8/yqX/4s/zSL/1zQKbvgQ+vKYFJmpH0OzjryI3FmJSFdgtlFYN0ROEcWVHS7wTEkWaS5yBCHAD4PJRAC7FW6NLiRGGdJS8MxjauU8OM445h1jqOJgWLQYgKAu7sZZxdCVlra67tFxykhuWOYndScDCytKOASV5ydtELoUAUByNLGChGpSW10NIBDke3DUXhWOpE7I0LdBCwEkccDcdM8hIdBIwmlqE1FBYk0ESBYa0bE2gojaMoLGlmmKSG/WEBRynpQKNCiKMYs3OVvcmAqNtjfUWxOemwfvocQbKEISAbbGPdEd3T78TkE0Y3vs3ZC2cx7RXG0sNo6LZC7ubCfmGJIhgcDFm/EHHn2os4Ig4nhoVej+LwCGdTYiVo5VjttRlKQOlSumK5dWePsiwJwzaTIKe0jrDdo10UPBRdZTPboEBX7rSbOgRU6QA+dOYqXSGVmKqck6l88IIWJbNIk/MiwjsTdjaZuspxUbWVVblO1iJa/GRbh7CUVKEkhasccQFQCivGiwLxrpBCsHUIyTENoeF8mK520MTV8s/jw3CVwVQdTS1QKtVQX8R+DFXePanzO0FNhYcPbdXO2izUNx/CchrEGcR5YTMLxVXbqBKmpGqrE8G5aeOm50ZkXpzVLh6V6PT7muuCmROnKkevMtXqkKHUf6kVE5XgdHP7nW5PZu7jK6JzMnUVUbXbNifGcG8YkXhTcp6cc58FPvu9fl6rwF9QSpO5mMFRDmXE1s4+vY0FVlcWURLhJgWjgyNCt87pk2fY2xnxjoffS3tpnYPBXT73xb+iu9xj7zDl/Y++h/MXbnDt+jZF4nj6d67xxcevYpRh5+DznFpfYLGtGYojH5XkQ0fUCzl96hHa7XVu7Vzhq195kjJzFIVmcABPfUNwVrO46ghISQLHaKjIy5TxUcZLVy8Tf/yT9JeXycu7UN1dNLwRDq0DfvZnP8Wv/V+/ybWXr1GqEqWrPIHq7ivLDcZYWnHMcDyBQNPptLG2ZNHC7b0jTFliraHfaTHOC6LcEmt/T6YstENFqIQw0HgLXCjLWUt8tL+h4ZhjmAjGwniSEZiSibFc2S04tSAstART5tggYLVr6YQxOnAcDEoyW3CUOlqBo8ARxgH9WBNmhrIscFbAQFaWjDNNEmrStCDuR8SR5nCYoo3FipCmBVqEIHKMx4YsdSx2QkZpiXGK1V7C+cSw3FUMUhilBYFS5HnJt158mU4rYWFUUI6G9Jfb7O9mLCyu4KxDOjF3dwsW9Ij49El2g4LNgWHxwrtQkwEHL32DtZVlTpxYZXNzh8IELJ59BEl3CZNFJofbFFkKXYMe36LAoJRQlIbhYIhaWkIHmlAM62s9dLtP6AzGCVk5IUgWsMOMwxsvcGb9DFftxeokMU23qSd1Rx1SctXqkFlujp+Qa8HlvDulKgFQh8zqsJYVRKpcJ5kt+fFzrgJdCasq70ZMHdKyPgxXSR4BlFNYkal75N0MN5ukxQstVwmBWjjUIUaxs8DTNCRJ7SbNtV8r/x1Xe0eVoKz6CqnFTi0wp54QiM8TE6umYSvE9xHoqaOjxFX9XYUGq8UPs9yhSga5mTD0zk4t8vwBu0pQ1cc/FUv1eYK51CjvmlkBhfhBWnmxNJecNhVydcRTXC0JZyHXug9s5UlK1ZlTMVeFA8UJotScbP1O/s4SxufRQUjc7oOEhNESUBK3EobDFIBRmmEMxBNhOVnhvY++j/X1Fi9u3iRe6KNNyPUrT3Htxi3aS22UO0+nHfLIu8/yy5//Pb745A0K6zBFRhKCNimPnH8HeZExmhziOjGRODbWlji3tspkvMtXH38al2pOn3yAYbbDaHCFrBgShUJZaJZWEjbWV9i8tYcbFrhSOHVmnR/6wZ+h31olLw+mq78a3gh/e3HyxHn+yX/y8/z3/93/QFBqnHVYa6afcPjrxBhLkiQ4ZxlnOYLz4TstOKsojGWSF8RRSDuy4CyFMYRKaIURpbWI+FCwVPH03Igffxx+hVOjoBqOgQC5g/G4pNONWRSLDg2jPKcTBGjRDMcl+6OSUBesdkIurCZkuUOpknaiGYxLytxy48hw74k2O0egtGUwsQRasT8q6bVDJqUhmRjScUHpNBiLEgi1oJXGOWjHIWnhOEotygakecau86tZQx1ibUGgNXEQkjtHYBOUA62FNMsot3JMaTjYGaK0otuKmOSWoN3CHV1jZaFNfPEMm3fu0osi3Mm3c2d/j36vhQ52WL7nXSRmTLG/yaUTp7hpBsRr5ynyEb2lLuVuhi0c1lgchlDhXWCXYCZHOCfc97b72N3f5+ZLN3nokbdTfltYObyLSZ/jTucsE6NmM2/lskwna/ATYP1Xaud/XmgIzripmPiOyVwLWEFJHfZjGmpSZi70VLldtQwRF4Cp8pmqBtgqLifik6PnE8pFyXQin+ZaVWqnntCt+P3XUcpaLNRZSaKYhdScVxx1wJKp21IFFOtQI4DU4sCPwc66mXNVXdkziVcHDdWs22vXp1Iq9lXGTq1+pgJuKie9CHK2FrI+NKhqDVTfxaqq32vnqRKg3o2auYB2pizrI56e96kwAx+erNzKaai0HvinjlXlSDr/3syF+07eEuJJRCMqAoGHHnyIttmh310kjCbsDm5x+elvUqQWbWFcjDg82uT2cJuhCE+9+E1euHOZz/zhH7GxusaN3Ttsbm0zym7w0D0P8PD95/nmUzeJdUwgLUQsp9aWabcSAkBhyUxG1Ivor0Y8dI9i40SXdNhlPNzh1FnL17+xiy3BFDk5mkR1MQw5yra4/+E17m4dcHhgaC9ajkY7rC2eJEk2YHrRff/w1ymaWock51e/VG98D9/1Py6lFB/90R/jV37lfyJLs+9Q/KVzDCcZ3SjEWUu73SLPCrIip6X8AD+wUBaGkcsprKPXCinyktI6IuWt+MxYHwpUgi1LtFYESjCl9VZ7IE0Yr+FYiAhp6RgVFmeEUAsrcYARxUFmmBQFhxMIE00SKfYLh6RCkedk3mTH4tAhmMxx5yCjHQtpKZjSUeSObqyYpAWZcaQqZ5BbCmsIohAnJUUpDDJDGAZoDXGs2B8XYAxBqNHGMUxL2oGfbKMwoJ0oSEtW2pqWxpdoKSx56RBRFNaQaMUwLXGB5sUnv04psNiOEPVtLtx/P0fDAeeWu6ytnmU4nLBpNCo9Iuy02C1j0t2U1qmHKIsJw60rnD19krEOSMsCDURYtM0IlUYlMaM9CJTl+q3b6DAgHWcoEcKgQ5iEyNYtVqK73JTTOEyVA12PFpWYecVkzzQEBn5iFSdekFQlEl4hsuqT6qoQXOWuiBPvVFWfql0fcX4iniaci/hog60WvsCcQKOamGcOkLP1QgHf596hqSw10dNrTLnKGReHwuKq/CDEBwDFgK3yhpSbS3SuVo25KkDlvzPnFs0ZNzINwzkvrGqh5rwsceL3D4IyrkoOr/rbVYKocsp8F0rVJX5hzsz5qvKoqpCcs7YSqTP3CVV5VHaunTBd7SfOi1Fnq33Wodr6cOZsLzd3XHWIVCqh6ObrNFQieLoNqeXYa/OWEE+IV49iC5TAOx77CMODTeKgjYxKdjevsbt5m36ZsrSwxPkTl2j3z/OlJ77Fn/35FznICrb2jjCFxRrhpZd2eeJbT/PD7/k4n/wPP8j2/r8jK4SHLz1Mlu0w2L/Ny7dustTtM3npDqFxpDYgzUO2ByFLpwvuu/gw3/zGF/nWE19jsCesLCV0uy3u7o44d0+fxaUOz11+mX67zXhkONzPee/7FhG5CfbtiJ4LwH7fCSioDPBpHNhfaDOhNB2gZHbB1d+qj1deXS/lVcznNoGwvbWNs74uF45p3ScRsFhG6QSN5fTaOuM8wzgoiwLaMasLK+D2sMb40gVAHIYEODJj6LUS/H1uVaZAa5y1FIWhND6vYT5xs6Hhe8UBvVZAIpbclSx3QgrjKG3JcqLZGSnO9kICKXFW0F2NtoYi8SKidJbcOJJQs97ThDogCBwvbo1phQFrfU2/rYmTkOt3htwtLUVu6LYjFI68BHSAOJ8/ZaylyGC5E0FpOMgsOY6lbkiZ+5VVDucTwAMhUoq0KJmMcxINlhAJ8bk6SqG1wo5LciwBXkyVpePGV54m0pqTCyHOWZZX1+i1Q9YXIsr8gM5il5WVNW7ducvK6gaTzgluHjjipE862gLjSPOUliqxWjAuIQgVrShge2dEu5OQBAlHwzELCzGjNKLDPifMFXbCFbIywFSCZTZh145P5QgpqWbL+v16wq8nzMppqMNBtaipnRwl4KwPU2mpQlOVnVGJBjdndyhrfcJ3rUFq8SJUrssrZ3iF4AyzUKNviQ/zzblndW6Xw4dpq4X+M0GkarfLegNL1FREWOoQHdM5aXr8tVioE7FrgVGHDJ1lFqbz2/UHOnfg01Bg3Vg3FSz+VFjmw5jyinwsPx7P12iazid1V2lXuU+ucu9mbztx1BltMFtZKHUYVECquKerXbiq2F+dM1dvbXp+6utg3tJ7Dd4a4smBc4bh0S6f+83/mQvnLnDx0tvYHUywskoUtzEmJw1gZ7BJZ7nN2XsfZKH12xwdjsjzHEqLEkukQu7cGPHtZ+/y7odGXDh/if6K4qWXJxyWAyxjfvSjP8Dff+/P87/+1r+g14ZTa3Bju6AwE67fuUp/8TQ3bw147ttjCBI+9pP/Gd1+yu2Xv8Jw8ix7g5TRxKEmC2xdLzk4Krj3/mU+9pH30+8pjB2hgkW8Vfv9MxvXOsY5Hy7LsoIr125y5crLPPvtZ9k72CMOIxa6PT75iU9wz6UziOhXuFX+nsZf7E60/wF9lz6o33/s0Xfzzne9ja8+/nVMOYud+SW4UBSGscvI0oysyCkKQ7cVgXOMRkPiWFPm/nIvJhmjLCcJFFZpMgnIspT6FkNRrcSo7iJFKuv4++d0NbxFMMYRi6bbDchKzWCUc5hBkoQshIqNhRhnSkIVUhaG3VHGqaUuozLn/tNdhqkF67ixNUEHil7bUhzlbPQTdsYFhVUMxoZhVvpSLaHQCgNcWZKK0GtFDNOSJIAwAOd8kcrcOqIwQOUliKWwmlYgjC0kyt/xhyrEWMNRaquaUcqvWjWW3BmIAl9zSjtaOkAFIYFzTDAsRRFtbSitv0FJb92l247ZvPocycZFBpsvo4/ucHL9FOXoFmtri7R6i1y/8gLOghHNdrFCKzVEkmOkS5EV9NoZURzT6rSIxHF0NCQ72qG7fAa1O6R79AL3LK7znDmH0i3sXH6SEu0n6jocU/3Wp6G9aUgGqESIM5X7UzsarjaHKlFVuxi2yk2qwmhWvPDSdrY9i5uOozMXaybIhDqB202Tv13lbNUuSO1Q1c6Nc/Uavsr1qbZslUPZKn9pLoRY7W0aLqsiXf61uubUTJYxFZr136mEnKvaUolF50CsrRyoSuK4aWdWzk3lUuG/5ysvVNuVub6t+kLqfq7DpuLDedP+q1yz2jySShFO88vEd6yqRW11zF4vV/1XnXPf324qFL32nbV9rudmeXFvMB+8JcTTcLzHcLDJV7/4OV5+4RYPP/gw6Ij9w7t0FheBkiCOcUWGyQ5QQUaohEA0H3nn+/jitRe4u32Vd5xeo3Dw1ReukuZwd+slNk4ucPHkIlefHXDnxg3CMONt9/8jNu7/MP/gE/uMj3a4uz0gCo9YXgpoRftsbTm+/Pg1BMv6iXXOXrjAtdtPsbV/wCQtOBwcEFihm3TYPbBEXeHSA+dZ7r2XQE6jVftvtf++W6jtexdwbvr5PCv59f/zN/jDP/4sZTrhzo1b7B3uI0ohOqIbL/GL//RTBNVP0+cclDhboFTCLDr+aoX/+m3s9xf5xCc+wVcffxJj0umPrv55GgMSaQKtULnPmTClYaHbZTLJmKQ5SOATZwPNuDCIQKyEvDAImijUmCxDK+XrvCif12Ar90kHiiIz32N/NTT4O+dbhzkL/YjJIGVSOOJ2QmEcUSvm8HBCN4lYiHxIOAoyMpMxGRmORiWdKGBtpcXp9Q7j1HFr54hJAYsdTS907A0yFtoha52QtZU+V2/ucXNg6bUUK50ApRRJFHI4KlDiKBFWFlssdkJubY1Y60ccjjMmWU6rHRGKIxCHdT4n0D8twdJJNFYcsfZ39GUuHI1LEg1hHKLDgDBMcMWYCMEoTWEtUpQoIEwiCgu5SlhpKcoiYzM3bB5cRkQR6FtEnQ6tMGagDEhMstBnkh8SBQ4jY6xTZC7Cjg84SAe87f5TXHvxKiob8chPP8bWnS3ccJNOeZd2comj0vnVac6itF+FJ3Vop15ZVpvkldMy80CYTqpiK7fnFZnL1hdbF/9lWxktUoeAELBVVrOb28ncJO9FjEw3WZvx0y3IXP0pptGjmXNSixfnqtpIlfAR3w5VC7DKKZqTHZXAkFkxSxz16jafTi44TBWS05XrVOc+MVM3dUXKysFycyvk/I7qdtWqsa4zpaqmz8oh+A5lek781920j72ImqupxSz3qy49MT03brYRW71fi6LpOafKraqNgTpv6hVT5ivnz+lc9V3m1bfEUrCd7QOefup5BntbODGgA5Kkw8baCi7fwo4HbKyeomWEH3/v+zl7z/spVMx6P0ZFOc898wK7BxOeePEWE7fIysoJbly7w407N+kEy9x/6gzvfvAMUqQoC/tHt7CU3PfAD3Fm4zTZOECjaccp9188y9rqgxRln0feeZrHHnuUgpJ33f9jnL/wfsrcoLKSWIdIYBGtuOfMBlJYXrjxNDpYBqVf8zjr6trz/4GXB6/33hsx/ezc32fJk9/9+6+zVcBx7cUb/MUff4ZiMiBNR4wmQ4oyJ88zTD5md+cAEYV1JXl5myz/Kw5Gv8eLm/8bWXED54wPu9UrWJzDOYNz9hV/ziMCP/kT/wEXzp8jCALCMMBaV60oFqytjtOUxGHIqRNrGGvRAqYsGY0zSmNx1hFpDVLV+LAlWVFgqh9yoP0PSGvtSxU4X5lYiU+abWg4DnEg3LMSghParTar/RgRRbcVMhxljHLHYVZwmFtyQOI2rSDm5FLI2eWEQAu7hwUHh2PS8ZiFbsKD55Z4+NIi508toJ2wfTTh1k7BZFKwvtzm1GJMnjtEBwxzgzjHai9gsaU5sdym144wFlraUjihE4eoQGNUAArfDucfc2RLR6iVd2CdpXSWNAcninakCcOAUGuc83lXpbU4A5PckFqNVZo4jgm1Js0yTq91GR/eAmewziJOURpHVjgOD4Zsb++ig4BAOZLsJnHSxhYZ2WAXKSaYyZhxCuO04KvfvEXcP4EJW1jr2DhziiRQLGQvc07fJnAOpwGtqsTq2vWYjYBOuWkOUO32VBEubF2ewBRVsV1mbsecGHKV+yTOzhwlOxMsArN8nGoVnxXmajTJVHR5weWmYsFRO1+zYFw9f9ciwmsYi8KCK3CVw1+7TrVzNCsGytRNsWL8wYqvYUVdtqAKZ9UL9qsdVo8sq3PHKuVVhbKmBUqh3sFMM1X/t9MOqYSRm/WPTC2fWmTW4UAqUTYTRK46nrpMwaw8gWCc4KjswlrUToXVTChPc8imX53d1POqyFD1yuz6mKnR1+Qt4TyVZcm3nvocP/9z/zk/9tP/BDu+TT48YmVlhfFkjDUZSluMdZy7737EZVx/4QkoFQvd06yvL3F77y6TPCcIC44OdxFdkhcTLCMu3Nfmr74+YGv3iE6s+X9/93c5uXqetoq4uH4vzyxs0tcF7/uBs1w4fw9PvpBxOJgwzq6zswulPMMP/fDHGQ23YeLdCSua4USxfibm3L0LnDq7xu7BJmk2opfMHJyaNxRD7lWfOeYqPWstZVlSWktRlkwKQyfWdFtt1DFLJXghBoPDAZNJRlDkSGBxZYEpLVprbGkYDwcoZ5jk17i28wVQT3I03mVn17A/2KIVnebU2odYbr8TKEECpFpGMa1SiyDz2YAIZ89e4JP/4JP88i/9Cs4UaOXrMdVWrrOOIAxIUx+fi+ME4xztbof94QStFaEoiqKg24o51W9xOBhh0hIrgikNSvm7rKwwlNUYFlQ3kdNqxQ0N3yN5YejFmigyjAtLVgiHA4NqGbqRJg4saerQCGR26oqEuk2/GxJqR5SVnOgZ9g9zXNRhmJcE44IwVNx3YZkXb+yE4itXAAAgAElEQVRTWMf+4ZhJ4bhwood1jtKUHAwyskJxfjUhbgccDTLGRUmv1SaKQ8bjlDCEhU5Enjuc8ZNzKQaLxikhjkPElYiz5LkhTFrEOkCHiqNRTmS9I+B0QG40gatyBbUQqYA0F5QUrC+3cHbA9tYQW5WDBIuouoIOvuBm7ogjSEIIs32/j3Yb3euQyyIJ25QSE0iEdSUS+NCkMwVF5wxtmbCWX+Z2sMGhTWYTnlAJi9pFcrVRU63KcrNaRiKIlCgs9y1t0lpa4uvXeihrqSt1+wm4diu8yLGuqvRdTeiCq/KcbD0/1/P5VHT5wo8O9FxNplpuuLpsAlX1cjfneE13DQh2rihlnb9lsIiaH0crl6d2Yqx3jXC28o/wQs25qfNVt9k/FkZmbpnMRMucdvH/m5pIMyvJpz74Iq8yHePrfvB1zV0tbmpRpepVcnVu2NyhWDf9t9ddrj7EqcPnt1V3Sv2rrM5v/eXqAhFV+45eJNo6tCkW5+o+mbt23oC3hHhy1tDTXYrhNlF/jai1QhT2cWGbYHuPONRkhU/au/PyFS5//Qv8/pf+iH/7R1/n0uWbbB6mlOWEjYUlHrv/XWwd3WF3uMVzL97hwYe2CDo9bm8eobVwYqPH2ZOncXmGbnVZvXCK4AnF8mqbR9/xAwTJEpcv/wlFukWnGzIsd2gnJ/nW1/41LQ02ClGqS24CJvkIJGF7Z5uj4QGPvOPvsdA+yRvVdpoWdpv7s37dOFtVpj2e+3EwnPDirU2y0mCdI9CKCxuLdJMWx9zU7GcgGh0mhLogEigqV8tag1OK4eGEO4df4ubmp3nq+dv0+wts3s1ptzWRusHm8Dl29p/kA2//rwjlJA6N6DZI6Acfm4FoHNFcXFkQ0Xzggx/AyT8n0AHiCibZbGBQQYDWmiSJyY0BpRiORogKCMKg+k5OKwrotFoEgWJcFD4v1FqMtUgQEQUBQQvS3D/suf7x2kY8NRwTrRST1KAjR1dgaTHGYChcSG4MBiFuBSQROFeixOHQLMbQ7UV0y5JhKrgoIYgFwZB0YiZ5SRIIo8yysdrDmpz9o5xhZjkaG/rtiMGkIFCapKURHdCKY3aODNqFGGfRQci4nEABy31BYTEorDMoETIjJIFMyxhMsgmtdgTOIDokChWxhqIs/OIvpREgiBQqg3ZYVvlGmkjDwdGEcV5SWgg0GCfkhZAXlsLkOKfRWgiUIEVKkh7QO3OJNDlPOLpGmYLECU4FREojqiQMC85dOsP167cJixEPPfZOnv/y5+mm25xfO8/T6b0YhOmy+HqVW+0+4POL6rV1UycEECsoWyKHV7kxuB9FCysa5WbPq/P5Tg6r5zQVTBWHVVLlQ1UCSapCl47pzeE0t8Z6wVlHnWojpg4vUYWvaqcGpFo9hy/i6WTq1thKndVVo/wufDhOVfVWrMjc+Mo0IlHXqJo6cVRhKGcBTS1n6nddtcJvtoLQH1u1tanA88chIGrq5FldJYZXQmiWTyTTyEktsOpjpTreehVdbaQ5meuzOq2juuOfnXeZCjMLM8HkakfRb2BajR3nhVN9zVSPyGFufn4t3hLiSZRmcf00X/7S7xEpTagtb3vko6zc+2GSdod2rAm1YagMj3/zWzzw9vOYrKRQjiu39hiNx6QTw8Fowpdf+Aq7+yNGQ8fRwZBWHKFlEU1IHKU8+PYHuPfsOmdPPsjtg2v89hd+B2ILcUSr8y6SFrzjXRlPPJUwOuqzuXmbuHOLUxdCdg5LchuSlSOSSBOIIR8PaSdrLCyucPHEh4mCzitiodPOr8RRUVomRUFR5Kz2+1N1bJ3jzu4OywsLdOLkNfvp9U6kf1yDH7CUUigVoFTwhiLu9bZb3+GoUOGUQ0rYM774ZCCOSGnGtuSlu3/Jn37tLmf6BjOe8ORLRzz4QI97Tik6EfTXFxGVUGS/h7b3MpJbOLkXrUKMu4NzOyT6DFH89xFV95mXjZdfuExZGqJQoYKASVpWVrYXb0WRgVU4UWitKQtoR/7Zd2lRoLShnbTRgWZvNOEoN0RBRGD8yiZjHVGo6XcT9gcTjHMYWyWmz8fuGxq+B5QSCAPEQkmBneRcXImJ2h1u75WMjRDFmlgso+ERqixRWlEa4XB3yKQ0LCy0CMOApN3C5TlaCgoMYdRiKY7Jx0eMR5b7T/fZHBi2B2PW+zFr/YCShKwoabUCxrnj5GqbOIkZjCcUpaOQiEQM24cT1vo9nxvoBIMiUAolQiuIsGLQKiROEqQYsjsGNVZo50hFKNCcaEeE8SrX9obkriCwBQkTTFFyhJ/wJrljUoAxvpSAVoow1IRR5RRoR+AUubGM84JTOifrBYwmEZ1Oh5ExqKSNM5qdretkWc5CO+FwWNAJCsSWhHEXbVJOHH2dzf5JNtMuMDMgpuLDVXlFVeBORHDazXKERFGQ8OTmKYKFGNXy7oOFuVV4PhynTSVGjM/lsVVCulTulLg6LduLEqu9w4irhuIq/8gaZgnt1URfPy9POf80BO8qVU+aq3KIxAmWWdhQVeOVE+/e+IKWlfslc/WV3CzdfOpaTa/eWk7Mxj0n1ouwSlzMakZ5MVd5beDqBPq5Bf0OxNW3/9XnrasqtNerBKvgqtT7rxqlarHiHx8j1p8zNyvK5Pdd18myc8Kr7iOZ9dlUWM6pVJn2bd2Gqo11wr5U3xUf5Xij9Je3hHhChDtHOd964jJhYXnk0iL33jfC2QJTTJgc7WPNEUWSMxbN177+NU4vrdIKQnAFsdLQgosn+hzc3eFof4Ao/6yh4eiI0xsn+OCPnOLxr13j2u1NXGx5aO9Jnrl6lZ3dIRdOn2Z5VXjx+tfZONWi003Y2dwiH4/9SocSNq9lDPbHBEoItNBvO4wt6PUiFhcucfbMCu968H3US0RfsXy/uus5GKW8cHePojQst2MWOz0m2dgXSrOwt3/IYrsL8ex7vnve2D4KtbDWb2GcZpIVFM54h+V7sJ2+Q5BVF+9ksocrM4yzLBmIdEAZQxwEGCPs792iGJ9m8ezDfPCx+7hxewerS7741PPc2s15x72L/NQPP4jWJU5u0lI5W9mfMU53cWVOHCYE/T1cuk8UfhSCe6hvkU5urNNKImye+aRW7z3jHIyzEtEaETC2ZKHXZzedoAJNqxUznlgmpmSho4jjiDTLcCokDjVh4MidUDqHMQUiob+zsQ5rpykMDQ3HxKffZtb6u2VrGU9y4jjnZMeSBl1u7QwYZhlFViLiaIWQdAVrIHSKdJSTZwVxu41EbSajjMBaSudDX6IDFro9BoMRZzYWmbw04YWbh5xYbHFhTbFb+hyhhW7CYFygtGYwKDDW5zMdDMYYC0s9SxAEgCUMQ7LCJ1prVbI9KGjFLUKxjK1FUZKrLv3Q0lKGvXHO9gjOdHq4JODatS12k5CInI1uhM0M6BIBerGeOgTGWsAnXxvrp0AnYBD2hyW7m9uo5Q5Ru8somxAkgf99h0IQtbAS8tL1HXr9HoUKKIucuL/IwaSkMAWnJ0+xr99PZpizc5iGalwVnvLlDNz0sSz1uUMgXlhGqlISVgSpl9A5ppWs69BT/fA1Vbk9TqqyKv7pv1Wxx8rtsgqnK1epzhavwnczoeCFha0mbqmdlDmHDN8EtJ05MLjKmanfhKkDY8W/pCobZ5YqwVSQzFbYTR/O4le+SS2pzDRh24fWKpllZwuAfGFM6/WGpQr31avfZk5RXRrBVW2cunGC77O6L5UXoa5aTecjaLPlR7U4dFKXYMC3b1qGvcphm+aj1S7ULHpRz8f19Vk/c2+K80n+IjLtv9fiLZEwjnPcuH6T6zdus6AylCsx4nDWkkQtOt0+SavN2+89R6RTlEr48vOXmYwzPvGDH+Kht52jNIord/e4cmubQMWEKuDuzZw/+Ys/obSGH/3Ij9HtxmxuHfLCS9f5vc//a3RZstKPyLKUQDl6SZt+6wHSNIJSoUNQUYgzloVOh/vuO0tnsY2KEzLjSNqC1iG9hZR3P/JDdJK+P3HfIXb8wyjHpcVkFmsc++MJl2/v8OTVGzx99QaXb95EBQEq1N8haF4rmXz+MwudNg+cP8mD50/wwNkNeq1oTvl/r6fAb9M6S2Ec2WRIJ3AsdhPOB5a15SV6/QVIYuK4jU0dm3cLvvDEN9hYe4RHH/5RFjprJGVEupviRj2eufwEV3ef5urwWXZLQ8AyJ7r30I4j+t0Q5TJy+xyD9P+gzP8UV9zBuZQP/NCHeeD+C5TGUpaOJNYkkU/CN0bYPxxQmoI0z9FhSBxHZJm/mw60RtBo/I85zw1FUaCr5arGOXRlx6aFIahW24mS6gGVf60ruOHfY2y1+sg/3gKUKLJSsbc34XCQ09Y5F9barHYjWpFmsRsTBVAY4bAIyKSFaC+SbGEIwhCrIA1irA6IAgNFSdSJOXnuBJMczm4scu9yTD7JuHI3Z2WpS6/bxVqFccJg4nOrTFFAWRLHmpV+7CuJhwFRnBBEMeArlE9KixJFrx+zNxyjSNBBgoimtMKkFHpJQJoZVjrw4EZMRzuWewmdOKEbhGwsxKz1YhZi//Btay2Wekzxc6bWAtZicAQCBsfmwQSX7YM5YDQqiN0E5RwKTawsgQad9EniABHNtWs32Dh1gtMPvo3TrZxw51ucivaq0Fz1MNu5xGNfgNHixNb3YfgVctUoKUIYtzi9EKCV8tN6pXVmgak6Odkhdi5Zufq/AsTYuqIBRhRUK9pqr0Yql0k5fFHMKieoDtOJnfkcXrAorFZVUchplNB/thZvULk9029WAqlOzq4ebVL7R9XHpAozWjetN+6F07RffHVKNSfOvPvlpiKoDkXOcqKkKmhe93VdybxuX51wXi3kMaCsd/GM2NkzCZFqJWGlvqpwoVSlIXAybb+q2yFSnbOqjdPC6pUAnsYC/b6n1CFS4RUCalql/A1q17wlnKd2u8WHfuC99LKrdHTMzd0hZVoiYjg43GFcjOh02vzCJ/8hf/n8l/n9x7/Bzs6EtCz52rVnePnWIdoWTIbQ7ia02wpxMUkc4Ip19vaG9Bc3SCcaY1LCXPHuMx+gt9IF/XWev3HIxEZ86IffQV6c4c/+bJ9yAiryz3/q9xPuve8+1k68h6989bc42Dtkcclx/lyfuNtiaXmVU8uPISr0era+2uuLW8Rb2GWJDhwh2q9uMQXrCwtEgSKJI1phRKQ0TH+8s5P8SkE2p6BFqiJjfp+dJKAVh9+TCJgPKaZZSpZm7G5t8fgf/AFXvvpFVo/2Odw75KjMuIRhQRT7FISBxmU5f/k//hl38pKn/uAOy6dWSXpDPviBh3jggT4XNh5kON7jNz/9eVyg+emPlZxYVnSCCyRJuwrDhSR6ibwcMTFfIOB5QvthWr37WT+5gfnGszjr6MUhTrzzlOaOySRnqdthkBXsHuzTTWJCHJsHQzJjWF/okxYpaM0kL2jHEeIsWWlIohClAkpTcjgcEoea0jhsZRHrRjw1HBuhsP7e2OLILSRaYyrxcOvuEevLLRbaMCoTSh2RmwFmbGh1I6TMCcIYU4wZpjktSXBWWF9IGGUOihylNXmWMxin5DYgQLHQjUnaLUj8w9PDIicrHG4y4cr1A5yzrC/3SfOcMxvLjEcj2q2EtLT+8UR+eSlONFoFOLEcHGRACwJoq5LVTpd8UjLMAGt555kFWrpg53DED15apddW3Lw1JgoCHAYnjigOCEKHsT6XxCjj86BgKnBwCu1KRAmTSYqMDwkWL9BZ6hIULyOtLmVZMiksLeewk12StROEKLa2dlhfW8FYIdNtenpIyz3HXf0+Ji6ASpDUM6Kzzj9RAMf0eZnTzBo/lva6EeXOs7QXFjnKpXKR+P/Ye48gy7L7zO93zDXP5svMyszKMm3RBp4G4HBoQZGiKDE4DIY40kqKWWohLbTUUtrORqGYpRaKkEKixJFiRFJDgiOKQwAESaABwjQa7aurustkVppnrz1Gi3PufdkggQF3vagT0V1Vme/dd9275zvf9/2/P9HGHJiNyNSEfnYiNAX2NjQJjmDHSw82wiXvEdLh+kk+yGH0AGG7C94FECcJEiHK968RMQ68T+z2RIkrsC2ui2foJcQAxDpW7GrSd58DJYlt+LYV253BvJPpOnvX1emsY3ICDyTj+WTL1hDPUTwOH89gt+0II8PGZLwOYsviibgfiEAidcJDlwju3DaOoPc4ETbje4Ypvh7Ce+jy+zxIGc91l/O5rVaMJw7iOeyb5P2Q8ZEAT03bsrbnjHavcX5yyWAwQiZJmMy8xLQte1pxdDTk+PGIocpxcklrPF//9gdo5RnmCUkqUVja0jIYDEhTjVeaN++8xa2bKUXlsJXlpeMDbj19wIPTh3zq5id47dWvUO1LhDM07f/H5uIOWVKzLj17+/vcPE744P5r/O2r32GUG6Yjz2QiMT7nheM9nr65yyA/jHKp6GnBLTgJuv/RdMjuKEMJiZYKqQQyxhpsoyW2oOsHq/W68su+3aGHroO1c6ESzuNwcdnUfZl+1PDes1ic88f//T9n9dYd3OqCpCl4CUudwtvVJRuZsI8nlTV7XuJFAy1cU5aqaXjn//1b7nhJ6w3Ddspv/mc/j9f7GNmwWmjuPdzw058+47njAz64eItvvX7K07fG3Nw3jNM2PNhsSaJqpHuFsjjlmacso4GmKCxKKxrjsM4ihGBVhm6+ZdOwOl2xN51wOB2jYtsJ4zxKhJgD70PSuBAW4xyjQYKWiotVAXh0XL5IEUq1t0+0J+PJ+PGGj/0TrRekMjAdzjmc8njj0UJz78GGvb2U2xPB46pm1So2jaMpDEMJ+BItU4rSkOWOQS5xbU2WDrFlYG+0lzQGyrYl14pUpyhr8W3J40cr5HCMzgOgunlDcXZR4HxgphPpkEJts82UQMYKLWsdi1qwP02pqobKJ9h2Q6Yz5puaVBrwFuElp/MVq1KQJAlKtCwuKrJUI2UbJ3ofjccglMaZwEDlafAeWWd7pcq6Luncs1kv2d2tsYMd2s2ERFrquiIZjlE+Y11u+N7r99jfGZJI2JQV5bpgXgmczMmrc64PTnivuhk+3AHR5BwzGINBOH6/fWRrhBAk0uEvT/DNBiUdAh39RR2/0gUvRvGnYzNERyMRAJoPvkl/NfbpihcgAJEItOh0ARFYKOjluu79XXxSNw0Ew3V0HPkeY4T3iMiSuH7DdPzJ9tPCL3sfkwMvu21G4BC90t5HoCW6WIVu//2VFG+iaTweibjCjn1o2vGxg8gVZa07j/G4fQeGOoAa3yciSOw8TeGQwnG56H2S8Tx0lYq9Byv+vMtF7XdQClRPwXXz9Q/sd5ez9SPUm48EeJLC8Rd/9mdcm2ZclhVpNkCnA0CQZUMmkx1+9hMv8PGf/W0+9Qu/y+f+0f/Bf/Pf/nOaZo2zQZmtrQsNGaVksjNhMMm59dRtNkXF//3//BXF6ktcXNZ85ukDBtmAP/qLP2Hn2i6PN5d4ZUiEp20qMr3DF37xM7z31lewQqCykr0jAZcpZ48aKiu5edOTpgnOj/nCP/plXn7mt1ByhPcOY2z0FITRyWFCCJIkJU2v3lUfFlSvVt5t3xu+kM6FXCSt9RVGKiBxKSXWWpQKPoNOfvthXqkPG8Q953ffRL3xTY7WNVY4kkSSJooWzY3JlNoavBckaLyG2gsqK3HG8fJYct42rI2n9Qn3757y6LQlo+D1h+9x+8Y1vNNsNopNMeYb336PL72y4Ohwxa/+Erx4M+PxaYE1MBgYbh+8SaIv+I3/4Dn+6F99A0WLi0nJZd0iHFTG8XixpqwayqalbpdM8oz92YTGeBbrDUVRhiBMY0i1oGpaytaROU+awCjVWEdY9cbzoFQ4pz/qC/NkPBl/dwi0VAgRWmekMubtWIMVEiEso4Hg5LyknQ7YSR1iKnjrscG2ApNIapeEuAylsB6qBpypGQ0SShfkq8ZJjveGXK42NLWDLIO2QRiL1CnSSZqqIZcJ44nkYJLTWItpJe+dr3j+2pB1HRYMXqggcdEgpGaWNeR5RllVzEYJtkkZj4dcnG2QiWeQlhRNjrKeyShnXdRczCuEUCSpRboAjrwEYw0gaNsGIbarfhlX/lYESc4jsSIknT9aNtjTMwaHI3LZ4k2JTlJEA0YaxpnDqh267+bZxZpyPeezn/0M333lmxypFa19jXKwx0kR5g4XJ3zpIo8iOp+MDLYlCcMEPn0z4fFdQSZS3mtqPDqARRFFId/zJ/Fyb3OOepAj48TvAOH6irquvr9vXdKBC4iTvKczKHfSnOxtUCJ6e4LoJp3YPp22il0EIiJG6sUYhcgddUDJc2U+8BKBjc2NOwAW9zUu0AU+smSiZ6qCZSx6ugS9bPd3QGK/b4H5c7FBMB2I5cNAq5Mug9/J9w2DtzxSt7XIi8kgnYrI4vXeKSGjyTu+XtATGd2J813kRkS3V+fIAPoj6XFFlflh4yMBnsaDAZ/7yc/x8OEbJCsdAwsDqhyNBuSp4vj6NXQ+AL3DJz/1G/zOP3mF//F//mOksrRGYp2ntg4rBKIqkWOJ8Q1Y8E5z8XhF27T8ys/+Y67dnPKvv/7nbETJfL5GJwmDseDkcs7u/nX2DqcYoclzhcJx94NL5pfX8SrB2Q1F6SjKEb/6Ky/y3M1fYDT4ZHgoGBsukN/6nnpUG6+Bcwbf/ftDYElE6SiWXDqPUhJrI60oBE3jsNYGmS6WoFobIhysDcsUa0PwpBTd8uXDAKoDTiHfwtO2De2q4Pj6Ter7D5ivS86qmg/KmldWntNW0FpQzvGxRLEvHIuq4bXC4KzhiJbWw1DBWMLJX3yXP9ikfPw3X2C4u8+zT0+5cdBwdlryh//mLqePG+ZnlsVccP2g4Nqo4cG5pCparu2VHO/NGJBRVGsq06B1YNO0lKEizoeKwqo1Ieem9Thr8EjyNCVJ4dHFnE3T4ozn5uEewrV4K9BpinEW4wSb2pAoyWCQUa/q3n/Q5Uk9GU/GP2RYH8zQiQqST90aMqVCaGucEGajjPmipB5qDncyPntrzN1Lj3c1EwXOW6wf4JG0IidLLatNAYMRRSPIqFksW+rG0zYWlQhSEViDsvI4ZTHWkGiPNw0DZdnZHcEkZbla82jeMsyz3hIQJi5FogSXG0spDHmqWc7n7E8n1MbimxKrxoyyGdd2Ejyek7MF6zowB1kWmCQnBd5anJQkSoN0SJ1grcF6G7gNLwAbWqiIcM4koJXGtAJFw0SuWNQOUkfqCmo9RCrLYmPY2WlpjOPlz7zMu3dOca2hqiqG+wek4pLx6pSX9t/lcfUS1mlk7EnXg4D4PPQiTMAgKFvP5bzlZ5833LtveftyDfm4l/c6IQoIDJGKko71fWNhXGA/8C7EFvhoNHZRaqPLfNpO5J1CFK3SobKsb8myZYekE7i+gXHYngCEdR9+tnfzTe9Z6iEasJ0Hwq9cfG3knHx3pIHhwfmQGxUN2wGseXBbfxP4wFxGQivIg74v/e8SzLcgLGyjB3p4uiypLt+pV1REx/B1x9WxS/HnvUDgtyZ+EZlEOgwYGCt1tX2Yiz+/wub5fo7sIg/owSL+R+s2HwnwpBPNcDykKFuqtmW+NswXp8zaknfuvE6uE6bTCSDxQjGYPMt//J/8V/xvf/gVzHyB1i2DJKVpQ1XFUCkOsxFKSqY7+7x79yFeaBQt0+k+Oh9xfHiNT3zsZS4WD9gs3mRZwHoNUm5wcsX+nqYtBeOdjMvLlnazoqphOszwraduWjbVJefFa+wMXsaZCUqNMM7ElUMSGKCYG9QaF42MYWXgXDBoSiVwNmjhLgajSRkMl9CVzwd2iYjQq7pBykCd23ijd+Sps+HG3d68f3d4AOt5ePKIf/Uv/gcW3/0bNvNL2lbwaLNhTwoOMssnMsNvzcZUy5JaK1TqaeuWlwaKF1TN3IBxkrV1bKynBspNy/1/+zcsRw947qevcXxjl+uHB3zv3TPuP37MeiFpTMpsOuDW8U2U2+F73/8rPv9T13n55jUStaY0d7h37z7FyiN8gxKS8XQAlEjh2M0V4zShaNqeHl+VJXkiKU3LqiwxNpznyhiGMjRdbYEsS3HWIdMU6S2JipkmIjwY0wE0m+4kPRlPxo8xolwgIrNhbOgZ56VHE77PwoSgyP2dlE3jeTSvOd4f8My+Z1lPWK83eJHilAr95aiwrSHTAqk8bjRks2zJRUsmBMOxYllbhJZoEV5jTYXzGpUKBnmKb2pW84rpLOVgf8ZmU7E/UayLOBHqUCTRODDCUa8rjDZoLamMYFPUjMZDZpME4VqaZsPZouS0SFEChhkoUhIFCE9tPMYYXAqJB4UnVZIWj/GxRN8pjPdo4WJJe8y3SySLZcH+ZM5GPY1ra/ZVQa0teEUy3WG+aZHtnK985evsXjsmIaFxitlQsWoPyQeXTNfvcGt0nXvLGbGXSijvF9vy+ZBDFKNPvGOaNXz/W3/LanXJjeuH3OMAG1mJD60/5RVWImqTYQnqe4uVIGptfjtRIyKb4jp6KfzeiytZfx2b1YNa4t7GW8xH0ztdD78gU8keoG19S97FXp34IC3Ch2So8PFyK+qJwEzRAVzRzVMO15mjfsBN3fWj48ox9jRWz/j4vqqvY+CCxBhZORkiJLpjFh3Oi0cuiECuA4FiW5nYEQ/htbbPcOoN3lF5cWFS3frOt7RfOGcRdIXr0oVk9ie9/4S/b3wkwBMeXv/+X/Hq63dJZcIycZwvK46qJV/92jc5Xyw4OTuL1ypc5qwtePraiK89vGS2l5DlgotLixSS/YMdrHA8vH/Ow/cfM0xyRjuW+XnN6+++y+d2fhlb5VycnXBr9jLUb/Noc8py8zaj0SFpOseZlrLNaRaWl59/Gq1bXn39BCcULY7hOKE17yHFCZhLvM9odLDRJSrZHlq8wazzQX7zoIQPPeB0g7BZAEDRDNfRxK7LmPA93kYKgUaOa7oAACAASURBVFaS8LQC70JfIiWDATNQzSVKtCFz5Idc/O6mbtZnHM/f5udfvkGyPKZqGtabgolKqNsS0Xika1gPcjQS7xx26DHVnE1rKY2hbByFUmycZ+MdhReUmeb5p27ym7/+O7z+8G2W1QWDiWWvGmFLx6rYUJdrxqOG4ajh7FHFO/fe54XjMY2T3Hl0xuNFg8djjaNyluM0YWeUk6eaZ64fcH5+QZZIytrinGdTlEwHCcZ6dKSApRCczxekOwMSwDqLNRbTtIHeFZ6iqlFSICUkKQxHivWZfYKdnowff0QWWQJpWMtjvcG7bpGkMAhMa0mAgZIUrePhWc3BWLE/tDirOb9sQgLzKLQ5Uc5QNAJMw84EZjsjLhcFxgNFi0oThBIo57GYABCkBg/rsmU8yKGsQ1K/StgYT1qBswalFdYH1sF6CUlO4mqEDwUo1hueOZpSNWvmixVSQCI9SoBrW9ZWoqTEu5pUafJUkChBqjSNtbQOrAjVg2miybXHagEtpNgg58QQzW5ira3lfL7g+vESNzjArkq08RjvSLIBe9KyWSU05Ex3drBlyXy5JHOGT/zE53nza19CrC+45V/jgfoZWheew91c2z8JY9Wdj/pXWbZM95/HNq+Sirs8Ek9R+yx4RyMT07M3vT8mAgBE7/uRCIQNHxRas1yd4Ollq64VnoggK5AcEdqIK2yQj6C8Y3biI72zc/TILh5cb+pWvmdouNLfL0QABHXDSwE2bh+I7vGepRHd/10MxuxK//uA8w4shTnKd0nDvcQZthu87mE5b3tFxgc2Tfh+H8UV6U04139CwLmiN8D3AI2O7YoSeWfu7qY8qcC5K6B2i5l6Fq87X93POuM828/5UUrERwI8pYmmWC05O92QpApoaEko25a/fe0OMhvx4NEJxtUk0Sc0nNzmC1/4Rd7+4PfwyrFchrRpL+DR40vWq5LReMxLz9+maAtWqw35cMxX33yLdxb3qdqC4/3Ps1wZyiKU4F6et9h2yAtPfYqjwzMefOecZ5+Z8Yuff56DwzHZ8K/5xjfPePkTkl/7wsd56fnPcLz7eaR+Gutk0KR1goidvSHcS877IK/R0YQKa2u0OAcmSDEAkca+agEMOeGCkTquIlTM2RBiy06Bp21bjLG01gFLvD1nPJCMs3R7V3SfC/0+4T3TwYTP/eJvIO6+TtF8gFptGFcFbbVGtjWVNSjnUMbinaE1hsqBsRXaSxIBPkmgtVHTFzgburk/fPOcfJhz+/CIr73+Hr/w6U9xOLjJv/7SX/Llv32L/ZnFt4oPTkqKpuL9Bzn3zhe8eJxz8sjx+lsbrIckkfjWIXzL09f3mZcbFk1FYW2fyG4dCCTjwYgPzs5oWsNQK7IsoWigrltUqrE2nEupEpypUFn4mZLh/BonaOofFYv2ZDwZf88QQUq23gTbgIsTBYEJb5sgH+AsRgSDtpRgnGVeWWZScHs3Z90k1FXJorAkBjCwtJL9oebBySWTccpwOKB1CmszyqJlvDNENDVpI9hUJRvTYn2K9JIRCRtT0ywNo52ULFa2KaWQsdwbEYzjWkiszhkmCfsjz6KuuShKynWFaT1pCo/nLcNM8cyh5M6p4e7jivEgYSfzZK0gTxR5IlBKI4TDRwuB9eCNpbYCLVM8Cus9Bot1IJFIGfxi87VlUDvwc5aXa/KRwPjg5azLmsVyw8HRmOV8zidfvs29u6fsTRRVVZLv7mJtwXp9nxcPL/je/DqdDiNjAY33YcK9gp54Yz7g33/6iDe/+3UO/CnZQUPls5hVFJ8GItgHAla5siCNzu1OILuiBwVzei8DyeDJxYd7I/47zNAxNiBW+vr4/g4cdZZ1/3cYrZjcTccqBSTgu+qxTsITLhrlt6yXiPdnHwilokeKK4wM0NnmkVtJLt7y8f8B/YnY0C58rqPLjAqqm6BfjkaprmfZOhmyM9F71wdZBuDke/mu8zZ5AknUnfeOUuoaB4t4bWWstOtPjbwCwiKS6kkod+X69a1ZPuyJ+sHxkSjMTrIRy+WcvYFBU+OrGqVSvHOcLdY8Pl3y7r0PaJt1v0qRowPmJyd88qk9diYCXItwFu8sy2ULMkPnQzZVzdn5Gikl2UBTVCWL9Ybd2S5/873v8Cd//SWKpkLLlDw9xLS32B/9R6h8ymSac3SU8vwLezz3sZ+mqEbUpWbv6IiPv/xzyHTG49XrOBZonaPSHK2TD4llQoTqmzRJGGQpwyxFK4mXCV6MA9IWBiW77LbtBbua6eS8CxU8zl35OXS9iepmwby4R2EfIcQ7SN6n17av+Jysc+HB5WFz2XD5/mMevPIK52+8TVU0qMmUnWt7bOqCuqxoqzWm3VCZgspUzJs1a2NQac7x4W1u7F1nnGWIRJHrhIHWCKlYfO0uv//f/T5yM+TTt36K+ycPqBPBSy9e5yd/Ysrv/NpPkfiWr3z9NepW8vgUvv9Owaoouf/BPVKdMRqEL/+NvQl70xHHRzMk8NZ7DzldbGgaiwOcg9oYdCLRKgBh4ronkJWC1lg2ZUvdGpQSJFrhnGd3MkCpcM7b1uE+3Kv4yXgy/p3D+9h4VkicCRVCiQqLi2AVEZiuCbawUYoPsRjWKsrWYazl+es5u9emzKZTxsOUCo2XEttUHOyP0VJRLBdkWjKdpOzNNK5tIBuRzfZJM00uPaPhkHw8wimHFC1aC4ZpziATJNJTFRXGOEy0AygB2luGWnC0P+FkXrHe1Fxerilrw7pqsZZQIQxcrlueOUh5akejneFsWfJoUTMvG1a1oWxbFIRKYieCJ9EplAgm+q6YxTuFdZLW++B/8uCx2Mu7iPqShTqirgoUHudbZJqRDHdZbxrmlwu+8bVv4JzFes16U5KPp2z0EdMEbm++xZ7e9OZpos9JigDWOt+M8OCV5uFS4dMZ5+oFSj/oQVDHMnVVzb0EFGb/EKApgehLcvgevLi4hdACpmNuZKj66zbXNfglgBPRhUGGiSNO5lvPTz+3XJnTg08p7A/CI234TC8cXjm6fKcg84XP6JO2hcfH5M2uGnFr5nY9ExbYpXj83XERs6wE9DlYcQ7zACpKYGL7Di8jIIr/7oaI/WqE8DgRevWpHvVcMXgTgWaX7h6BYPCJxdPiuryo7k/6SkZEd8bDQfaZU3G/towaHU78oeMjwTy1TcWLTz3LZvE2yWaFlTAZZDR1jXCW5XLOm28ZTu98i9svauTgJpvl+7zx2h1OHlUsbBNOjo3JFNIzniTgCi7PKpAJaZqAN6xXa249fZPnbh3yrVfv8MGjc9rWMMosZ2ePWFfvYSU0zvL0C/t87IWUVTHHzb/FxeoENWjYLD1np+DUfWY7Am9PEPo6wsueKer79lxBsJ1x1HlP2RQU3GGUOIbJ8zjve2DUvTa0WglfyQ5QdaxTYJ5iOxYF3lvquqYW99jUa5L9PQZXv2ARTHvnWT58zPLeA5Z/9L9Tv/plTFmhZMpASma7u9idjLOHD3hsK17yCmdaMg9rY9k0llmaoWyLL5fMRmOyvet88d4H3EolE+05cIJ73nP/i3/JH339O8jf/CzviA1nm4LPPf8Ffv0XBrx08zlsXePLGS9eXzIbZOxO9yjPalbnl8i85uYzB7zxnQ8oqxYrWnQK+9MxZ5dL5us2SJ0RGDbGUjWBhQsR/YKyNMg0YzxJMWWF1gnGOIRrSFJN3dRIkfXhmNILlJLb1daT8WT8WENQGRuy22So+Gmc6zsHqMhKeQTSS0xs/Ca9JVWKsrRIackHBTd2pjy8LMBUJNKgsjFaCxqZoXNQbYOvVzS1xIkEkWvaesN4Z8Js5xrOXyK9JFWGpqrBQ+scVdNQtcHpEhL6BUJLlPU4NK3yjLVjXliSNEFYwcWmZphAqgXL0rEzSWiqhvnak4iWcS7x3nFtqGidY71pWCwFaarY5JJxHvrYZToYxKWXCO1xrcfFBSMeWiFpLGgv0Mpxtm45Hm44mB5RlxOq1ZJpOiJLE4aDjGHu2RQWPdpBaY9XipOTRzx/+zrPvHyNh9+8T1HN8XINchztLUEr89E705FHwgta71naATaZcFFK/ExHEieGSnahQHSERKxsk3GG7QKN4o86+SckfXuE9Qgnt0RQBG22Y6yi6R8fowJi5R6CIGFJhcNF9oxIu2yBg5eubyXTZS11k7/oPDxxTnGE2IAugLI7Hz1j5qJ0KGSwfmyhUJTlOplRdBIGym0BI/2piNECdJ6wmO/VeZk69qeTK7exlMFbBh8CqsFUHk30vmOkZG/lQUavbwfuos+sA599cRadeZ9ttAMBjEUzTNhD34HnHz4TfCTAk20b9o8PSN65z1inCFMwnoyp64JUtEwSxyxpaRZzypM3GR4qzu6/zp175xRLQ6kE6UixsyepK0/dQJYq6sZRWXCixXpDuSkxreHeOydslhsWC6hbixCONM/Y3Z8xGc147b0v8+6d+xzcnJCOBiQZTMaao+tjPvHxPX713/sU1/f2+O47J4zzA0heQKAjLdx9yT78d2ttBEcglAx97lrBKEnRUtJG6j8wqwFsKaXwXiKlBSTWuAimJF3VRgeiNvUHlNX7jIaaVEHaZbFxZR/qlvnb72Ie3Md840uI1/8au1oghSIxFckwww4TyuUKUW14znsyYUFpjI/95bzHegskeNfSlBuyPOe58YSiWaO9ZUcIbijP+1IzWSzY+f2vMHn5Y7zqR0j/PX7yhSGj/AByy898ZkZVFShlsQbunZzx1O2n8PKMs7sXICRFVeHMiLosQUhkbBhqbXj4SELj0aq2CBmajh7OJuDhoippjWGQhP6IUsYYBtviDZytiyD3izDJ5YMMhPl3rjqejCfj6lBa0bY2VCmp4HH0JlgvhPAkiY5J1wKpFUXTor2kFR4poawblExQfs3xOOfUaLK2pW3b2BtMQpZjVU7RBIbeJhpbAcZxsViztzvBrxLSNKVsKrQexF5oKmSlNQ2z8Qjn6jhvhQbBOIO0LS5LGOaOonS41jBMHW3jcE4wGWvq1jEYSKYuTK67U8WyNKwaQ64ke+PARqxqx2JtWKwFWa6Y5posk6TSBV+YljSto7GBOR9qQe1sYKqkoPWS+6cbDp8uaYRlkCl8W6DyXUQiWFyeko4m5NKwf3CNLB1w+ficxfKS6cExcjRjVJQ0jYJky350EQBXq9S890ineLjytK3EyBrpLELofnLv0YiLrIzbGsXxHRDrJu5txZd0ETwJQrm+7CbxeB/4rtMwRH6LbroWkliNFz9XSlwXW9mZoGBbmdazOOFzXLe9Tv2LoKdnW5wKJf+dlIlDIHFCBEkXoo9pG5aJ6DKUItDrwOMVgOVi3IDYotPw+23qZJQB49/E1iYhOnbNR9bsyun3MgBWJTxORjAqfC9ZdkBXXGWg+iiD7fkR20twxUdF9IPRs1Md2/CjpoGPBniyLaMsY7Fc471gmmvyfMRZsSHLBkwGnn/2T3+b4+efYXF+j2Q44u23XmH/wFBvgupbW8g9rDctQo1YrgzOB3nGtzVJElaHpoLz+2uqwpKOU9JEY1vLeG/IyfIhZVPz1OFn+NjHvs5647hcGJbFIadvtbz3bsnP/ac/Ra5f4p33P6Cq7jAb/QpKDPqquj4ks2eKwpcqEfFiC1BKMcyOWBWGsn6TYbJBqAle6J6YVR2NKCzCtghbozw4P6Y1gcpWasCq2tAUSx6fPUQmFVrnaGnRMRHXe4P3ElOXPPzaNxGrS9R738W+/wbV5SnCSrLEoNOMZLaP2Nul/er3uOEhUSHt3HiH8wIlHS60Vqf1loEPX2jfWn7p2ow3LyzvuRJvJPs0KBruoXG149nX7lDtPcfnfvc/R8kvcXLxHtZcYuoK60uuX/sUQo9xquLg5nWOrx/ywduXvPndM8rFhseLlqKdkyUab00wtRqPUgKpulJYRxLbrJRtze2DXVhIXF3ilEQpQZoodFylpVlCUbe0xsUANkFcfjwZT8aPPQKr4khzFdpd+ODVCzEiYJ1AidCQWklFpiWJSmlaE5/VYbJbbxoQgmmm2dmZsbEpm3VBOh4zHI4RSmIuPXmSUFcGKQzJcMCmsUyyCU4NGA4HaFEzzjNqIfClQWU5RdXQOkOiQSgd/hMar2xkwJLQ0LdpmYwyNt4zslAkwSqQJyqkp9cB/CFDltHeVPL4MpD+RQup8oxSEYo3nGdVOR4vm1DkkynGiWSQSgaJDNl63mIah8AH3ygOVDAuq/ox5TqhYsyxWqPVPgmGWuS0JmWxLLj41ms89dxTDPSQVWFwF5fcevmn+f7338D48baprI8SW2SOhI++nthAt2w1Qg9RzoGpg5ez76tJ9BpF8kWy/V1kpkL2UE/OREIqRg7Ez+1+H24atwUl3WQf2ZWOJYLIjmA/JItJ3xEp0brRVcSJaNT2PrQgiWAnvEj2lIv0Hi9iNTdXYxAiZxSBT8d0dft81erVyWBS9O/usea2IM5HQNIpL8EzFg48BKSGKx5iC5BdJSSA3IJdPCKCVBeRl4iFY16I+P0LsmTwUUk6eBt2Vm61hCtEYS/pdaxZDzR9j9o8Vw76B8ZHAjw577i+u8feOGG1qhHekaQZ5fk5lU3IMs8LP/cFJtc/z+TwpymrR/zJV/4IN7Lo3YYRirMLg5aewWCIQyPTBOU9pqzI8xSZerDhJswyzSBXDIcpVnjy6QApDM/eVORZg1UHPPf80zx48JiD/X0GyZi333yLNEuZjV7mwQPJO/fu8PEXnuZg8kt4nyKEIcTV+166g45F6o5U9n9XSrIzvsl0MMWbdaT1wTqPxqOkRxiDaWqE2ODFHCH2wE/w1iOkRQDz8we8/u1/ybm5oE3ghdsznr15A6X3InUpaJuS+3/x55QnD9mpzmkfPqR5/x6KhCQRaKVJZ9dQezPSsoTKIib74XPaEkGDxJAqgxYNgtBywDhF4kL38KEQHKaaB4VghScXDuXgaWH4QEiq2nHw5T/l66MJv/BffpYchcxuczp/m2W54fbxdYbZJ7m29xrvvfUOo2xKOsoYD1OOpkPuPrwAkXO8v8vFtMCva1auQknBKEtQSqC0ZDQaMila8MFMj4DKCS7LDcNsQKo1ranRQoCUpFogUbgKbOMoNnXH8D4ZT8aPNbyHtnUYR6j0FICCRCuMDwDKueg7MQ6fOZRWaKHwDmxjwwSgQxBsphTTseRRmmPSlMZJNmUBrmFnf4aXCdoYivmCpmqY7e0ihKexFpKEqiiQqSIfTFixIsGzMxnw6EyD1EG2AlAK0YZIk4UxjJXncD9nvVrjrKERmulIIYUJ0qPQpKlHesO6NKzWDbujnMtVSVGHImATqGCsCQuc2QCc0lQGNqXl4cYgJYwzte1Z6V2oRnSxdRUGJ6BYLNk7fJHHRcaiLJhUJZkS1JkOHkfpMCInTzN29mec3T+hqiqefeYZvpvP8OW2ai26iPsLJlyn5DmElEitybMhFqjaFqG7MvawnO2DHqEP2IROvgrdCXwo7O9Bk4uJ3dKKOGF3cpjvJ3PZS08dk7UFYQHkdQDO9RKW9R4Zd0CIfkd6STCMeBOyBTL0nqq4uBdb5onoA5PSB+O6EL3JXhJ8Wt66PhYh0lg9iOu/C3Tga1s1SE8mdBBxC+g6nHJ1GyKeh+6zOs9VHynTgzLYyoT0TXxDVWIEWB0BRgdstyDqQx086IBax5xt5ccfNj4S4AkpGOYjbt884NGjS6xr0PmAtm7x9Yp5LXn1W19B2SXXn/15lkXNW2+ueHBeMBh5ykLinUDqhIODfVQ64GS+RDqPpQadUa6WaCdAQpYlZIlE+obrh2OuHY1ZrC/YlBKpH/DmyVd5+607fPqTH+O5W4fcvAleHPPae+/zv/7+7/Hii9f4zE/c5uXnfok826FvIU3HCF916W8vFp2W3BnCAaGGCDFECoVGYNoa2gJvGtAKywrDnJYLEjdC+DWIGkQDaJLccvTUnJnPeP+hCispPB4VVr1tw9mX/y2DZs2EAru+xKxWYCQ6zUFq/HiCPrpBerBD++iSOhuhRBLkgqbAVxu8cqQyQRQF3lm8FzTWkaQqfB2ThLcGY6qm5aVqGR6IwjNEsethgaPynvSL/yd/6t/kt/7r3+bmXkY+uMmD01Pml/eQ+xlv332FV779Bo8vV/iFYlOUXLt+yNHBmEwJynrN7mzMxbJAKokUcHRtxvX9a6w3y2CIJzQIVkphbI0hPJDSNPYBtIJl05CmilGeYo1iVW7wVmJrhcA8Ue2ejB97eO9JkhiIKSV5KmltYCNC23mJcwYhYV57hk6QJUFCNhGpSylojUFqwWJdIxW8eDBlkDouzuekowxDRipzzi9P0d4wGWeUtQNvWK83THf3SGTCqm6g8uTTA3YOjjFVwbv3HlDWLdYEBgwpUDrB+JoUEE3F0a0ZF+s1ZS2pG81skqFdi1QKlWgUAi0lrvUoYcjSkGV3+5rmfOUpakfbBmN2eL5KLA5nDLmUDCeaXS/YlJbLouVyY0iVZJgrBpkikSHMtkWhgdW6IZX3SdJ9UulQrsZ7SVlUyCT0vssyy6OHJ9y6dcjDNoSHrtYLbu2lyEsLIua4dfqNpzdKCyBkL4ho+pYIneBdiWSnI7ODpyhKW72s5mIAJyKwOJ7od4uwSHi2qdrbyb6riusmeuiAmKVjnmQne0V5rqvlk/jgtRKxh57vfEYOL6OXqavN94B3PYARW9jQ/9sRc5i6EMv4n+y8XuHVAQw6EaTjKL/1vi7f5USFIbssKwKI7KTKLiy6P3/xexN8F5GuDTCNvtceV7YjCDlZUaLrAKEkFk+J7fwrOoarr6bzV2xdV6TVbj86ANYzUd0vIgv1Q8ZHAjwplaJVwuHxTRYbS1sX6HSANSWHOwMSJfnLf/NnfPnffJF/+rtvkAwOaWowraMsFLbxjIbQtp6HJxckWQo6wXnLcJiGDkcyR2ceU5aczTeoZMDxzpjrxzn5WCCSCZm6xunjS95+7YTVpuT++V32zwy7+wOKqqIuS9rSMZ1e8vTtZ7g2+RkQKcaGL5eKZb+Btgy5TY3xgEMLifrBrrMevCuxZoNOrwc/TprjkxTvSkx9gRQLDGvKtkEpixTQ2CWVW5C6BXVVUDcJw919jo4tlsc4/yLGjRBOsPz210kWJ9jNCnf5COUdq8UakeQkIkOqhPTgEDnJyJKE1dkGnU5prUcIg1c5pAJhW7RKUJzQeMgt2ESwGgyZeUWC5uZgBzYbPIqC8HBpnWFHSlYi4cw6pniaL36HP9h7mX/yz36ZSTZkZ+82l/UpI3cLLRJKk3N6dsbHd59B6reYL1YkmSJLNRfLgqO9Iw5mDevHZ0ipkRKUDjf9al2EFYf3tNahlSRPEy6Lkqp1zDLIxjluGZhC5xxCBsbvynLjyXgy/kEj5NyGlb71niRTIUajtggJzoVcpUHuUR6Mi49x57DOYYxAaUEqFMbDxaLkSCpuzWY8utTYwrK/P2Unt8iDGyxWFW89esTTRyPmixVNXWG8IlGOkwKGyrKjFDsjwcoZ0nzCxK1orQkV8lIjhMAG4yTXdsecnC3IEklrHJNRRpo62gJqY0m9pLaeUZYQrCKCxnoWheWZwyymgMNiXVE1jqoNjMkw0+hEYhC4FgSOUeYZ5jmNcaxry7KyrCqLVjDJJEmqaYRkoBSiKpntWNZlRmssSbshH+xRtYJVocmBPDN8+1vfYzzaIx0OOJtfUq5XSG6x9dmIaIPoFq5+CxCEA+sYpx4jU9ZVjZgAhCyqMImK/vnQSVEeQnNlgiTVg4FuVqb7M4RBhqq0ztAdNagOVHV+Vx99UjIanmXH1HSbC94f33mG8BGkO4RQV0rur3iert6owgdztNtGBHREkid4lrpecYGliudP+u1+R/lQeBFYKrd9vxBXDz9W/V0FINFTFDxf2yrDuPFwPEKGhbu4yhTFE+plLw+KPjBLRIYQXOeC8lcugXfb89vFKHS/jBmLvr9WUcp08br/cOLpIwKedEpVF+zuTLDOIaRCqiFluSEfj3n2aIcvfP6nyIaKp5/9Gb7xvb+iLJYoo7BeMh5L8qFluXJUrUUmDmktSmdIazCmBqVQTjJINdl0iNQGkQiMkYyGGdPBPrdvPIuSiudvWn79l5/jrft3Ob72GQ5mL/LaG3/GxWnJjVsJTz11gxu7zzHUY8rWcL7a4Bxcm04YZSoieE9jHefrBVqU7AymaD2KR9xxiQ5si3eXwPUrv5IINUIPB6iqpTGvsikqhpNbaJXhTA0+5XL9XZbzFUVdMkkds9mMTXmGVzmuyWgfvI27+wZtXSGX5ygtqM9LKFpEokm9xKQJTsJof4K5LKkbg1UJFo83DuEcSmlkNsA7SNIhbbsOdK5xJFYhJ7u01vAsivdHI/50teTQC4RveU4pnLDsJZ67a8VcOSauZf4v/5Dfkwt+7Xee4+NPfZyinKNkxmS0w+l777A6E7xdvIfOHFqPSVMY5CnFquFisSAfaCZZwqZsWRcFdV0xGQ6pNhXCC67tTFDCkyYJQoWJTcrAVCVKoaQAHXxw3thQamw93jxBT0/GP2x0vlMpg3zXGpC1QycqNscN9l2HjNltBinA2hCoq5RFCWiNp2lMeGCrhJPzNfsy4aUbM9794ILWGM7nLbP9MWm74KnPPM/dh3MODqa8c/d99qczzh7eRwvBdDpCC4XMh9j5kkEiUMMB1mlMXHsbY3AWVKqRCLLBiNV8jkpypgNJU1ToQY6wHqkFoiix3vaSkhKWNBqexyOFlJpmUzHKBTpNqK2nMZa2VVjv0Dos/40X1MahhWdvINgbKEoDq9ZxtrYoZRkkmiq1DOuKg50EPf0UwlcI1uxMc1ivsXbAzsSRZppkOGP/+i43bjzLG6++iqIK/EInh0WJKUKdHrx0Jm/nBOuNQU8N3sTJtGOMRGRfugn5qvknIoWrQkOXdi1kZ8YOsl7nW3KRyRIdMINggO7koBxQVgAAIABJREFULB/YoAglCFC1Q23bUM4eeTkA1W8rSFAiMk8RAEm5ldC6NjA9S+W2fe6im7pLLxcdGoqAuTMH+chebX1eEZRGo7vo9sFdPY4rYCiCMNEfhujBZ9cA2EbNVUTwuZUoA6RDRK8UHSDravbEhy4RXnZ3QPx7PF5EH1ga5NaOTaS/L37UbPCRAE9aZ6zKObuTCdJbRqMUJVPadkOepFy/fsjhjSNuvvAZssNPceeP/xdm+RhpChamYbO2lGWL85LhJEVqR6YlVduGXmipJlWarEl45pmbjPZyTi4fcnv/GjcOBGniuXXtZY6OD2jMGTdufJaj/UO8+j2ODmekyTXuvb9gvbykqvbZ2XkGzTNIxuEh5IL/SAiHj1q0F5BISKWjMg5nbbyAV6+qBJki/B7Om1B9AXQprN5LrHC0VjDM9xmqY4xvef/kDsKv2d2B6W7Bw03J+eUZ1j3m+rVPk+tnKdcL/Ct/jrEt7fKSJNW0aE4e3UUbg1QSpzRepyRakaUJ58sLNkaEag1rwbkQhIlHZgMEmizNcM0qRCt4h3Iht0Yh8cIwUZrr0yGSBnfeUiqFMo7cG/aSlDtGcwvLQbPm/S/+DeZXnyJ9Zszp6Xdx7Zybe0f8F7/zWf7F773GslJkg4R6VZBmGXXTsL874GJZ8/h8ycHOgDRJQw8tFOPJmM1yifGWyWhAWRWsywKlM4QA61wwiEuL0AmNNTQWfNvJdKKrSH4ynowfe1jnWZaGQSojmRAyjYQDLSyS4H/JtCDUNmicMyirARMq80SofHM+xG9Ib8BZxNklk/GIQeIpq5Ks3WBGKRcXK45G+wx3xiQaZjtj6vWag+mEy8qRjEYkCi5XK4zQpGmKSBLaBlICS+KExnuHo0YrgRJQtJLZQLIoBYlU5FiElCTaMZgM2NSGompCVpVTKA1F2TLME5SvGYw0SiqSROHbFmUVqU5o2tC2ZlMbwKEROBSNk4AhlYKDkcLmgo2BdeXY1JaNVgweXXJd38UN93E4cuVpU41XA0xbhLL/6j53qop6M8d4gSNFiKQv1fc/KL/00kwEJVoghmN0swGnQ0WdUjEPKoCoLbMUJ+xowA5zfJCounL68JSXIbXJx9y5rjLOS3Au9qyLM4KPXh4FEP/Olg0XMU8psDuiZ2s8sWRfQUc7fQhoAVdN6H3VmY9yGKGSr4sAoId49ICKKHn5ToLrmJmrbFQXkdD1x+tgnNxCkM4/Fg7X42UwhTu6qumYKN4lDrktoHNXK+dk3IcI5oSPbWSIEp3oAje7S90dRMyHClolfQ6iEiGw1ImtbHg18+mHjI8EeJJKUbcle9PbDIYpk0GGkJ66KfDe8N6Dh8zefJXdG8+yfvQKF49OmI2G1KZB1Q3WhjLTRCuEEazXlrUtkalnsDNCpeGuawQcPzVlb7iD9DVHu3tY8YB5UXAz0ayLlodnFVoXWHcCNufk9Iyq+Srr9UOeup3zEz8xYzCSGL+Hlwn4EB6Xa0+m2eY5AUp6RomktTmWLKJaFys8CIi/XSJsibMFpEdAhZSzUOOMYd3cIVPHZHKG9TWtaZkMbtO0j6ibJWVbUJkCqhYlhwyyIxozQ33nb0jahqpeoVToOTV/eM5qXrAnJQ4wUiGkRCUKV5as5hukVH27GEnwaHkHxthgJhQSLwKD4wDaFuNCNV6uNUf5AHvWgqt5qAWvO8dLWpF4S2pbXDJkbVJ2fMHO+YKv/l/v8elP/QaTyXOs1o8hOeHo9sv8h/9Y8Ad/8V3SgaKYV1ibkQiPMSX4Bu8ESit2dlLqquXh6RnONmRpTuY8OhuQWUtVXYDwjPIEKTVF2ZKnMrTZidERxsX8LQSuC8N7Mp6MH3N4YFNbwJGlmv47bmJvSglKhWbBIEi1QqkkMj+hZVPjDQiHNRatErx1KKlYVQZj1syGIz5YtwipuX//BE9CLVK0ayEZ8czTu5ydnuDWZ9w63MOpPExAUodKWjJstWKQgE4zMA0emO3tsTx7wEYlWFsz2xuRSEdjFE5oysaEmJfGkkqHIw2TjxS4RKFMjXGSTWXRwqNTTWsAF0DjaDhkOshZF3Wo0M0lZWNZlzYE1koYaEAIWhsm8KHyjMeKsvEUxnO6thxnObLZ8GgluTG8IJc5rRBgUmo0qUtxbc3FKmE2GmPEEFcFg7Tznm2kQLhgAUxtGRSPpDUJO5mDJlxDYhZSp+Z3VVledGAKeiO6j9bXQGH0jBHCx5ZpWzYrABMC+LDQpWxfsTkF6c539XhhIe07b5AXkYVxuNjA17N9bwBoAcQHc3g4nJ5622IrRC+4dYRaF3PQHXcnpYEjXNMQweB6OTFs3vXm/G7x3wGR+LIerMpO8uyM8xGj9IGc8so+xvPeB2N6tpV5PWCTobqQbUJfH+DgtlWEW+oifG7X11hcacHiowwZXt71Q/z7x0cCPCmlsUKSJprJOCfTKUppmnKDdY7HF2u+/s23eXj2P5GlKfOzJamWJF6Rek3jDc5JihLWZR2CDgVgJM26wbcOnQ+R/z97bxJrW3af9/1Ws9vT3f7171WxqkgWixQpUmJnE1Gk2IjkBE4QIEGAAIHjQBnEmWeUTDNMMgngQWBnkMYaObKlOJIjmZAiMqJJsUSyWKr+1etuf9rdrS6Dtfe5tyhSVGMFilQLeHj37rvPPrs5Z69vf//v/32J4Hh5jMcz71qax08wj1f41PPWu/+E6fQO47JjfzqhqhoeH59C0jJbX5JQ8e/+ws/ymc99kdo+pjUeFySZ0hxNZyjizY7+wxo/xJIkGbOvo67Le4u1DXleEjvvJFInGP+Q1tekXYdKbsHQeo9kUy8IXIAoMf51Mv0Cu6PnaM2Ed5/8JseXj6mNx7uKMtcgHP70mNHT91n7gO9aZHD4dcv6eIU2FqlErDHQZw41Hc35Ctk4MiGxKkSmLLiYiC4lIlicU7Q6oXaeVInISoXoPaXRBGdInECmJbrZcE/C0gje954XgR3huAwOnRdUbY11jm/8s99CPKh45ZN3ef7GAx6dH/Pg1pf4mz/zMo9PnhKqhncvW5q6Jp1keCdY1w0P7h2hhOJsviFJog7jcrHk7tFNtLOs64q2rkmTBOMhzzOEUD0rblBCkqpo3leb3kvLBqy5poX4cHw4/hjDOc95ZTBeMw6WUaIJAhwB5wSpkltDQyUEWaJi6UXHJ+DgY3mcoMiSXivl3HYq2BjLPoajMuPJ2rN/6w5FmpKEhrP5nDQfQSEZ7e1yvjzh/NljZvtHzFcpk/0JDQpjoiYq1QFnQaoUkaSo8RRbdTSLc27ujRF2TZAJeSLJVcpi0dF4RWskRSbQzqJ7d/4iT1kvakQQrLuOySghkZ6VE6R4nPWQR0uQw0zjrMPg6Vyg3jRsasOqjf5sTvioGVXRskCLQK48Ix2Zi+XDP2B67wX07D6dOSfThkS2GBn9taZ5zaYBV9Tce/CAh6cCt2AbDDvMgoNwWQxdbQKCkBAcnUy5ePfbuNFH0O4+gbzXO4stUNiiBRQihsMRIN5TQyx1eSF6QBS2xNbQnYaLbFGQYmsnIHsPI+iZl3BVMop4QRFULN1tfYp8ZIKu2uz7brSerOprgT1ACh/QW4XQ+zH15cAgI3vFFlCIATf27xnDmWUYLBEGzCj7EuLAZIktcIreSxEoxXw8+j4/rpi54T4r+SA7NYQdD6Bn6PoLg5+TiMHWvehfAE5Gtm4oyYotWuvfYKtn7dm2wbDzB+/1w1tes4v4UUP+kX8FhBD/oxDiRAjxnWvL9oQQvyaEeKP/f7dfLoQQ/70Q4k0hxKtCiM/+uO0Pu1FMdwjBs783oyxLhFCYpos+PjgSCRcnS9579wnBe7SKTtveCoKNsSPGB6SQjLKEPJW9lWTsoEgSTZpPOV9Dm1tcWnO+WfPkmadagt1I6mrFvTsZn/nUPuMCbh1NeO37c375lzdYt8fHXv4UebHD3vjT7I++ELtQCKQalL5C8N4LvLV45xBKcd2ZS8mcwaci4HCy5Kx+zHvn32DZvYcxl+Ba8AaC5Xx5wXvHr/Hs7D0eP32Xdb2MXWYq4WT+GpvNCe3KIt0hZX6bTN9l9Ob3sTIQmooUQagb6senJJVhokX8cqMQSKSIWp921USk3X9hvO+IHXOCViqcSghJzlpq1kGx8ZI+uQrX1YjgEFow0oo8UQSZooTnoxJm/TdW+8Cu65gbw8orcJ5k0/DGbz/j7uFPcnTwCZ49PeV3Xv0dVFHy7/1b/zYfe/E2LiiyNCVNJGkSsEGTiATrPVIpTs7nXKwqlk3Hpm2ROHKpqes2TlhSkCQpSZL1JpqSUZGBhLJIo+hzYAzdh8zTX7bx530P01JQNQ2XlWFd911ntsMGgwkGby0A3jt0qqOUIAjGuaYsNEpJ0jRBK0mSRFZHJgrrAzYENh1cLmumeeDw8IidWUEhK07efROVFQitkSKQiYY81XhnqNYr8lFJ12xIFXjnCTqhbTp8EAzRH0oqus4wneQkScrxPLIchdZ4KVmbhE3tqJsY6dIFT2MFOtG9PlVEeYQQrBuHUoJcRSY3TTRpqtFaxS6yTJPlGalM2JmOuXNjj1sHJXdvlByOU5SAunW0NgrwvRAYL+hM4GTZYZYnTPwJUgjWmzV5H8klBFRO03awXnf8y298n4vz0zgBy6H80uOJQcOz5SaIICjA4Vgyf/IO7fk7sWRKZEO8jGG6g5J663HUT/Sy32YQAt8/lF6fvK88kHzvQN6Lsocd8EOPff/fAArENa0OA9CLzIzoo2ZiNp3sy3jimnap35bs90H4yNZIAUJuS3Tb8OKhQ46BZbta1kMuZO/MHkQfMdNn3MQq2FWHecSEg1icLcAJ287BHsiF3hBz+E72dF5k9vw2QsfHk9EDqvggorY7K3FC9mDo6rpumT5xdT6ujkYgvB9IuHgKrwG7q328wnc/bPxY8AT8A+Df/IFl/yXwz0MILwH/vP8d4OeBl/p/vwj8D3+M7QOByd4d2nrBdDIlSzRKCkzboIBUSnanBY0xmMZuL64SAo3qs2mu2he3tU4pkEogcHhvCQJa5zCh4d7dI5IsobWB+RJW1YpRURGE58nphrxM+cpPfYmffPllcl3y+c8/4O7tI6b6NtPsKyT6oC8xx2Ba5yF42ftL9BSmczjn6ayjNg2E6Bo+0MXRg+ldNt0FF8unPDt7C2sruuYUYy4JwdNsHGdnay4XZxzuHTApD1jUlzy9eJ8kFDx3NOLOwYQ7N27xwv0vUixS/OkzRGtQ3iG7lnAxJ9QNeXC9ME7FoEatCf2T26Jq8QhQEo+D4KLhH/GDbIOl8WuEbaKjt4/5eC44bLch+IogHGUi2SsKnAtYLwk4DkTACvAqYRMCQgSs1ATheU4Glt97xNmzpzjf8tMf/xvsj0d87/3/k4OjF/nCF7+I8Zam6aI+I2g2m5jP55ylbi1145nPN1zMK5abmrqz1PWGMkux3lObjnXbYqzFujiRddbhXGBdt2yavgMp/NFflg/H/2/HP+DP9R4W2M9TTNtxsW5Yt5bWemSAVCo676laS6YViQBcZKCscWRaMik1iRYkWqOSZNule75ueTKvudy0zBtHVTXc3YGmC9StxE9uUeQZq/P3WS5WnB6fohPF/qwkDR1KWIL1bE4eMxKB00dPaDobfY0Q6CSh2TTMdg/JU4HxntFkSlqWGA91ZWPkU9NylAf2k5bn9jP2Cx8F7q3DO0VrPalWVI3HAWUOrQvYPjoqUdGKwSNAavJcU5YpOpXsTEbsT8bc2B/z/K2Su3s5kzzeM5e1j8bGBOra8PSkJh2XONfQygnazUl1IMGhsx20lkjhCDJFTw4IXkJQV6xRYCsSp2dX6Cf5hEBiG0xImLSv89P7X4+TrgfpZW8GuS2iMYgjhzb/QcwcvZpkP0HHqVoNoKBfQ/RlPy+v7jcRrIjtw6uE7evpy1bSxZIZoX9tiJWDIZNtW+ZiYKT60tugrerB3rCuINoS9KchAqu+uy/4eF6EB7yCEO2Ato7fyC3wotcZDTIhAVfb2XY3xuMQ/cFGsmxggUTPnMWdkkJsibq+Jthvg57JGzjZeA0HIHpl7tkDueCJnmY9MOqPMUbJyCjR2JKSPZMlPkBUXrMc+sPjx4KnEMJXgYsfWPy3gX/Y//wPgX/n2vL/KcTxNWBHCHHrx7+HZTS5xZPHj1DWslgvCUiWx2ekxvDC3RvcurGPDwatJMbGNG5jY834oJxyMC7JUon30LQ2xtxJgbOWbtNSLZbYpibROSP1gOOzFWbd8fJzOR9/OSBUQ1HC87df5PjyEcVoh+fvv8TPfeWz/NTnbnHzxn0sJ2T6gCI76KtegdY6jhdLjhdLKmMiVSkEUmg637GqzjnbLFhUK+ruAmM222+MwCKDJxMpk2SP/cldlNS8c/JVNuYRPhjK7C7r5ZSzC0dRjAnylKcn3+Pi8m2OjnLu3/koR4d3uHPjeSajgH3nd5Fdi/M2ihVXS3TlSEnjE5YO8Uad5AShsUIihCZLMpQc2mTBB4f1sS9HCkuiOtLERL8VEQXiNkgqITlv1xhX4UyN6VZoLemA1guaIGispw6SZ9bz0HvmxlJLsF6SuZZp1fKrv/SP+fp3/gmbcM7+7C575T20ykizLD7hyJSynKGUZm+WU7cN67rh9HJOnqWMiwIQ1NYwHY3ZO9hjZzbFBzhfbHj/6QWLdXRmjwGnEkUgkVEoK4HkGnv44fjLM/6872EBSKXj9iSJweSNoXNgDFjnkUKi+ligTAfGowQv4gNX2xpa4+MEnQh8gHltOZ3XdCaQSUWRwLjQrFrD6uKCXdlQdxU3b93hYGdMkWcEbxkVJZ0VdLJEJhmbTUVXrdnb2UH6isl0RkAikoQkS3HWUYzHjHd3CbrkdL5GKQM23kfPlx1t03Fvv+D521PGScriYk2qBdMC8NCGGH1UtZ4iVSSpBCVIVJyovY1aJo/Ge0nXtAhC1DcJiZYyekhlBaOy5PbhjI/c3OG5g4LDiUYrRW0lKyu4rGrM0++SqJy8mGBcTD0IvWultQHXNth6yeXxY7YinG31p4cvwUcmZsBUMjAZC/6z/+jz/Hf/7X/Fvfuf4+zxKcrb/ik9tvdfsTKxzBrUAADoMzb7SVtFvY8iRp2wBUa9oLw3+x7WAQiqL/MR2RWPwMsPMiBBctX1t3V/9CA9A6cjBo1RDzxEEIhe2xr1RCKSCgP5CFHC0d8DI4AYymEDm9W/zyAE78uNQWj8wLptBe5w5VfQi7T7/RLBb8mNgeVBXgHHgayLdk59QPJQigtEYuIDt+e+PLg9kH4DQ3luYOrCsB2ugKcQ23MiwiCzigB/W0LsS68/avxpNU83QghP+5+fATf6n+8A719b71G/7Cl/xOjamsnsLk/OnvGpT7zCShicCDx7/5T1s0v2Pv6ABzdvcnJ5Sb2qqectQkpab2ms4UYxYm+34LSqeHS6Yt1YrPVkaa8pQFOWObu7uzjb8t6Ttzk7nfPSgzt84pWETh0zHSk++fEJH3txn0eXgXff/jYff/45jg7u8PyLOwhVUdUZe9N7BKGI+WcKj8N5DyH0fi0GsHSmYWMeIlRN5u6gxAzrWtbNd9lXL6CCxJo5yGdkWU6Zv0Ce3ULKhJGecXn+Do+a3+eNtx/y5OR9XnjuDiN1C0i4uXtAVb6HziyT8R1a/4Q6PEOeX5I9PKcxDUbnCGegMbQdbDwsuwU381F0AVYKITUGjxMeoQQqA9lZvOtQGFxoCUJifUBZ09e5TUwGl5FevbA1pdYEWqqmJogUF8AGE4NRHQglcAEKJTmrAkZ4RgJWQqC9ZC94nn5vQVUnLC7nnC4eMpvuobI3eHb5kMOjnCfvNVwsKkoNB7Ock8sWIQRlphFBsm5MfBqua9iZ0LYtSZKgVOz0EQJa08XQUyUZ5RltW6OVRsp4k5O92d2H46/E+Fd2D/MBOgept9weKy5ry+WqgnHKWGuUBys8VSdxIokPIFJQFDq2kLcdtQucna5Zm2himQgotGQyTigyzThPaKyl2lRMxyWlq6gu34PMQ7UGzklmd8lyTzA1iZYkasOmgzOTIRxkhUQJR1AJVVNRTkrSfIzyFp8kpGnBzlSxXtd0QTJvGl65s8NOGViuLAezDEugaQ2JtwgvmBUFbduRpI5ECbom0IaAlmBCtADxPuCFJ1GSVRsfzqxzvfO6i5OWAC8kbQ88J9Mp05nHtC1VZ1lWlsvK8fbjNR/NnpHtJFG+ISwj6fGM0Jlk1YyQARwGkr6tvy+PxdLRwKwMxo2xPPS3PzvlKy863nuW86//G3+N//mf/R4iWxLSnZ4xEVG0TdgCoqjr6dmYYWYmLveECFS4VqoSA9tFDwZg2zbvezYoDOsNpbpBy9NvpwdG4ho4CT3TFVktuMalMPgNigEERfotzov9e20xz4Be+nLn0LZ/nTUbYlWQIJ3fApQghpy52G0X9WS96/mwvz0jtBW+9yP4qy7A+F6y97ESEUSJH9i/a8HtAiKbNhhp9nE7YhDm93YN8TBjN3zcjmfo2dteE9hey+CvLfgR488sGA8hBCH+iHf4EUMI8YtEWpyjgxnjnQNCNiLLxty6JbGm5WnVsF60/OZv/Eucd5yeX5LKFLwniMCqbTA4hILdUYkh8FRvQEXTMolAJUnsXNOCIB2TyYy6XgGa19895nyh2L/p+fIXbvHplz/JKL3P7b1PEap3kSrn0bOHXF7OOdp7mTJ5EJE27srLA0ikJAQHIeC9xPsNlTllvjpmMnYk6QznNWdVw3p9wjTdR4gRIViMWJBn+9T2HRbVW4yLXW7sfYrl5ozjs28wX1xy53CHl1+4SZnmUQtWHrOx30fKc1BHlMU+SXJEebqmWb4TP0xSEaoat96ASBnlnrQLyNQjXUAmASlljFchlsCk8kjV4TZrhDAIDMHHL59zAeEdzrnt04Hon14wnsZYgnMIAlpAJkR0T1bgXHxi8cFzoATvW0ftJSoIJhKmCh5fbEi84Nbefc7n3+KXv/rr8Zw9W6CSgulIcHG5Qs4KTi9rHp+s2RsX3NjdpapbLlYV4yJjlhcoramqhtlkih/KuCFQVw3CGvKsZCQCSkmqxtDaPm7GDXfBDxHUX6Xxp7mHXb9/pVJQNZ6QQTCOaQnrJvD4vOZgVlCmkCUS5x2t92TGUUgwMY2ai3nNZW2xPlBoQVEKJqOcVEmKLMV6R+fBBYEWjq5rGE13ODk/x3cKL0Y4Z3F6QpCOYlpC/YxZCqtGkWU5ItVU8zVFnrCoa3IlyUc5QSmqqmJeGbKixLqO88sKdMo0yTicJujgoYC2gXGRcHrpcbYlSzOeXVYUeYIMgmXnyBIZO1tzT722bNqO6ShHIDDGkmpNCAHroOsBlOvZEuss3gmUSqlswDgHTpKIhMOdjNnI0BqHCYLCNRy3CXupQ4cWQ4fC0QbFge44d8lwofpJ9KoDLlxno0ScYE8fvsEv/8oJx3M4X3qSdIemXSGynSuWpDdYjD1wQ7s+bLkh0S+HPiKkFyTLXk85TOjbslnP72zvObLvzPM9FuiF01dNd0SAJK4mfq6iVpCRkRIi3mujvYHfyr6ul9BEr1/qq1+ELVUVy11+C5D6Y+i1VvQ6JDcA0jAEbIit2H2IZ9l6QYkrHdHW3kFcnZO4edl35vXsf1Sgx+MLfdmPq/MZGaOrjruwPY5BAB9BoRSxvBh6UBbF5OHqOva/D5EuIcTu1z+UEPJDxp8WPB0LIW6FEJ72lPZJv/wxcO/aenf7ZX9ohBD+PvD3AZ67dxAynZFPZ1SblpvP3cK0DbUxtFnB6bLj//rV36U82sXnijxXZFIyyXPqpmbddbTWcbLasGjN9iK2xqGVQEiH2zQkiaddL9i0LUWuAM+yNhSd5+33niGTPY52d3nzvafc2p2yM1WEcEDgJV44/DK76adBlP3+e4SIOoad0QREIFHRcatqOzqzIM8miJCg2DBKZuTyJl39lPn6CYfTTyKV5HJhydKaIquZlDewdk2aPcdMT7HmVVyo2d8fMRsf0bg1QTgcT7H2hFQpTFhgaZklKd2jU2zT4LMchaOr1gRrEUIT2jUyWIJvkTIghEapBCUDwTYE0YFSyCQ+RbZVTTANLoCTGoujbRrWTRcBiUrwwE4S/ZJa45C955PQUZTdYams4IkN3NIBKz0vJZApzdr7aOanwAbLDp6v/tZ3CWVgovZ4+myDzkdsOkVVGSY5NK2BoFmvG4IVKB3bZ7WOGjmPYOMDB0LRupbFcgGuI1GCUZ5yOMnRAnKtSZIYwtzZqO3KEtW7qgu6D8HTX4XxZ7qHXb9/7RY67Iwkqybmm4mgGCVR0Hu2ahkVnlGuKRNFgafxhtZ5Og/WBhrrSYTgcKfg9l5ONIqOD4BN4wgSrIsPIUFC27UU2YiQzTDpiFK2yG5OgqFyDQ0HzEZ7CLOKeXmrc84uK0aTnciIZQXlqAQRjRWlg1FRUBQFwaxR2Yb5quKlwxHTTKGkRHeCunYkWjEdSZYrCTIw25mQCot3nlQn1J3BOsjyhNk4QQqJs+CxBCSd9wTj4wOLjN5WQghwEmMcLgS8dejeSHLRBE6XFcEH7s5SRpnGLM7JlSfLn6cWgpFdkvoWrxWpAOcyGpFuJ994va5SeSNzczU5yyD5v98wPHav86gdU1eOyt9FuY6IXHQEAr4v46jBsHGYYHug0pezrgBRL8ge2KD+IQ4YalUf0AmFMMwrPfPUszVhEGX3v/dbY4gpEf4KjAxvM2wjDCbcWz8qtvu2ZV0GzNSvI0KvOQqDjkr0sqOIlLYMUGD7d4a/D6CPH3wO7UFeVH9fMVn0+DO4/pz2pTgG/dc1Rs3Lq0zBcMV6DVjr+nsNv8oPnDMfxe7ba0TPQA6HcK1b74N790PHnxY8/e/Afwz8N/3///ja8r8nhPhfgS8Ai2vU+I8cddPRNhc899Jn8OfvMM5nGNuAsJRXy+O6AAAgAElEQVSzjHbtuFhYOFmR3RyhxxlapCiZ0NgN67pl0bRc1m1M5LYxR0pJKFTMWXIy1tuD8JRlitKCrnUEn9GtU05P4GL+Fkf7FVV9wk+8+Hn2prsYMyO5eURR7tH5NdplaD2LNvA9GM+SXpQoHCEoEjWm6eYs18d4jjjcOWC6M0Jrzd54nzzVJOUE6yqenDzm3u1PsbM34vHlbyPtM1668xwuCN548gZPL15l98ZNnP8JRvo26+acrjUo4RkVBzStQWuPSM9wz45p6kXsEGk7pDP4YBHK47sVSjjwLVJJOlPjgiCRAu07sszTOY91Bu8crrUEawnB40KLJ3p5dNZHgzfnMFrTmQ4RJPOuZidNMN4jbOxyRAiciOLYBsi9ppGeEZKVCzxtHXtK0gVLYS1dZ/nW22+QeVhVngJPkuWUY0UiaoouIc1GHOwJvFuwOy3Z39njfL6hyKPQ9ny+ZJRpskSyszNjZzpi3dooJlUwyjMCnk3dYJ3HBk+WaJJEIdre3fnD8Vdh/Cu7h/kAt3Zz1LxlWVk2xlMiKJUgCMfFylG1CeNUM8o1TdMhpWK31KRacLA7Yn9WoGVAhggzfO+dJrQGKShTiZYBsLRNR2hWjJIxrU7IwpJWlrQkJNMbhM0ZnfRUTjM5uENbVRwmM9brBRJBkY9RWiNEEhtdpMAag881FokPGikkN8aKzlgSrbaT3dl8QzkdI2tDImO0UaoLijTh4bN1ZMfSQGsNSqYoAqumjvpLqdFCUruofXE2yh2ECnTG9qy9o+4Ci9awrFu8E/F+qTwna49bGAieu90luzdLsnRK4zIKs0DLEWlSYITGJRP84H8krk2eYWBB+iw5ogYmObrHx145onr3kld//22kn0BjSNwGqyfxQscZPAKabclrYJ223AoDqgj9awag1u9EZFd6R+1hE2HQRoWrTQ5VNoHAD+JxiOesL+P5Hlj4vp4nesAUc12jJngo2QUf+oZB2QO1KOT/AO7Ygr24H9KLgRPrxUK+f7/ev0oMppkD5+a35cWBiYtEX2CLUfpztAV8/fLIll1hze1ODGuI4bqxvU+L/nz4LcPot0B0AIdb5qxfPhxr9I6K6w0/b324wvV9/eHjx4InIcT/AvwMcCCEeAT818Qbzj8SQvxd4D3g3+9X/xXgF4A3gQr4Oz9u+wBSBqrlBV/+0i/QNXNce8mq7ZAoJjtT5kGxrBzN5Yb9RFDMRqzaDfOqoXOBqus4WS7onCHTgcZHEfB0VLI7ShDBs/SGZdMiMsE0F1RNIE0LJkXKg3tjPvaxBIdjPl/y3J0R945eQLGDoWSvHDE3SxaLt3jx6EsgdvovTvzgWB+/lFpFB+E0HeF9yZPjNwnhIaPsE8zzDhckaXqT3elzBBHouvep6wseHX+LFx/cptCK3/nOr+HshLqb83vf/XWQlnceXXDr6PscjF5g2fw+bz16jf2dEWVxO35p1YK2XeLPzhEmhoq6psWaBomPJpy2JViDDR6dJRgZOL9YkRGYKklCipEiZmS1FXhD8BbvLXiPJHYnODekfEuaAKkNBOkYS0XlHd5LCjRaCXwQaOk4UhKDx0MMxAyODBAaGhe1HQroLhoWZ5amtty5M6VtNfg15YMxb/zuhjTNETplNDY8V8xIpGQ2Kak2hiSTpCqhSCSTSYmwMTMs05oiSQhKYlEgIrheNi1tF9uR01QDASWh/TCe5S/d+PO+h/kgWJvAg6OSh882XDQW6zVJAoUU7GRwVrdUradsLeNUUGaCskgoc005SpAils9tcBgbUFIhBeSZQCHRWmO8RYsENNR1w97uLlU2hvn7yPwmaeqgXlKmLevGYfWEtqoQ+Q6jZIPfBPJJRivpRcLR38d6gQsCGRzVsmbTtuyOUorE0TSOZR2F49NRyWRa8uyiIs9yvK0QiadxgQSBklFf6p1EqthlVhtDag1SBOrOUaZJbzHjsJ0jzeOxK2JpszWBTkCpHaOdFNmbjRoPOjg6K7BOsLaSg9AhQ8CWN7D2DO8MmoQgs2gZ0Fcggu+DfcMVJzF0esm+/JbrwEs3x9yfadT6kreeCdYLTWJrhBhvQU+cYKPgGugtAnrGJFzTHPWlqThTx3Md2RJxjeXoWSI//NBjhcEfqaek+jzcrQ5KhD4WL0RQE7PbwrXtxrKV7JmZAWAMLw69P1XcvXAF2gaQIQan8qFbLmxf31cOEZKBE6I/4qgTGkTWgi1A67+DPXjtgfhQxRMDqwWDtmrbubcVS12V5USf6xdlOXILHuNu+e36Qg77M+xzXEn2Zb/IsvXhNdd8tgbn8qE4OzCXP2z8WPAUQvgPf8Sffu6HrBuA//zHbfMHR5qkrC4fsnt4h6999Zf47Of+Jo3p2HSWNJNMdg9Y146LZYdcO8aN4Z2zOReblkDgohHUp3PuHoy5tbfHHzw9p+pa1puGzaZCKokuNVImNK3h4rzDY1FSsDsac3gQuH0rZzxVzC8FJ+cVy1bSXL7N/vgnScMRqWw52pGooK5Y2CAwznG+XGK9ZzYaM8liKWx3/Ar7h+/TrB/y+tu/wRvKonXK/uyvM335Nvg58C0e3LrP6QUk9kVuTHZAvco/+qe/RCoFeShRyrCYNyxXc7zc0NozFvNjbuy/hBAjEI66PaNdWPSqw1lP6gM69OJ12yG8x5sW42OLv/YtQqRY31GkKUYEhLVYAs44JDKK370jeBfN0WSkh0OADsHSBaTzGCkZucBCOjqrKSVoLFIKCNE034kQXcv7Z5MY3AsqeJog8S4+LSXB8JmXjrhcVZxc1CgteXBvD3V3whu/d4w3K86OFxRFyeHhFNcFOmvYnY7Y25TY/k6UJik6j8ns+7MZx5dLnIiGecY6EgRaCZr+yyqVwluDFoJMQvth2e4v1fjzvocFYNFEy4/bB2PKZc1lZ+ispEgFQgeSQnPSGJRIKYuMNFN0IZDLQNO1BK+gL9WBQApBmgik0qRSbr830gu8UhjvMJsl49kBSzkjqByVZMxPWuqswOuEXGvIS2RWkldnrCQxFUFKYuu5xHlJaw1t22DSDoj5fLeOCrSIWkbjwQnJ2brCdQbhBIE0moJqwWXjWaw8h3sTVusGLzRIh/ABJyTrzpMlCbWpQEmUEJgOEBpvBfN1R6YEGxGoKtAKciEZZdFLTmYSnSS0ocDWc1R5QOdHbOanjMqCQlziZQ7dCh0ENslAptBrfoaZPPTaF4AwRH8gSFPP3/nJltvtCV9/4wlfuj3hflLxT6sS13YIbfEqQQwxVNeuuxDXY7cGbqUHET2AoAdVMci2r8aFK91TGEBMD3qivQB9ya4ng0Kf53Zt+z1dsxVoAwyobiinRdH18Eqx1aoOmir60tU2nLdHNqHXcg0O3QNZsH37PsRODHW/bSdjzyhFQVEv2A/DyboikAB876SO2L5uu32iFk78ACBFRHPR/mz1eiu2LuGDgD8grqi7/roMu7DVR/UXI7qT9ye9B7BeRu2W/CNs//5COIwnOuH44UPuvPQVTh6/Q/rFCXazRDhQKKRMkFrhhYxxB71vhpAeEVysW3rP3rRkNEpwGJSKDrKdAylCZCLwJKkmK8YI0bAzyTjcG6NsQdsYbt24T5FZvv3tt/n142/ypS++zL3dn8L7QJI8gZDgQ4u2DeiUIDTCW1IdYxUEg1usINWeMrnD+/PX+M53X0cKzysvfoJbs4A1K6x5nTY8IysO8N6zrE5IihXV2vLGa0+ZFhmf+sgtQtLxbB7beyvzkLpZMy49Sp7x7tOvQ7jBpJixOZ+zuzZ40yKsBWtRgcgaORNz6pQiVwlaClZtg85UZKJi+hbWOmxnCZ3pKWFQQhOEwOBpnWfjJbWEpQfZRd2YxCO1pAielQShIBeKdYiKAYfA9J9cEQIJMNYK4aBzgUZK0uCp1waVZ0yVRSWKO0f3uHN0h9PTE7LMYaxiMs6pu5Znp0v2p7c5vbyITSdSUq9r8iTFdBYrOiazHVLhSZWk9oFROSZYQ5CwMy7wznKxtgRjSAloFTUZH44Px59kSAH7I4ETCU2QHO6NydYtZ3XHugsUiUJ5y4OZYl071lVNpkfIJJYq2ibQysiCJIlES7DWk2YSrSQaqDsTvaG8w+FRCgSWtKtw+x/FtYbl5QkhPyBJLVM5Z9GNsHVNEjxP65xkXBJcjXWB1jlSJNHdLWdS5njbYDwkWrM7UhHUiZhHt6kczltyLbA20G0CozShqjv2dvfw3uGsw0lBWSYYG7Au4EM0blzVliyJ98y6arDB451C0lIbMDIAinljUcExGWmaleOyDhzduUOpEurG0DQLStUisoK6uMVFoxlPBE3X0bgRqV3g9QSTpP3DXqQ/Qogt/RFVeAaxdQBGaWBWSkR2k8u6YmlSVsuOIpvQNkt00YJPIgsEV0AjFsaIvwzamLD9PeKJgQ0ZOr97dkVGMZLYiqd70MMVu7TNoutBy7CeEOEDYMGLaxolrgGhrWXA8EndoqPtng4M0/VSXegZnpgpF/AyAozrD79Dcsywn4FrgG/7Xv2Xww+aMHomyyN7h3D3g+zONfw5KKB8X4aMhziUQ+U2QScCIPpmrhghthXrb7cZH/z9FoyyDRdWDJl6niDjdVRebL24ftT4iwGekoSHr36Nz/3cf8DOzk2M7XDtmqztUFWDFwbRl1OsEIzLMZ94kGH9Qx6eLpEidmi88fScWT0nHQm6FZGeVAKP7Vvm4wdVKYdSir3dlPsHCS/ez/n0K88j5Mf4nW9/jTKTfP5Tr/DSzZ9HixmGmsY1gCEVBmXr6JEhJVo6ChWt52WY49wU5wSClkwlvPP+hicnARGWHB2cQP6rnG6+ys39gvsHnyBJxzw4usm4uMHTxdfw9QHePmFdNzy6MORZTufgcPeTiDBDypTn771EOXK8+uabXM7fY29cUrRwAFgT6KomdhnYrgeXjuAcWkp0/0XrnEGXJe2yQSpNliQQAkpKLNFaIAiF9QaUxjlBFzwLLwnekaUwVZ6RgnkrmKnANJUsW1h7AQnMHTGyxscOGdHXoz0xGylXYL3g0npuKMHZM8Wv/YsjDveW/K2f3eXezXucri+499wOR7cKXnt1yU6ZMRuVzFcrTi9PWazWCCnZNG3M0soLAmCNQ2qFJGYPtk2DkhqkIUsVeZYhWKGVip8J4cBER+cPx4fjTzKUlGR5iZYKHwwtnsk0R6rA5aajdZ4i14jg2JvAuvOsm4ZEpUiRkioi4HeBxAiKVDMqNdZCmQTKLCUET+s96zrQdY401agkEMwlIxPYUBBGu/jWIto5q+CZhwRVTFnPn4EqyMc7bJY1pu2Q3mPxtDqy0T0NQ1ApWmsePb2krhsSKfrcR8lqY/B5ys7uGNPUpJnGmhbfbAgqQypBopN4X1SK4D3eWJIgsCJOk852VCZE1stZfBCMM1i1MNvV7ACjyR6rxRJVjLk3E2htaPY+xVLfY/fZryC9QSRg13PONopSBmT+AC0LjF2hhMGr9JqY+Wri3Zaj6PU/IU6etqtY+xoXPKar8MEjiwSz7EhcBbok8k6w9Twa1Mv4a0Ls+Cffu4mHgc2IO0AslYq+7jZYEvTcVc+sbJklenAyWBwwVOYkTkXgBRGEEARBcQW2giTQ65OuG1D2TFRgEKXHB+cIauSWpQpb3BX/LoaPyJZE6pmw4fTKHnQNJb5eUB83J4fDjWc+RLbMy/46+Gtgj8F/K1oiCNTW1mCrQ+oBYyxvxg072ZtjBvDig3YJ8ZyB2NJzA8DrfajC0OF3DWsKegD2Zyjb/X8xivEui2BwZsONuy9QNxW2XTLzAbG4BCHYtQGZJ6ACWZpQpBnjPCdXa6TUKKExXcvshmMySvnedyw6B9oEkDip8CIG3La1JUkMwUg+9srzvPDyHZLsNpo9RvqQz338JT75ws+RZ7eBFc4LPFNA0skWwTmZmRB0pL21HINccNF+i7nJydyUJKwx3bvszQrKfEK1DDx9auiCIbtfYbqSiocIM2LTdGy6BacXl3iruXGYk6QGkUmOT9d0QvH6u98HcUrbPSZTd2i6nOOzOWfHgfH9CbsiYbO52EY1OOvQMhqBORG1PsY6jO9oXaD1gVmiWFuPc4bxqEBj8cGhFLE3pk//Fd4RRGAkJYkI3CgkqRQoF9v9D1KYZZAmCh08WiW0Ln5EO0/fAipohMf2TykjqShVwDvD2gUq61mfV7z1tYd07n26+uN84adL9vb3GB1CUwvqOlBv1mSFQqmU0/ML8IE8S0l7I7jOGk4vL/HWIRDsjjJUopFC0HQNIxlIpGLTVLTWEIKjSAu8dfgQxe3Xn84+HB+OHzeEhCKTpCK66kuZYJ1nVECmFOd1S2MCeabRBHZGgUXrOFvW7I0DySQhTxQkga1TtY8JTUvT0uSORMTvV5ELOhNb9p0LhLDAdBfRcVMKkqCpZYJOc0a6wRqP1gkVKYtNg7WSpgOJYTyuyWTgwrTRTNh6lps5SbAcL3ofNeXZmWQEr7AeTNuxWqywHiYjhQgq7q+IZqBprlBC9ckEFiEETgXWVaAymmVVk2vFXiEhT3DWs+kMq8ozmc04vDXmdPp58u7/IJvucT75OLvL36cuHmD1Lm1j4fCzFP4cLSqEdTT1OUpdkmnYuFjitHr8AdZpKIduTQ/FUGICnWWEW/eo8glf/83fYL3ZMMpm2CCQu3dw6zNUVuHDeKtJiuOKZbo+towRfZv+B1aXW9YK1LXJevAbCsNGtiLmbRdcREKIHtKEEDVDwQ8u2mLbCbft8uuNlmJUiu8BTmRmgrj6G1wBtEE0PbBHcjhlIfT77LgCeFfvI7c1sQHk9TowuYWr1zyr+mYB+q5FEXqw19N7WzXVFUvI1Ssjq9gDrMG2YbAe6J/Qo5v4tf3Hy55Zi0BVoq4xaKLP2Ivb9gKEvBK0/7DxFwI8IRXvnK+4PHnGg5deQcmCj0xf4T/5L/4u3/rGN3jvtYd0dYswLRtnYk5ZnlAWBUmWYZylszVSC+aXnnrdUGpFkTnWG4MJChMssmcc8iKnLBU/85Uv8fxH7xJEw5Nn75OmJ9y5ecSd/b9GUdzHhjdpwndQ8m9Qhrs4LrCc4sIaLTq0T+hsypPl26TpO/hQ8f6jN/FVzc3DI1q74Win43DP8V5leHK84HKdMSpuUSQNe2NBbU/51d/6dXx1n0yVPDq+JIiSpl5TNYLji47p3pS3H76NEI957tYdinKXdeU5fZZxellxcCAZmYDedBTTEUp6fP+hjA8nCVXt0ammbiwbYxndmJFngf2DkraDIstpfYuViqADQraoQUWHQ1rHWEr2c9BBoHHkWhC0RnpLa+J6isBkNGZ+uWYqJVoLauvpgoskd4BcS0wIoASZkmgNysM4z/noV76Iyn+ef+0rL1OmnovVGY/ee433H1eMyoxqA/NVhUaw2rRM8oIbe7tsmooQFKlWOO+wEparVczZC46dcYlHEqSks4Ha1CRK4xMZBYoqAsxr8sUPx4fjjzWkEEwyiZCxqcKY2HYddIbUgqNUc7ExbLoOn0gSYCd3NDWczCucyzmY5uRFL6b20fLAesEoz0AINm0HBkTwZEmKCR5jPa720RKgAyV1b3HQYtoVyzOD9x6hFWU2ReVjgu8YTxO6doW/eMwoT8jGd6myPU7OF9gAE7kmKI8Q8YHz8nKFkxmZdjhBHywsMa6LIESCIEFpRdctsUrTGocQOpaYpESrgHCWG+MM4wInK8Od/YzHy+ikfnjrAeSSi/RFqp2PcWvv6yxu/HXKxRnV+KWYW7p8h1wHTGpJnedk8mW6boMR54z8hn2xoJJTVJdHkTUegr9iD7YTe9+F1z8cTvYL1kcfobGCe5/+KHjoqo7Tb56TZiVdlTDxNbUasbUi6GteV3Bsa/rUj8Fkclje18IGbU2/TrxH9yLvnvnY6pyufb4G36Lh7/T30ogOBpNKrliufmy1WGKo4kWo0QdkEITbvmjAPoOIe/CqGti6XsYU2StxxVINhBFhYJ96sCOisegWYG0hUHxRXDQ8rIbt+2+bsXoVe+yGu+b8PRzgIA7fHusH/w89qzicr+1+iME6SyD7PnKE3ArmIxzu63pDZ8APGX8hwJNA8MXPfp7N+pQbt78AwlCvFnzis18k2btBtv9tVueXmNdew12ekRc5+we77J2eMkqO+amfeIlXPv6A3/797/HN198nSzWTNODreJFtf2GE8KQZ3Lm7w+5+xgsf/Qg3bz7A8A7JZok5v8f+zRaT/B5vnX+TnWnNKLuH9Gu8aVCywIWbIAyN6BDihIvVY7r1W6SjjouN5Xe/+btszi337x7whc98mS98/A57I8c/b17lzbfO2FzkPJkcsTd1rLoL8izFhQ3fev01ZpM96m5JU9eUuiXLBTdvzTi8sctOWaJEwm75Cql2PLr4f1i1FS89fwMvpsxPb7Knn/Sib4+UConHeYf3Ch8K6sawwZKNc8o8Y+MDSa7Jco3ZbKiqmk1tkEJStZZSCoIL+KCwWmNcx91RyfeWGw60pCg1XgaUliitSLQmkSNsyKjdGWkKqbBILUkDaGJBvcJzaqHuBKkQzIQnzzVpknD7xRd5fPwur7/zOrdv3eZw/yPsjD/Nzt5XOX30Ovfu3MD5EU1tyAuH9IFpmZMkHms1WZawqdeMijJmh2UpqdYkMmXTdDQmoBKJs4FMp7hgaa0B70j6jiY+BFAfjj/BEIBOE3Sv7/FYMBZFoO7LHrd3Sy7Xiot6g1YJGkWexbb7i1WNV5aZz1BSMSkyEh1v9rGfSDMdF6hEsalbmqohVYoyTXHO0nQO4QUuOKSIeXp1C5Nx0UcOATja7pzgPK0TtCaCh2KcMHbHjNKSg+cPWFT7rC9P6TYZ7eoCTEeqkxixEhRaR93ovDYkjeNoWiC87asCKa1p0ELgnYU0x+EppKRMFEYFWuNJE9hPUkSSc+NoQuqWeLEmCylGONTmEZ2zXOS3cbVi5C+RqyeM6RgVmk01x5Yj6ul9zLu/w+1px5PZV5jO/zd2M9hkZT95D5Eig9Fiz0T1DI/3oLTgs5+5z8HhPq4LfPyjz4EXBON59E7N6SKgxrvY5SPU7hhP3oOwmLIgQgRHVxP09fraEPfUl/VQ/WsHEXtfQNq20V+BgyG/7YpxYQtOPgCGhlKTENv2fMSVRmhbjgp9uHF/7IOdwFCti0AsDK+I3X49QAxCRtwn4jn1nlgq7OtbUYd1bT/8laun2O79cCzyysNqUK73bBlDd1wvRB+y6gZB/bD9ATwN4PHK6ykyXVJG/ZPotx36eSe+RmzF98O5H0qrBFCBq8aCH+Nb8xcCPAHkmePRO9/ixU/8LAjP2ck3ee/73+W7b73DqrLksxm3PvI8d9oj7ty+SZon3NiZ8OWP3ufv/ae/iB6Neff4hFffeIoxlrXraUQVEaVzDuE9oyLl3tEN1t0xR7MX2JWfolKPyCb7JPoTpOWSBX/A2++/yk+++Lco1ZewOKxd/b/svdmvLVd+3/dZUw17OtMdeS8vL2c22WRLYisi1W11S3Yk2I4dw1MiBJYQwEHiIED+hzzmJXkMnKcEyIudDmAEsAzJGqJuuWVJPbEnNsfL4Q7nnmmfPdS0pjysqr0P2y1ZehIF3AUQ5/Kc2ruq1t5V61vf7/f3/eGD2pjjGpFuXIW4xc7+E4S4ZnV+n2euSU7NRxhZY92cxo/RsmRnNiFwj3ExpWuXLJYO28Js5pjNJPX6HJNrlPLcuCl46ekZMtwENJeu7OKdx5iWclyQ5TmZOuCJa0tm45/izuoZHh+X6PwPiV5SVY4gIqp1hPU6+SrKnI+XDW/FyO1M8/7ZOYXMmeU5B3ZNXa04rxwL5xJLFAQ7URCFxhFZOUuGwBjPtfGYB11H1UZyo9gRklJlyMkOTSeolseMZEOXR2xIGSUxRGz/fex6I2nj040kaKgc1MsT/uX/9r+yXJ9y7fIe5d4+5WQH255xcvcOmdS4kBqVZpnm2n5JZsZopXGtpyjHjIoRTVujhCLKgJbp6eK8XqGEYVoUxNDiQqT1lsZZrPVoMYSyPZLsHo2/2IhA9J7OO0CRGUXrIzIoRpnEG4O3LQeTnEwF5r1hWgJ5adjXgdPzjq6GnVlBpKPtOooiQ0pNYRRZrhAxsJsburajC57CGJRUaKNxjUdqjesciMjOOCfEJJvXnSPLcqomElEgFEJrVDnjXE6YCctIBmTzgJ3QoXMw0zGHYcV6WeEgxZt0lnGpUQj2ck3eN5Ldsgqp84NWkmgyOklqo+U6PIK6A1de4cRc5XH/HloJinxEG2ZUt/8O6sOvsOOOidymahXju7+H1yPKcoLqWtblVdzK4vIMsik+20kikjbUKueDBxW3HisYhTqBB9kv2kPeUwSJTAVGMiJl5PHbu3zh9c8wHRd0YsWt65cRPuCAX/zis3zlN94hmoy6E+y4U2p1jdR7rh9iSA4fgIDYsCVJ3hpSrRPjhbjAvwxGos17DSX0Pa5g6I2XjNtCDAbygaEZqJ7hZy8zRbn1+gxszSeAQGQwsYtNimb6vRiyAIYysz6kM1E4Ax6NG7wjNv6mJK+lUxzM8sN+0mMAsMGTkj7EM/SAq5+bT4DO2L8XaR8qxA2w88Mk9fuI/fxBb+MfjOXDZlss2M/NoO0N+xzS2oegzG2blz9tfErAkyBExQfvv0NwC9Az3nvnXeqTCtfB2dkCIeZ8+PZbPHPlElcO9lG55sr+lGc/9wI7V67x/bf/hHVTU+QFy6qi8gFpJEaoPhciIpRDakHjF8xXNUfVR9yMl5nYnyXKMa7QSAG2niJigZQBYo71giBzhAyYRFoSSS09vHfY1iGk5ursNpc++wTz+UO+98636aodaml49/23ePvOw+QjGnmCPMeYEav1nKy8SmdhvawRypCXhlde2uXWYyO+92aF8xOyMrC7u+bWtT2m4wVZtsPzt55k2Wi+884zPPfclynf+T1cOa/+jlEAACAASURBVMF1C1wbiW2D6sCJAlHX1C6wcpHQdXz3wZpaCJ7aG3FJWTph0bs55XTE2VmNVLBer5kUCuWTT2ziDU44pspA5imtQmCYKo0JkcMGPjg7Zd3WXFUtMyXoQiD03asDijZ4bAipVDpYjNDcd4Y1iaJtfeSZ6oTHC0G9OiWc3eP7coaZzWisQEQPqmZ3MmNSSlZVx97BLmfzJV0n6LoVIYAUmrqztHXF7nSCKQqUb8l0hrUd3qXeiIvFiulkAnR0bYf3oW/w+Wg8Gn/+IUlxF1EIok8maRAElUC58gJfZETnGJU5wXsWTYeNkUILlBHsCcVZ3WHnkVmhmJQZzrU4D83aYttAMdLgLLNRQdAS27S03lO3njzTOG83pmhVKLplRyRShwznJF3UNC4Z0EsZyKhYd5rKzBDKALss1g94+OE7KKVpmkgXItMRrOuGMtfkWcZ63RKVpK4bJrMS4TuEs8SoGRUaay26yPBeQfQIVVLNnmBHvs2dxqBvvEj94AEhu8z68ufZv/sbzM5+CyE7bFYQixKhJELm7Ndv05nn6KJg0n6AnT6HX57ir/wUAUGZS07WkXD+Bs3keRarjyh2J32VVFpYh0o06BdWGUFGxrOC/+a//DkOZiWBgCcVw1TNGi0kV66X/NznHuMPv3kXvXuVbnkPdi4RZJYYpziELPYAIV78d0w96zZSoRj2vlmvf5zciEkz66sEE4j5BOPUszVRxn7fA8DYSm6bVi8DEzSwNP0xbDn1gOiDQhkkOXpQQw8whtiMYdcbqspfYMBk2m4A0Fs6KJ1jn42w9S315zpsNwC+HuAMnm4xgKtB0guJNQr0rWNEqgC8EJE1wJ8EkHvjSqD3jm0YwTh0iOkrAfu8LZEYqxgFIqiEedkez08anwrwJAT84t/4NarFh/j2GCOnKBVBapo2EoVmdzZhZzSmzASf++zLtLGjrU5ABiKKq9ef5M279yB2aXKkQgmB0iFNhJIoqTg9WfD222/x8osv8NU/+tfs793jmd2XCfY2K3ePmXwcFWdcvvQUKu9w8i7BPkXs+944BhNgRGqN1im6PwWxWbQErUs+uH/GSJcEW/Lt7z7g7FxgzB5V5zhvjzk8LhipfZwvOHygKIox3grKnZyrexmXdmbM129St0t2d5b87OemHL4TOPyT97lz74x3D+cYrnLzl55jXESCdCxwzLJ9xrlgWdX4meTOxx/xcbPi47snzNdrhC74qc++hEIQRWCOpHWR/SynDZ6FChjv0eN9TqKk0JI3z4+QInAl3yGYiDOOzElW3qOio1qveN8Jagnnq5ZsLMkzhcNQGIkMAWstXgsUCi0Vvm2pvOC6glVUWBGZ6shjhWSC5aoKjI1gfnxCXJ0Ry4xF0Bhh2J9OaHzDqhF0x6dUqyV70ykCybrpEEEzKTQ5gIssqy61mYkBax2F0RQmY1232NailEQphRCSznV/yVfDo/FXbvRP4DZGZLrvoj14F+kiGCUYKUkrM0LrIRsxQ3HWNlRNpMwkhQ7sjTTzleM4CFCePS1wncULR3NuGTcZZZEThAUlwEW61mG9wPsOKRRKKXyMLI/X1OuO07VlZ38P5zoQyVM1GeU4W5ONZ0iV0QRoY0r37kRJ0zq8D2SZIDcZrmlR0dBZz3njiFGyqgKXSgkh4mxEaIfONLHr408kRJ/8W53KmJgWoRW3r+9g7fuUhWAtc0aL79DOnuDh3uvcqL9CZRXOB0odWJkdGv0MZ5f/GubBNxmHu3x081fRP/iXuLiLdHMm4YxzeYPiwVcx124zn1cJCO4kFmVYroMY/DhpER7NDP/9r73OC09eS3lCpETunemEGAIiWIpC8zd/+TlqB2987y52pci6h7j8sV72En3445Ba3leIye1iP2QcbSr/BlDx44UpcRuamarYtn3rBjluwzoNW8YB6rBlWrjwtuJCe5oByG1YlgSJNgrasH2P0pJM17NmPw56NqV/6XyCiH34sdhIielc46ZVXQKGw+UyyHhw0fsUAVQPHJG9kX04oRRBAHKToD7kZ22ncKgqjMPuSdb6BACHsNHQs0sRNqbwCAjfz6eIad8iyfB/2vhUgCdna4RW7D7208SwJISGV3/ul3jnjW9gjU4afWdZP7zDzsww2bnE6vRDfDQcHt1FlSOefPyv8z/+kx9w8vER/+8ffp13Pjrq2+gItEqVH1mmkCpVgx0d36d1njK8grCPE1hiXUMUDWXhuXXtVmoBE2+A0MTokpnT+x7Yp69cJIUvhuATgJICJSXCC+7ePyV0gvNTwcP7lqyMFKVkNFY0bcZiYThdfsS68hSjyMOHc/LSU5Q5lw88P//qTT56EPjskwWxvsof/e9/TH3W8uH79wkxIk1G+WBOmXuqvR2MmCJziROwWjX8wUd3Obx7zMhrRjrDFBIpBO35Gkt64p2vkwdIiEhZtRxkkU4rjpuWVmqUhqf3DYvaMg+OmpxSS3aU4KQKfOwzLl3a4UoVqX2LVvsE4L6WyNDwRJmzjo5FLWm9ZO49U6UIIWKBcam4UkTatafAcy47zleBrgh8iGJUFOTeoX3gsWzEyDn0UQq9zIViuVqnMm/rGJUpxyaIQF6M8K5JwCg9AmH6djJlkdO0lnFRsGwt3jqU7Ld7VG33aPwFR4xgvUNEgQ8eH8Nm8ZEGRJR4PAqJIjAuJE4adFtThcBZJdkpJUZ49seKeW05mntUzJgaTVCJUWhbT9ZZJqMcETW2dbQ2UFeOzEik8rSdIziPjRB8IIbA6XzBqMiZjHPGZU4QKdG/WS8gmyGLkrbtcKcfUa+WaamRiVEodGT3YMz799eUWjE/rzF5RqkCtfeoumVcZhSFweiIV2AwOB+J0ROEZFxI6ssvMI8ziuaQ1e7zxHBE3h0yjYLKBVR+n2ZVIYtz5OJDGqaE43dprr/MKr+BGJ3QzteE6pCi3GF++H3k9DLCt0yX32JUNrQhsr76Rar9l3Ayow8W2oZLxnR/3tkv+ae/9jqff+lG6nCrQKKwUpNnikt7EhE87CWM+uv/6BX+1Szn93+3JnMf4kIHKkvvGgblLD2MMoRGDjLRcDvpaaZt6vggaQ1AJP1u23C+Z4DilluJmwq6npmRg+xF6jcqhsW/f8u45Xo2VWOJdOsFxX5Dub3nJWAxvD69IGwO8UJ20vBeIeUwbSgyQIQEWMJwcD3DJC5SaH3wZgjDn/v5CCJJicO2G+pskEPTXMZ++xgvVhgO7FMPGPtjCttD639uq/SGOIfhXNM7DRES24/nJ41PBXhazk/597/xfzGazsgLw+7l6xTjXSazPT77mX18hPl8zq7+WWRX8+DokKOzMx4en3B49z4uCNAjnr75AvcO73K0qFCZIQZHrg3TQtL6Fmkiu7sFIUQePphz+4lreHmGVy8QA8zKGV2okHLMyJQQHYQM7/zmWC/247n4u2GWYwiUxYgXn3mef/Wbv8mtSwfIUDA/dEhTsX81Z3b7EvVa8c17P8SHlqAUuzuC0kzZvTxlZzIhLw/4mWevcdPkhMOM9f2Wn3qlBDw/9ZrHNhWqbSnyHBM7lJC0MXJ2vMD6wFnb8vj+ZV7evc6OWKOiR1qw0dKEwGyikd5z1jZECSNvyUcFZ4slOnquUNEEjV0FShOx0SKIjGyL6QR1dBwQOek8Rw8tSsI00+wbjwmBcyvpXMuDriNYm0qwA9Q+sIqSzHvGImBX0J1HlEp5JMZ05D6wrCP3bEuGItOSLHSsWse01FjrmI5y1O4+zaLCaM26WfH4YzdwfQua3dkuuVRoLcmMYm0dUl2IbHAO51ObAq0UeWao1vWfWZr6aDwaP2lEItEHlFTp/h9BGYWKEZNpiBJrYx+/IzlftTw8W3OQa5AOUfZSiAUtBHul4LyNHJ53tOPIOJd9eF9Hu/Z4Hzg42CGflOimxXaedd1ijMT5SKYEXd1R5Dmr2tM5mMqUZaYIVE1LkY8hL1D5GKkEzjZ0rYVmhdIS60CIBOjOKsXKCa7MDCa2WN/SIpFBkLuIFBIRQuprKSWlVljvsU4iY0rut2pE11YU+QGRjiAyrFDMmxXCjBitf0Q7e46uOqeYv8nq8V+h+/ibtOPbgGe6fIdOzJjc+Q3swYvMTt7E7uxiQkRcfYnz7Drz6W2Ishd2+hJ3MUhEyUB884ld/rtf/yJPXd9L/d/6KIGqqVmtlmmhDXB8dJRiW4RiZzrlP/2l5/BG8O3fWjKRCxbhMnIAM4OU1icqXsx8GqS5JNOFDZuTvjcXHsIjm5gKIbjAqFyQtTYcUF8r1mc5pb/AYIYXF95b9CX7AyGzJaWGKr8BoG3taxuJjk8cfI8JxcbaIPpTHsALhJ7hYgt0+p2GmFDb4MSil9I2m4vtzoc2NkmevBD6ORzP5sKLWwCYMPCGMJF93MDFljapvU4CXipsuLcN05dkw62fK25e+JPHpwI8nZ4v+b//9b/lmdtPUGaG2XjM7mxGPp2SlyMyk5Mpzc0nnkMEz3y1pG0d41Lz3LPPsrNzhfvvfYO7d+/x3R+9i5ctpgBsxGi4efkAa+He4i5SeIKPZGLEaBIYjY+ow9fI4mcp5A3O7A9xfkHV3mU2usFINyhZ4F360gw07QCWhotESklnA95ZclNw89pVMlPy9W99n65xVCtH2zqaxpPrY6JMqeR5Lrl6c5+/8YXn2Nub8sHDD9AjifTP8tHXH7L+nW9R5J7p7i5msaarKopVhSoE7cqDc2TCIjQ4JKaFNgSmSrM6q0HBqMzoWo/3ntEkx0RLETSttRQeoo2MpWDx8C6FSKZKbIOJ0AaNsS3XYsrocE26GKwQmCi5mUVaJbFB0LYtvkles33v6BD4kHrG5Xi8Tqa/TqTYgolITwBSDMkhEdEGiJ6ZUMhM0XbgfaSQEhtTpIHQgpHJ8DrDyJYQOlSRUxRZiklYL6i7imI8oq5qdqdT1p3DOUfnLLlUCKmwwdJ1HbnShBDRWiGlZGg++Wg8Gn+eIRAIoZBS4BDoKCkKA97jXKTuWjIhkCJico1YdVzZLQhtg1GCXKW8n/M2pEojrdgtU4Pcee1Ze0EhI3kW0RKqWsDJOTvjnPPlmqZz5FqhlERGwfHpgkBioiKQq4hrGiqhkZMRKhvTlhOkLBAxTxJFfYqrTlmuOhqX8qZa58mV4HzVsKcDZ+c1Ukl8F9CZwCDxIUnxwjuCtqhM0xcbEkJESom1kuLDr6JcTXPpNfaa+8SdfU7rnAPzkAfhEnvnb7K68teQ+Q3y9VusypuU+o85P7sPcszy8ANG0z3G7SHh1NOVB6zHN3g4fZpWj/v8Sc8g1MnYBxKEmAqHgBdfusY//a9+nst7Y7xLsl4dUwHLelFRryq6Hv0uFguuXb2Oty3HJwv2DiRffv0JMtfyzd/5fWBKWmS26/pQnr8Vunr5qIcMQ6bRYDBPZErKNhIXwhzTjw3M2QKGkDKTtuGf/bYX2Kphz5sogo3sdEHCG0DQkK2UYBab9PJeakT2MuSGOWOj8W1SyAeJLPR+qbCFeKL3GiNkD5LClj0L/TnHcKFlzAU5UCR/k7gAXsQgZfYZVVGoft7D5uz7yM9PVj8OUmlMWWSRCBJ8wnspBqEHWkJuPjmGQM8/bXwqwJP3gY/uLvH+kJPj+2Tnc55+/AY7L3wGoSKz8ZjZpGB3nJMXU+aLM4LrKPIpUPP2D36b77zxBlootFFI6ckUFKXAaDhaHwEZbRAcnzRkWnNtX3Hj8vPkakKhAyEcs+Ieq2XDar2itRVeSGbTBUpOthUGPaIOIcUBbDRioHOOh0dH7E6nzCYzPvvcU3zjWz+gXtUomRp8VmeWd360ZLwryQvFDoa98R57u09weX+PID2+afDuJqVfYesFOii8XOCWFaHuiNYiFZQq2eByqai9IxOQZRC8IdOKW+WYTEIWBXkZQShCDIxGBm89IoL1lpEUrDoH+RQ8NG2D0BN8iDQ+EFVGpgRGSmxI8oPvuU4jkmk++kDtDVdHgaruUnqsgtY6TDDkwmGjwAWFEhFCSIy5EBBUurCISOXpENTWMxWKXHnqoDEIpALnI12MLOc1nVjgYqCuO6SAw+NjqqrBR89qvWQRamQM7I0naLmkaSxSSg5mYx6cV7gQU4yBUilbJ4Qfi7t7NB6NP8+IeDy5khit0QpcDDQ29M2xBUpDcCIVJkTIBNQutYPwwKjIMcZzsuiQIRnQyyK1iTirHTYqGh+ZqEjIINQeV3e4CE1jqYUjzyB6T5Yp2s5xvqzRWuFCRGtN8B0TEVBlSRcCDkWhFKFraNoWEWEyyjA2eZ4KbXDeUSgwSnOyDsQgGO3eQIc5sW3RPpmHfQRpMqJXNG6NyQpa7zBFTseISl3hcnnI8eoesnmAO3gOXd8lL1ZcjyvGU8HIv4t0DUf6MubOv0Vc/zzlx9/H71xnNoqYkaG+9MssDn4Gqw3RB/CkBrAxpsKgoWMuPWsh0kL60z99k1//L36Wyaiks+l+tY6RzgVqGzhf1yzrFiUCuRDs7u5z9/iUECJN0zGZjkAqXv/5p7DLc77+79/BcwWhNMInAWhwIG2Uud54Iy7GcwNSqH5RjhvVIm6exzdQpl9V/BazbLoR9xVybB/eB9Zko4wBA7ciGSin3t9zQSIcLOKDB2vj3e6BxRATsEVOA7jq75Q99TQY1gfGRg7RAPSVgr1cBlsyZ0gaH9bW1HJGbACTjiSQ1F9lg2dpIzNu9pFYo8CFz374EMJw1On4FLE3ooPyYtN+ZZOBNWRq0Z/3JuvwPxyfCvAUgartcN4j1Zj29Ij12HH2oOKjBx+xv7/HjasH7KhzZkphxmNmu5eI0iBsjWhGKDlCSs3ebJ+ruzlaBdYusO4c501HMeoYTwTdSlGMS67fnHJ4dMIPf3TE/nhKkO+zd+UqQnW8ffcPePm5zzPOnqeyU7z1G3ovJboOXa0H3TZ9OXKVcXx6xgcff8grTz/HlYNL5LlhebbEmIyuqfE20FWQ5ylafhmWPHhwxPFJhw9LllXHqrrH+dm/4doDjd7dJxSaCkU7MmQTxW4mCdEiHYQusSS683TW4/DsSUEmdepy3jm8lHS+w0hJ0zR0XtD4jsorOlmgVSDEwNw2tCGAHiN8ZG5bZiZD6sh5bVPfLQSyL0FwXtDRo3khWHsHUtCIjLlvqDrI0egYyIVGRodF0gQYAzakeo/o+4bFMjVL9Tb28lp6nvIioiMYoahjpLWOVga0S82dq9ZydrrgfNngYzJ9Xt/fIwZPAOarFaeLJVIpDiZTbLBkWqO0IjhP530CgsYgGvuXdBU8Gn9Vx3BTXi479mcjfHAYZXAqUNWWXGmsTf28MqPIdETJiNQSLSQ+OGLQXN2dkpuKk0VL5cDotLDNcsm88ZSiQBhBkQmMVsTWJclBSmQMNK1NfzMZAtmHVkZQDiciWhdk5YioUgWgzmBZpxYpOmrWtaPxka4LaJXMsrFTlJlnHSWjSYnOc+zOLdSiRUmNLfdAdikKxjnWrSPTOc6D0prWBrxtaEYz6rxEnnwEZszUHTGZtMwP/jr+/C5niyOay19ieviHhHKf8dHvQvchRuacFRPOn/tVuny/5xg8uKGNSIToe5xyYfGEHlAIXn31Gv/477+K0YKua9M9PEJtLZ3tiFFQNQ2ddeAdHQGdGfanJULlCBHx0ROdRwj4/C98lsP7d3n74w6k2qRWJ3w0AJiNQMUnjTOJ7RmOMyIQG6+S2JBM21L/4ceP52xv33Xo45bw0Za92ViH4kYn6S1HIZmuN2CIIbkgyVYDY0RkKDcTsMmegtSQ90KiQPr7oMFtANcgIyamJ1U9ii2Y6Q9VBtGzUum4k9G+//+4ncetBWpgn3q2aAOiYIgM30iGPdMUegZqSHgaPomN5HgBNMY+2PSif+wnjU8FeELIVPEQIAZPTQBjkMoQgqKximUd+eofvsEtLfhb/+hXuHTtcU6O77NuT5ns7vPkU69S5CVPPfcyv/KFL/OtN7/Fb//J1zg8O0IKGJnUYXtnJ+eFZ6/zpS8+zY3HXuLS5Gc4X36DpXuAP59wePoW0/w2q4Xhgwdv8+ytF8mLgBApCC1cIGFDjBAGwSmijebWtcd46847vPPRHaaZ5tUXn+HfHP476trhXPLXKBJw0ioFNc6yPZqV473T+yzqY46P5hT2Df7O+BVWrScXChkcRZYnnVcpogsE16UMqxBxUiC0JvOaTAicT0+nGQJHxJCjtGScGbAOo0ommSR6C0FS0bFXZpggWaiI9J7LwRNjatr7WGloFSg8XgYCIuU1ecuiqRFSUaoO5xzvdTXajJGqowkRFQVLPDhFqQIr72koWOLTzSYIZFSMYsdEKKRKM9oFaEOkAWoCI5V682VS0kaBqi1lKcF7lJDIGDk+X1PXlllRcGlnhu1aTuZLynyE9R0Oz9mypSwKjFY0zuFDIMszgvep1x1u87TzaDwa/7ERY0yZSyhaD3muWdYdbev6+1qy50ol0ZlCSJf8HsYQokM4QYhwtgzkec7eRGBXlrZL0SqFNtzcLWhDl8B+G1msHSMdaTqLjZJSS7QStAjaZUOmPNZl5LlCRkGe51ip0ErS2haBAdswyXI6L7Ci4KT22K5jr1BoKVm2gfL265j5tyi9xJs9Yljjrr5MWH+MvvQZ6sMf0BUZkdSKJjMS3TPUrQ0EHwm7LxAe/JDx49c5kzssD15CTg6YfPCbnD34gB3jqaZPMTn7PmF5j32WuOuvcH7tC1gzI8gxTigQERlDYpeQfYVz3HwG6R/px8DCPPHMDv/wP/88SqXwRh9jYtRbhwuRkCJNWVcdVV2Dt+gYyXNLyDKkdASZDOTGKCICF+GLv/QqD7/yTc5qhcizjbQVLwQ/bqMIxObAUkuYtDinJO8BdLGp+towPOlM6EmgjeyWwiAhCtmnim/3uY2njH3mktiAGdnnXUl6D1K69SKF6Mv5+3Ghyi32BEEkRT+FoXxu0OqigKGS7xMS1/Y9hkrATTAlFzL14gCcBANTF3qfuejPbQByqTmx3Bz38N4DoLrIj23OZQjFlAEZuSBjxj5BnU3LGgZgJkTvu2KL8H7C+FSAp6EcM5LoX+sj1qWkZyGTXlqWBVpqQvAIFKNRht2Z8uBezYOHh4hijFCGp576HEopTucrpqM3EByRac1OMaPTDU9dusoLV24j5zN+44++yuuftzz74mPEruVH771Lszrm+Sdf4u3vvsnb34b9v/caB5cugzRoqdIXTSoCnmF+k6HNE6Jgb2+Pp+wT/ME3vs6l6Yxb168xyjPOKpcuJCnIc4EpBAeX9jFasLc/5bVXvsydw4/57T/+mPv3LS+NZzCRXLl2CZllBJnj2wbpoV3XdJUndCXH1ZqxyNARhNGpR5WtUdmIYD1nLiBcS6E8hU4eiMlYUKjIw/madWWpveMbJws+M9KMsHx3XfGjWvCFQqKCY6rT08DIWIpRQaYcTYycW8NJ3WFtR24yFqsVNsAiKmxw7MRA9J4qQCYC3sN5gHUQFLGllgEbwHvBNATaKJhLT5ZCOFj4SBsjhQgECU3waKMxIlJqiVBAgNZ6rl25jBaRs1VFa92GGh4VY+67M8ajgsWyY1234B1RWLRUCATOebTymxTeR8Dp0fiLDCES++mJhNoDJhUq6BwhHBJDEGDbSAgpKqOxkUCSq6UK+BDxRrJsLAJJoTVFpjGCdI2EivnCoZTESU1uIsEHQKG0xkdPkWnO16mAIleCqot472htpG5rLj22R+ccUmmEitjQITAUucFhMSJyeTcnNyV1ZxnFBnn+LjIzuK5E4hhJh3jr/yEb79KtPsDEDu+T38p3HUKNQRl8rIhCEXEoA3uFJzanuMpRq4fEeoHV15Cnd4jilF1GNDdeJ7z0qyzG1/FSIsNQFRXSwh8jaWVNtomhN90AMGIYGuFGooLJyPD3/u6rCC2IztP5gHWeZddifcqDG7KSuqahsxYRUqCnayzHRydIDTEKggtcvnYV2ybfjio1f/MLO3zld8+xQSOF7IFA3IAJIWSKSxgYMZFYFkjsRuhRkUBtKvYGtmYTetnDJpEeuel1qx6Axc12favfDeBIN7GeQYlbqSrJaINUGFMmkhAM/d7SS5MsOLg/h8iAjY9oYH0YPFLDhdD/iFvAN5j2hxjzDe8Ttx6nKIYmwOmPyTefYjDSQQ9epwtzLDb8Us9Y9UBsiDyQoWet+nkfTOdDh+IeqHmZfLTpbHoDfp+3EDdz+JPHpwI8DXixyAu0aVBSsDseIXYmHJ+VKKVApz5L1qUE3VE5xtqOumk5my/Zvz5FKkE22mO1uM+Hb38b0ax44soVnKjwqiGKjvtnx4R3LE39DPX9yLXZ8zh5wnv3vsfxaceLT32Gvd3rPLzzHapjy9d+6/+knOwgdMlkZ5+d2T6j2YTLlx5HKU0IjlxPQASUjCih2Nvd4cWnX+B3/t3XeP/O3b5yJbFWuVFM9yUqFyyXKw4OHmN68HPU+lmO3B6fefk1nnjmjOv3/ph453tY1VDIwAd3DjleVFRBIH1gahRIybKqaOuaUZZjs8hIA+uGtoMaz2nnk+dBKQKCPDpKJTkOEWkdJkY+dhGZG7596gg2sIyCTEV+sLZkWjH2gc5LDLbXllOA28rDIgjGBIyIHFvBIggaqXExYGLqhTUWkrGEwy6wDBEtBG1M2SC5lHjv+TgExiIyEooYAx0pe0YDUnqmUdEqT+EEVkuaEGhqD7sjxuMM6xzlKGN/d0bXWYrc0DQ1887RRIcIHaNC44WhbQXWeWQMSFIiMkBmzDY07S/vYng0/ooNIQUiM2jnEUawqGqmoxJl0pOx0YKApOss3kk6W7NuHEoEvFd4ArlQnK9rgo9IpSmMJss1y2VD3Tp8/3SuIgTf0QSwKlUPGRlQUSGAsZY4ramsx0ePHnwmPlAaiVHgokMLjRKQF54gDK10zAqJLqd0e0/jnv3bZL//vyDtis4LSGrO7AAAIABJREFU1M1XyOY/ZNHuYq7exsymLN79LrnKiUIRoqVpWuR4RN16lNIIAS5E8rMf0TlL1XrYeRZVHVK0gtIdonav4a78Aovp81idExLtjIiSIBwbASiGDZsEaa2UIj1sXwxZjBtlIPDlX3yOg8sldedSkGnosJ3F9YKV65PPtZI01tM0LcGlqmIpItG2ZKKgLHLOqhWn5+doAagM4xTltSd58cb3+c6HjmAyVB8XsPEvhX4B78FDDINMB0OMQjqXTy7Q25iCnhGBDbgZQjYHb9DgJ+pPnyHrO/aTtIUrW+/QpmK8B01p+A1zk8BW6A3kaiNvxZikwE2aywbUXGDW+nMb5MWN1LiRAYdz/LFrCLlpCJw8VDH1SumB2ybYMp0AGypMqB5kDaCUPg5iy1htuab+bxuw2c9uH5wZtsazzeu28/Mfjk8FeIoxIpWkGI1gucATKEY5+9evcnQ+Z76oabpAOZ7hTx9ijGE0nnC+OE9VLiojopBSYbIxIBhT8pnHnkaNdzhu3ufjozsUk5ym8txfHbF403J773lknqHCDvN5C6LjysEzlPJx9ndvIa/OaZan3Lt3jwfHZzjvMCbjhVdf5b/+b/8n5vMP+D/++f+MkQW6GDEa7TKb7TCb7ZDpEpMZ7t97gJGC6UjTWoOPnv29A3ZmmmpZcXPnSe7fWfHP3/0K520k5jNa53iq/Zgn3nkPOX+IsYFFDOwqhQuWBZL3WotyHYWItFJzJyzJfGSmIns6SQOVzzh1Ee89e8bT+kjlBbmxTLUGAkFEbueCmWxZ6cBdJ7im4nBtsE+kFpEHMbBvJJMY0Sq9VnuYBIESMiWJy8iMgMbT0X/9QmCMhyhwBu6vBdeLjCxaxiIwUg6j4dQLJn2irooCJQJVFJwTuAIEFZgi0EZwEhzTLKecTnnoLWVm6NoWU4zYFSMkgtGkxHeO5fmCXBcYKTFa0njwSlJmEoIjRIOQirbrEpD6M0LRHo1H4ycNKSATCpEJatvhgkxVP0Gw7iCPAu8sq6qlsmkR8i757hrf4m3Adi2jskAoldiiANFGjIy0Ovn92r6t0QAcutaRZQLlAnpkWLUeITO0TxKNixEfBVlhCEEwP50zmUzxGGq/ROYl7ugIGS2CDv34q3hXwfoUVy3Jc41/6pdpvvcvQI+wV18n++B34fD7LLLXwExRzYJlK7g80qSEUIULYLRCqAhSEYJkUVzjsvuQ7OwbFGZCe+NLzPf/Pr7YBdG32+iln7SEuWEl7lmlbQl5moAk7yQtqa+KGpgTATdu7PC5Vx5nXbUQI0ZJou/loQGriBScrICuN8mHkJK3fQBjMk6WFf68wmSa6nTJ7s4MLS2SiA+Sl5874M6Deyws+CxPjFDPBiVyQ9DnBWzltH7RHszbm5woBsN2nwd14RFOxL5SLcoNeIlR9L0PxRZYMABIeublYnWeRAh/wawuNyBq6wMSfSzGhfkmZSjJ/oE39CrhxeMLQxR3lJ+QwSIpMmAT+J7OpmeP+hrBAbPILTimn4chdb2fhM15DvM1INXN3IqBf4sbOfTikUbSeWzYwR7TpYq/IdRUXJiNTzvz5APCBdaLNU3VULeeVevIlivW67pHmpp166BzIGSiVknJ0M5brHNEIlJqhFBkUXNj/BhqPGZ/NGYnu8rCn/JgfRedeebHa9xU8tHdeyyPv8WDozu8+vLPo2Tk7TffQIspe1dHWO8ZzTpkMYXYcbC3w2uvfQlJ4OzkHt3xMUerinplOa87Vm3HeDrmb/3df8JPv/KL/H9f+wN8dcrNmweMyn3my4qmbrhxdY9bl5/i/uGSsw++SdVB28HxwnF4+DaLl17jF159nfjuG+jFKQfe0nWWcTSMreNSrsAqxkQyIXnMR468oJKe6xNJ4yO7AfaCxMSI8o5cpqeJQoHvK98yFelsYKojoyAphGJHp/52IQhkDCwtzGTqs1QDzsGejGT9l0wEQSsE6yCYScFIRkKIrHxkrNLNahk9JRpB5G7jeaGEPdJFJhG4GMlEQAvoYhLgJZFLQpDHSERhlKJVAoJC5Rmd1tRNzWyWoTF4H7CuoywysqxA5Rr74CFaKlx0KRRzscIkxwlV52icTzdRJcmVwrpHhvFH4y82vI9UVY0nsqxaApLVYk1QChEEXbBUVUfjFYVWCJWkiiJPC4wQiqz3+TV1A0JyXllMFpgpkEr3vqWAQNHULdYGdsY587VDlXB2VpFpTSs0u9ol1kMm6WO+tigk1kfy2WWKvStkMiMb79HawL23/oRsPWfVPiTvTpmUBvu9f0FOQ/3g20naufP7+GyC62yqTn77N8FMmL74BboPv5eYit7/mRc5XdOl6AQCe7Mc49Y48zz+9msspjeIUif/zFDaHvoGGn3QMCGtakNpeqrIiqndB+n+sDFnb+QmgNRm44tffCbBigjEQPCSGFJT2gFMCCEQMjHdPgaQER0kUit0ACkiBzuK+bqj6xxGCTIlepN/xIWIGs/47NUf8PW7BdH3PhqGhXzge/pS+B/zz6TFeivjpRdcbGQiidFfwDZyA6o2BnPS+SV3uNjYlRKAUsM3NN1Pezap3/sn/EwXGZctddYnjbOtWkx3bIGXPQjpQZRky7jFvkxvaPArI4kl63cjQtyAujgY0oXugXMKqEwerARyBGozD7Ev60tG8aHv3VAJLzaAK4oBQm3N9cOsegTCJ9AWVI+weokuDu1xRCSGoRryJ49PBXgySrKfZ+jlnF0fcXu73D0+4YM//ibH52uKcsyHy5Z6scIgOV81LM6XONulG4vQGJ2hdQYieQCG74j2GftmSiz2GNuWvf2bmMLxtbvf4PRkRVNLtLjEzf2nefLaq0zyJ7kXfsR0Cl3hcT6A6Zh4MMIznk7wvubOW1/le9/8Knt7+6i8pClbstWaqbU88eSzPHnrMp2Y41xNlnsef3LKbDbj5MhwOq/IpKbrHB/fO6ZqI54SZ3P0yPC3/8E/5JXPf5mr+oR7d9+hjB2ibSiExDqXfGDWkSlDKUBHx22RZIOzLuIEXBtJrPBoF5kpi41Z6vouwLnAKgpGMZBpqENAWc9EhvTE6A2F8oRocVFRqMiu0IwIPaMU2cdwr/N0QpHFiLKCK6VnIiOFjIxDpEPQuMjKwUikC//pqaK1gStDU9EQMAhGGrIoEzD2Ea8iYyJKpGC5Cp/iEYIkNwadKRY+VbvMlxWz0ZjzxYJIJMs0MUbG4xwpBDb4vhrJk6kMj8X1N98yT20nPJEyVxj5SLB7NP5iw4eAbV2qTnNwXnXsTjLW65ogFCJ68jwDLwHHuvaoLEeGHuQg6LxgPq/ZKXOEjGRKIpxnFQUOBc4hJNTeg1DsTk2yLUTLx8eQa83V3FEWgdYLOivQCnbGJZdyQxcFq9rhEEiZgd6hdYYoFW1QLKxkPL2KOTuhbTuUcBADU38EV69TnT6A5RotwYZIGF9Be8+RvE4ev0MAjFKgcrSeUDdnSJ2TZRFRFpxc+ccszGME4YgeeloigS4SnbFxGw6x0zEigtxKUBsQNXhdBhDFNvBRRJ68tc/Tz14nepfEGZkYl1T1lUCUEn0fHSFYrRqCAKNzgvIQPF6m8AGT5VzOi8Sm+MQYaZmWzSyX6Mkezz59g3vLu7x39hgqzzZ91EQyBqUFOQ52abFlQwYfDhsu6sJ/aY42YZbiAgyIWxlvo9elKdpYDtI7bBO+PwECNrtNf9uwV5vX+QvHNPxObPvLyXTvFAzyV88lya1XKsGWwbPWH9OwX9G/q6DPZYIQ0+cTFcQoU6ZipPc/+S0p1WO7BL76N9x4owDhN6zbNviyP1N5gUGjT1MfCg7oYwo2k/NnAyf4lICn0WzK6//gP6NZntK+8W1u7l6jaTu8WzExQFihnOXWlUu4YJlXDQCzyYQ8zxmPRxSZoixzpDYIKdMF7iNCWnKd2qtAwXQ8wmSB4AxNtSK6NZVbcuvxG1zZeRbX5hTZGJ8DyiI6R5EHZpMSLSV5nvPRnfcgetx6TTGb4ZVByIooIO86qvU5f/LN38EHjatrJpOCg50Ju5N9JmqHq/sN5805D09WfHzvIW0bGI/G3H7pef7ZP/sf+OLPfp7CaD769h/x8OAq6twzLnNs0yA6T+4C0Tb4mILoiKnS71rTUSjPGkujNKVOKa0tGmsFspBUziOVR0TFsRdcNZ57c8etnRH12iG9x+Cpe3bv3GlOBeymnqSc+46Z0XwY4SRIdAAT4f0ucCOT7GmJ6yxrBTYKVi7QhaFJdwJsuUgZTzrqlPkUIxOpWAebnhJFejrwRIgKJSQdYKOk9YFGRELrqVS64KaTGcE7ymKUemk5z7qxSFnTdo7xaIIKDq0iLiYJYHc65kFd0fnU1DnKlL0Sf8x/8Gg8Gv+xYT28e9bSWE8UqTKrmTdUnYXg6CJ0eHaMZKwCbRsY6Y6mjRAimZY0nScEhQ0RrQRKGTLlOVlYijw9yWdSpnDHTCGEYFIYgguYMlWleilZ156RFkzHGflohBUF5+sV4fFfJJ6+RWwtZQAXZQIpWrH32LOsqkPm73ydWBrGuWG6u4erOorxPudhTE3F3gv/Ce3RW8j1IVoHfLvAvvt7lGGJEjlIgXWBIhMUmaaKCmEU3tykVnub9G56malX35LXRFyQnvqHvLRB6KvLUphkHJrmCiCE3rg8vCailOQLX3wO8BidWA7VMzROSAKp4nlb2g/rqsZonezCQSCjRBMRKjE6XbVC6RSkO5uUqEyjfB8uqRXZE5/hpY8ecro6ZW6vIIzqWZTeCB02sLBf9EMv6cWNCknfgw3iBflqYIouLuJyy7jJC4LVBUACqdVUGODo8Ov+XisiDGnmad76woUeyMg4bNv/GD4bEXqzeZ9pNRj2Y28O73OaEuIZzPNbcJvimbZMUGJ4hlR1n6qu/SC5JT1zyO3aknYDWNvud1ttOESFDnPdb9PHNkSRZEcZxYXsqb7iMKTQTDmorvGTMPYnjU8FeMrKghdf+xLLu++QrQ9ZnVepbDRC03TpaUEqtBohTE7nHbZL1VHOO7SSzEYTprs7ScdF0DYNQhiM7stlPcTo+PDsAceLj1FOcevSjBdvXOEbR29x/6jixadPmJineOH5n8Z3DV1XU1cr2mbN6ek51jbk2YjT+TkChRItalUhpUcKjw8eJaFtGt784TvUTuLaiDE5oi7wOkMGwd1794mi5ebeTX6QP+Tk+CH/P3tvFmRJdp/3/f7nnFxu3qVuLd3Ve/fMADMDDEBgsBIQQFIkoeBiimLY5AMtibIYkkMRlsMOP1hvtt78oHBYfrDDtMJhyaHQQpFhUyYlh0MkaAoAOdiIwT4LZqant+qqrqq75nYWP5zMWzUUCIIPVICMPhHdXXX73rx5M/Pm+c73ff/vf+X6JX7+r/zH/OjH/hypBNqgePP2IfePa7RYUmupfWDpHI1tSXzAWo+zgQTPlsCqtawQ1l5zMq8xElueSG1xCEELD7ynbT1DqZg3HmUCDQl3lg2ZCNgG5+FUBfIAdxvLiQuMgFx5rBceWMupC1xOHbshllk3TvjNhWMvUYydY2I8TVDcrzwaYdsIi9bhVTSRPggBozrjN0LpLFGVDzGGQAs5UHZR/aKFra0hVjlaItjUumTxYEaQQKoTqrrGaBhkQ+q6JNGBwWDAKDeE1pMowSUmsomiEJNSLVaIdigRVtbi7WPm6fH44w3vPfNFhTIBjYrSsw/kWsfVbtNQpEnXP9EzGcSVtXFQe4UPjqA0V7cS1tYSrGJUBNa1xyQqthFRitM6Fn9cGWckxrFeB6yDSSZUQbFsNZkGlRt0mrPW29Tv+UXyl/4FzY0PISffZL22FGUVW19YB1aohtfYunQDaRQP33gJsNjTOQMDXg1Q7RIzHHOc7aCyPQZNiV3P0HgGNnqmnM9IbEBnlmBrVJqjaqgn7+Bg9+M0JgfXmZDDZlrfeEziSp+uXD9sgMVmBu+Yj56Fov8/iNKOjRPsE09tc+vJiwgOJR6tDOBQXlDBxfytoPA+xBiJECf74WBACA7nIhuoBYwO1LMlaWIYFjnHJ6sYESMtRsV8puA8UozYf/JZbjz8HPU8oXLbYAxnQZbdX12Xhn7vNzVmXT6S37SU6Y9JJ+1tUrnjZ+7zKXu6ZZOqTWeWF38WNyAQs47YgIsuHWYDQqLvSHX7dEbi9G1t4i992OcZqxUdV2zOU+i109BnSHWHoGOKzmc29T9sKgtR3fYdMTXNxfu+9Gxdv7DVEXj2/q9wBnD69yD0VZdRMlQSzpis0MGvHhx1L0EE3QHwoKN0J/7cjn6b8T0BnoxJGE8y2m8d8vSNG5ycLqjrmtQorG3ROgFtGBYjsmJA7QW0ZjmvaOuWfDTg+jPPo8yQgCYEi61KUI48i6xEANAe6yucVOTFgOnWkP2di7x3+DFePPhNnAWT7THc3SeoLJKsrgZX0i7exIkiKfY5uvMi4jTjaUZbr2nKFSdHd/nUC1/k7p0HOG8pZyUHj1aczmfsjS9zfFRx9949QPG11x9ydSfj1k7K+558iqeffYKn3vNuktzzxVdf5NrF61wab/OBT3yCwd51Pvv//A7lsuQzn/k1Dl77BksbOHUOHxyZ1iQe0kHKumowxFYOWiuc9+wOMo6qiqYJnFpHFYRMhEQ8g7j8QYugVEB5wYWoTVfOY0zMNKkdGBV9SQEhVQGLcOBi65WxUYgKrC18w8Z8JiORFlUIBXB7Q9NDHejex0G32nECbYjrFQ0UWjFNQELCwjv2B0OKKzv4eo5TDZPxEO81PJhjW8d0UJCq6C8ZFznjPGG+WGBSw2DqcStNUzuUzshyxWy1RBtNUWRYazHasFitzlZkj8fj8V2OyB44xmJQqWa9blhbyFPFIAmMiwFN2+Jqy0w8aWKg93AECF5hjCYYRQa0XlE1gVQbfOYZDjSrredob3+Fy9OU0UA4OS2xXjhrUyGMi4QiSxjuXKLOttFOyI++jM8vUHvPSEEjQtW06LTFWsHkirS+jdt7B8Xxq+x9/D/h5LO/wqRaM75yFUxCePiIrFkSvvKrhL1nObGGEUKrEpARPswYS7x3oATvW+oWgiRU6S7rdAvxEifEbsaKvETffqOTdrzfAKPIGnQzr4/gwfczu+8m5h5shVh5lmSaH/6hd6GU4J3bZAUZBGVimbvvysW0eJQypEqRJwrICa5FkWBCwIUIoEYXUg5PTjlZNxhjODx5xJX9PYpBgckGWAdBNMO3v43BKydcbN7kzSpH9DhKWqo3NoOEvhVKlykU+iRx6Bmn0M/om9Gbv89+38znXQpm3+6l90v5HiB8W9kp9iLsVET+HWKLDUKN21Yhti9RnQF8I3OpzfY2wZ49eOtBYRfXwOYTBnp4dsa69f6l/i2F4IWgPSI6vpM/A5kxoaGPSjjHQkEnI8L5lPGNz4quHU0PBEPoMp+6fMkgBOU356VvxfadxvcEeNJJwvZkh3Y8xXkPWtE2lkQbRBTKGMQk7O5eYDiZcnQ8w6QDknRNmmiu3nwClW8T2grxNYimaUqca0nzlswI3kXEfXmyzzuffJLPfe7LtHjqzHD12gfJ9zO0VgRXg7doXXQnO7YnMeMrJCol6C0u3PogElpExqSqZOQC471v8OWXXuXg4BG6DeRmRJEUGF0SvLBctSwrR2tbatvwqA587Y3XubB3kfe97xm2Ll9le3KD4MfcfeQwumGvGPCBP/c8z3/03dRlS/Of3+WF+69RVyuq0uLNmAtXbrI+vUfTlgw0DIIjTRXTXJOK4T17A2annrvrlpMGvrqMuSMqBGwIDHRglCYMtAaJeTOp0qybFhsiyFJJQIKnJF5kcw9pZ0jdLoRbRY4CDtYt92rHsffgYQDkCnQIpAhORbku9dB4sNLliCgQJdRdcHAuQiHRhNiKQynhoKyY2ECaDjhdLlhwAjjyxLA1HKDF4o1G2vhlSExGUy3w3lJKzXAwRQVD7YUgirJpUdqQatgajaPZvG3iTUHq78zXPh6Px7kRRDHcuYqxcyrvsds3yGevw+7b0eVd7P73Mbz2LprP/IPYAxKDtrYra4/ssdEe6y0JIAZWTlF7oRhvs2gc8vDr5IliXjmWlcU1rgvZFhatkKQJN3YLEEV9/aMs58cMlseE6XXU/AHq5E3S6QUezd9ElQ2i1iAJkuaMsoxHF58nPX2DYjRm9PTTHH7ji9Szh0zGGdvXrjC7d4ekLHG2QtJtyvQSAz/Hi2AXp1iVoahI+qo56wgqiWZhDx7byTg+TtybyrrY11JtdJJuQjv7kXBOG5IeOG1IkXiPFlF84EPXuXY1dhbQRkglmru19HhLEeUxBaIJSpNrxd7WiKZ1BG8R8WjXSUCd9LU3KSiblt/5N5/h//vl/4NiOmH/+nX+6t/+2+R5SlAKNcx5/0ee5Zd/w3HD3+XNWiH5cCM/RYNP6HHfZsbfMCfdhB5/P1ftht+ETJ5dcNDTT70xmh64dPgkghMPQW+OX99PL1JLHZgVde5e1/3QqTcB36thm/2JCln0DvXgJVbE9d6izjvUsTixP93Z/sfMrsio9X0IN3JlB9r6nCcJaiPX9lTZhpXbHMdwtgg5hytRoEIvM0YZOIKwTSfjzXHYMGoSgWJkOGXjl/rDxvcEeAqBeJEnGSYvEBHqskQQlNEonWCSFKUN1nryfERqDBd3d7mznZPm43jgJFJ+ECiblraxDJoaBjnOe7wXhsmIy+NLbGWv8/6P/Hkmtz6OqJzLw7fj6zu01RKt5sRKBQe2RNIpwSTRfe+OEbMNoSV4jw4J4PAOFqsahyL42BDXqQEiaUwPLpfMqjW1rkl2HKUJqN0Bzz3/JE9dv0Izvgn5gFVrsdUjhoOM3GQkyiNBYzLDL/zd/5ammmF/6//iQZrzd//7/4G/8GM/wad/65P8w7/332DWRwzKBdNRQaoh1ZrTRcW2wNIH7ljhXXvxRjAvLd57dlLD/njAdpFEGbCpqesasihHtAIERSueaYjtVLZRLKxnaWFVOe6pFu08R63HKOGGgJhYfhyIbVwyxSZzxvmYTl4GYjK6jiUqo1yzbD3KeXY1HHrF2oNGWNoGbxu2t6es6jnWVWilyAYGbYSqLHFpwWBQoIyiti1JmmBdQ+uidyExisVizbJ2WOvYGRaUYhkOhsyXS4zR3Wrn8Xg8vvshJke94yeRr/4TRjoQMo3TGrN8jRRPWD+EJ34Qdfgy2Ru/izI5LGrwAR8imFjWjgRFgmCyFJGAtQ0NQ2xzhGob0jwnNSAtSL5FWa5p6wancq7vb0Gxz6neI5gdinAXkriIvKCWrA++RnXpKdL0IdYFbNUiOiEpPCu5QLmuSLxj7+QFFt6TXnsvxwdfZrxcsT1NyK5d5ni25iTZBj1B3f00MtpBXBv9U22NHibo4GgJ2HAm02xyjTrGAUA6U/iGi3BhM/ECm2DJ3mZNL+PJWUXWRu4Jgcs3tvjEj7wbow3GBLQMMMqjO79O3KwH66ibktPlktPFmte+9SbONaSJIR/kZIlmmKYUeU4+GJBlhkGeMh2OeP65d/DJXx5xdLhmuX6Dk+Mjnn7b0x1YUEze9RQfPAx8/gXhCve4a69DksaJO/wBRvs8UAicxQbEh89K8uXMYH4mkcXKuU0Q+DkZqmef4ohzYd8RY/O+ff5TF3vRV8VFdsZHwBKka1DiOw/QWawCG7mzB0ucBWnS72s4v2sbduxMZjuDgz1JcQbxAqoDThEIduJiV1QgumMb+y1tqgZDBzRV15cvus785k31GdgjSnrhHMum6cm8sypI+Q4FRN8j4Mkxrxao0AV1qZgZEj1EBpMkJGkWEXEAk2jSPOHW297LbPl1TJrHL4fJiXkakZITlQCCUoqgLAoNIqQmYVSMKIoRfUa7qBQVpmA0Kr8IOosXmCSsyiVV07C7fblLp1YICSgb0bGKjI1W0eiptAdpsK7FB0/lGqqmRYYJt25e573vfR/PPPURDIErWclotMdq/C6ynd2uzxtopXlQ+o6ljdqvGk/5wb/6n1HceI7rq1Oe/dCHcZMtPvRTP8XtF/8tR7/zL5l4xVaaYgRsY6kTQVpLXlquFsIzF0YcritO8xa7brk0SdjdGlAv1rimISFgTVehohTrpkYJXWYMlAgVMFTCWguVVaRArgUjgolnMFLHoeuepCMQ68+fV4GsC0BzSsUbiDEEpRgNB7x6OGdpA02ILgB8IM0N86pi29ZoLVgv1E0gSwucs5g0pbYNpIaycsxXawb5gNEko6UmNAHRhrKqWK0qlFEM8wFlVXE8X0AIMfT0MeP0ePwxh4wvwpMfxn3tV9HTyxTrhzjVUE2foyrG6KOX8W1L+8THCHdfxJsRiT7FEQgenERGJLQWk2iEwCAx6ExTLe+QK0UZFMMix1Ylutii/r6/QfON/xN18BIXtkboYsTp5Y+xOnqZ1FrGRnFot5gsXiNjjQ07rPRFpuMhh8c1joZ0OKD1jqOjA5KH32KYwSK9xezk92iTiwyuf5ikOKEJJb6aM51OsMcP8cdfJZeGpimpn/t5zFf+OW2+Ra5Lgkrx5JjUU7tY+OG7Sa33m/RxAaFb2m9MwUA31dJHOHVT2IbdCIGYjAkdoPIUWxn/0c+8j+0iR4In1ylGBYL1NG3N6WzJbLHg4HTB6apiua5ofEx4/+Jnv8ry9AQBfPBI6BbgEtBGyJQm1YYkU+RZxvDJt7OXCJd3BsyPHvBwNObuwUOGeU46yHjX0wOKwVOsH2TIl+/x0F2ilaRjUMJbmR6JRTHSeYU27qVe3tuEWdKBm55a6YBCD0Z78AVxLuvnjCCxQplOIu6ltNBXlfXHMSZrBxWQoLv3OTsb/XnbqFhyBoJiblboGMIefMTX69DHF3S1fKHfd7p9DBupTjafKQIZ2wXCqiCbKyLOg52fq0Pd0gGhswiGrpWal1j9Gnwny8G5H9jgybNL6UwXDnSJ8d+5Tdf3BHjMX1FoAAAgAElEQVSy1nL70SHTugbn8K4P/lIb/VYZw6AY0lhPEEWRF6h8h93dfZLBNhLiZO+DI0nGXH7inYgakudDtkcjEi3UdYOrT3AhBsx9/fe/xNPPf4zJ7rNxlaMCoBGdgET0633LS9/8bV65fcDP/qW/BSQbBN2PIIY0G7O/f4GHD5foJJAmDcpH8NRoeM/7P8QHPvQj3LzxDOOtIdaVlLMT0IZ7Bwe45hra59HH4OMXGbpqOs5uIvrWM3z/L76TjwZFqwKvP6zQIjx1/SbbkwHTYkioSnICjQbXCG0S2M8mlFqTSGDHZDSZRk0S8kFKO19RbA1QyQgdoFyXiCia2rL0NRqhURrrfWzcqzQWoQywsoHaOQqlu5RWofGxfLtBaLpGk5aemg/0QWa1FbwObKUmgqg0wScZ1gfyRKPagHOhA7eKxaLkjliyDJJkQNNUFHmCaz2JSki9RSnDelVhtMI7R1FAPYNy1WBSIU8MyThn1Toa21A3FrQhQdE09jtEoj0ej8e3H25xCM2apm1wz/087pX/m3RxgjQzbDujqRvSR69Sfvp/xYyv0QRHJgqhJXIncXJxLlDrQGo9jcTCkExAq0CWGebrllwbZouS6vP/nMHqDsVoyHCyzeyJn2G+WDJqT2hPbsN4h6Z2DNbfoFqXJGHGcvaAbZ2QT0dYPQQxhNYivsWt51RZgh/sIZc/QDa/S54pkjSNMUJa01Yrdi/u0rqKtLJoZXGji4TxFcLqTUw6jAvVjikIynRURSx9jzLQZrnfRRJ0E3Q3sfdSXTQIn2cWANtNoz37IYHdvQF/+ec+yM39gtXskEVZsZwvmM2WrKuaqmkoG48noLUmaE2SZhhRoDST7S28d3g8Do/4aGpXXfsTj1AFKFcty3VDuj3iwvaQ0c6U2w9mvPbg9/ns117DEdAqMhvKBFKV4BKFXx5g1DYuH7KJtOwAED1j0pXOB9XnWPX5TeFMqopN6DbApG+I+5bqsg0Ii6/ZBD52gC1GNXQg8S293HqP0oYg7CacvnqtM24HvwFDSNfy5Gw34z6Ec56nuFPnvilytvG36LJnclq/edU9rweQG/+RRNO4bLbHGXASISjdtfAJm0pBNtfR2TGKb9tLkbLZvgrgJCDSFTV8B/T0PQGeQo80TQHWRdQHOOcwJkFpE+P+if3hjEpJhiNEDOPJDtpkG90zeqRSUtNyuDyhwDOdFFgHDh/NhF4o1yXXbtxkvHWDXlfG9yuk7qThCcHRrhbYtuz21CPYTV5Ev15Kiz2efPIZXnrlDm3bkmYFg8GKj378A3zip36Gd7zzecbDKR5H03pE7TEcXmc9W/Dg+De5OT7g8F7FwyrD+ph0G8tye70+rloUgFYoUSglxLgkzTMX93HjIYVx6ODJncVmMVqmdQFbO4bB431goBRhYHBNw6wumU5zdoqc+bLCtZZBntC2LaWvyVKDcw5HlNiCUlgRQmKorOfUBGwbyEPAEheFTayFpQ6BSgnWd+Y8iXRr0zFTqY7Tx0hBSARJDStxGKV46lbOg0eBZRWpV60VxiToxJCljrapMUbH4DctaG3YH094eHKM8y0Xty9ArtDJgvW8heWabBCNgOM8IyhL2TpcgKSjzLVSuNZ+xy/M4/F4/MEhIrSf+yc0JKRf/1foo5fwPpC3C0Jbsr7+IdoX/je2RkP0ZIv5m1/tWIMoMWgNrQQkGyFv+wH0G5/Eq8AwNVSrmkG+hdp7mubOF6narrH46Wtkg5zBIGf1xI8z23oK/8avMd7a4/T+t6iu/TQpB9jwPHV2n/zhG5wefJP0giY3STQAi7CqLKZZgV/hKgOH32B+smCaCzv6hGAGBBlgUosvFXY5Y293ytGdBc4G3OoQPb2Oe3Sna5QeyZXGtgSdngGj87xSB4yC6j0lCkJsKtLf685PuTH0UDYl5OORZiu1DHcLnnt2n9sPbvONV9ZYW2G9wgTXzc0KZYQkj9l/WhlUYjCJxihDpjWz6/scFQbbWjzx/mBR6GBxXel98B7KJTiPSnNWIsyPK5AaD2zt7uCgC1iEgEJ8wOUWt7bQrJFGQ5bHibrrodbPOSGagOiDkDYG8HMAC3VWhh8PUQccNgb7c1ofZwBKSRTEpJc9w1mid9gwSH31Y2ReNh7viCzOmbN7VNWdy4j4ziTR/iXd/sTzFVPdxffb2eCy7i9/Ju1JNMv0VXted58tdJ8lgEd1Pq9w9h7drKw24Zzdtjds3Xnpskfn/tzR7DKpJMZmbI6lKP6A2+wt43sCPNkQMF1CqklyhIBSmrauSRJDmqakaYr3ntFoi9YqlE5BBJMkPf7cXAxKhHGWsJyXrFZLDk4NJ7MZq9WarQFs3XqC0WjEYDJGRHeUoadta7TqOx9FY6HYFhVqxqOteKJUAmK6cyNEcdXh9ZDRqGBajLF1wKiaH/qhD/Mf/vxfZ+/iDZSKbRalO+0Aqzbwstfs7t9kcXLAy6+/zL31CAtY5wnexwCxLttEEOjkNCUarQyihEQLT1wOFHnBVtrGVdPKolVkgQbaYJUjSQwiQoOnLC3kKVMxZMMMt64YSSDdGiJKWC0dSnWUsTG4EM+TDV1uBp460+jaorIIsNroE6dxAa+E1MV0cK8ULZ5WFLX30RSr4nq7ClHyCwrQEkM3C8Po7YqtXGEODdY6qromMYaL2xfRquTN04cUW7so46nKBVUbKNsYijeeTEiMYRWWBNuwNbzA2jZIogmuwRhFqDzHsyVtXWOdx2gdU+r7Ep3HAOrx+C6HmJx87wZqdhs5eRV15QM0D7+MbF8nWx2S6Ax3+T3I3lP4Ykj+rU9hg+uyzzzWG9I03lPkwVepmprhZAffrsA6Ei0sj++Rpil2sUZpTZFmDEcp5sb7Ob3yUYJtSMoHVDd/GH8yZzm5Rn7wJY4buKArTmzJQGU4M8W7nPHOBax1rNZ3aKqayWSb9sI7aZMt5MGnWfsBhyHhRlKyagLZ9AKZ0bA8RoWWYrrLaTOEg6+jdm5RHsX7cypdC6QgBNdVdvWTH4ogtg936r5m/oyE6Cb53qzLOWYgdBKOSjzv+r4pRSE475itTmND4AC4mAKeZQk6Ueh0iElgmBkKrRlmIwodmCqHaSzL44c8tS+sxlu0zhOShKATahdwwYFOaGygsY5lWWGdBaMpndA4cCiU8jQusLauI9I8baeYKO+5P7tPygOC8qxCAUQgsikF7DKoNvITXTeS0Cl8XjbSXA8yetUjHrLN7LeZ/3qo0xvIzwNRzr0myl1xQ2cRBWEDzOhA0wYs9XlKdPvUAyYJ526Z56r1Qn9O+88ZFwyKTroFOAeG6K4HerbLSa8ZdsBLIbi3GOhVEJz0TFrnvwpxXo6HQm0w09kceq66rz86mwo8zioAN2fk24/vCfAUuoO7aGqGoSuL94o2gLcBnURmYWd7D5MVLFYVaZoB0OWTEj9m2PxNlrE1jZ6cNo0equAjNa6CUOQFWiVdmS94V1OuV6SJQ+Wr2Bncear1mu0LH2JyfcK6asiTBNOh7YhWPRISUIZ0dB0zLGiOjrly9RI/+sM/zO7uZYJtaTu5KklMLFkVxcjAk5eH/N7rLW+88jKrmeZ0Nsf6uAIK3mO7fkvOuQiiiNekCx7rappyhiuX/OBf/CCDJEFCS6YNkmYEsUhrCY0lN3GflRK00iTDmJ2UKU1dW6wH71qMDPCuRTlL0jE+gYBznlTpCKC0IEojSpEaTe08tYpfCoIn04rKebQRxMUvhAldJYP0AXgxWXykDYkERMfwOKMzBpMEM6xJBhkEyyjP8M5TVhX4lq3piPsHj1B4mqambjwPDx+RTzVX965Trit8uyDZbmlWDc1Ks64q3NqTEKgSzaKs8S4wKQqcxF5WrbWI/p74Sjwef5qG1jSj66Q/+F+y/tT/BK9+EiMeGV+DD/4CbvYAufN5ZPg+2LmBm14jnd8G8QRiP7gWxVBX2PUjvKQ0JNg6sHPlJlXTEBb3mBNNtIaE0ThheOEG96//FC2xP5vKRiwai/EKd/gaQxx29YCqndOUSy5fnfL27Ybb9+9z2R1jlaLU0BqLSQqaS++imVxDP3yJZnHCstbIaI+iPMSuTzB7+6jgCdWSrZ0tlncPkGZNffGdmNf/FTQNKgFxGpVk1FZju/BFRyc90U1mvYQnZ6X8m55rZ/N1x1ZDCK57UFEMM4ZD1QEqj9EKZUDhGGjFODWMDUwHYwpANytcVbE6eMjx6YIHpyVtawGPciV1E3vVGZNiEo0WSJWgNAzFoLWKC1UT/ZmSKEySAIokTUAlBElwIlgJtBL9uR7hdpGxOH7A8emKL5zYeL5hI1tF0HEGYjZD+uPx1pZv0W90DtJ0c+eZjBbOvb4Hnn1VXOcZ4qwaboOTejz3Fux0nuliw4KFbj9i7tJ54NQBl0334N5sfibkhd7o3pElm/3vKw1V97iEyEYGwSuJrWC6nTsfmOm6faEPt+xDWNUmnTP+3oc80TOhHTu28UBFFSkqSuocYPvDx/fETCFAExyPZkvSskFpiR2vnUNESPSam0px4+aTzFcNOk1IswKCoPOLdLj7jFZUCVZpsA4Rg9EJKjForUEHdJHRSEsyGoMI1pa8+soLvPHaS/hwilcOr4X5qmS9OKWsYL6Gy1ef5Wd/8i8zGoxwPoI8H3rNNKXYfgfv+v4fozJf4srFy1y8fJPTRcXD2ZLbD+6QpBlPXbmOiCIfFIgOZEnC9s4NHuYvMUJjlkS6ONiOOVTx5qAh+Bgz4IJD2oq6XNEu57SrGa11ZCZFqYD2gaAatIJRYnBBaBvIU4NtajQGE8BZCL5BWofWwrgYE7TC+mi4y5QhIULTtou276PuPTH8L9EaEwTlhUQEp3QEIkFwATLdZ5fEO0ASBCuKoELctgSUivEBWhmyxDAYSUyG1xk7acawKDZ969brkqLI0EnGtctXefPOtxDRGKNJc8GFloOjR4xywxPXtrn9Zkl5UjNKBxSDYWwi7CpUkpClMEgMTVDYYBBZY9TjarvH4483Qr1ArWesdUrIL2OGc0x1gj/6Ev6TX2GUjShti12+DxlMaYOK0rmKzHKiBOcs2hiaYgcpj9B5ji0N9uoHsfe+wigVhsFyfHBEkiXkoyHzix9inV+E4FFHX2c8Kmhe+yRqcgl99GXsyTeZpGPaJ38Us65o7v5r5jygPq1Z2AfoxJDKFaZbQ4qdi8yDw3pLExTK1+wMDE401uyi9RLdtshgG+c8oVky3b2APz1g+cankeqUNje05RqdFlgXF1y2aTcTmFc+Tneuk5u6mWmjNvWT4jn2adO4NkgnIQXG44LdrZRUYGIUo1QzkUAeHFKXlMsl1cmC1fpNDtY1VeNofayI8zplvHOF6uQemZ9T4XhtllI64eaeYj/xIDo2Ovce56FuPS40G6bH2w4UiMYQMDH5ANNJSH2rFaUCTykFFwzz1HJ7NeOw2YagzibtfqgoGfVMXSSlAqiuWrAzY0aGKYKUEPocKbr2NnSenkDf921T3bgxZfcSme8OuZwxYf2x7kHDedaqOwehn2uDikziW54XNgtjidkAZzxSx0JF44kniIuS33mGSvpt+I6Z1N2+d4zVGQEX56DOeyVB9VaoLlvwnNG8i23YJEJ1rFQvL8S37J7bsYCb6sNAPLF/yPgjwZOIXAf+EbDfHfdfCiH8fRHZAf4ZcAt4Hfi5EMKJROfV3wd+AlgDfy2E8IXv9B4BSFRKMdrG+iVl0+CCAk1kfxzcnVVkdx4wyAomkzGnyxMuDHYZbb8bIaW/DAhClm3xtne+j29++ncwOq4csjxFTUdkqefJZ96DzxJ2Lz1JVc353//p3+OFT/0+TW0ZjhOu37zMhUvXqG3DfHlA0zRYN4q0tE6obeD+8QlXd4Z8440HJHnB3ihnmOfcfPJDjHbeQ7OeoRLDenXM/PiU2RKyyZTPf+uE77u+x/aW5rWHD/FmRDsY4yTw4FHL0ckjEh2iqbHrbq117NUWAYRDIWjjSCZDGKaslwUmNRQmYaw97ToQnMNWNaFqiMEqnmYVyLKMqmmpRzkj7/CN55iE1ioumJJcb7Goqqj/EhulE0B1oCIEQVmHty0jZahbTy0+XvBBoTwYAq7rR1SFWLYsIWDidUoSHKFbUTjV5XRIABV9XFlhERHyzDCeTkgHQ2rvODhacTxfsb27jTGGna1tjk8GOOe5cXWE3mp47bX7aJ2SFQYXGjI1IB3l6M50mqcJ6/kSQcgSE1m1zqCvRbBt81iy+zM0/n3cv3AtLsnJL7+T9e0X8OspoTxGVEZ450/TpinD2ZvU3/x1/Bs7JOtZrDBDIDjaAONMx3Yq1WGM1lidYHTL4pVPkdkli+13YnduoI9/DWUUeucpHh08RA9v47cu0d59Ed8cUzSH+CZlefEjrJ74Edp8Fy+COn4FvuV56WTIweGCcT1iWAwJiUdt7XJw/cfAjAjlAj/cwa/mHBxXFMUhF8Y5czvAexdX6OkQ4xyjNOFYP01Y3GNpE2a1Zv7mXdJihppcpmwTXNszRnT+l1hRFqUXv5kI+2qws3DCEKNhQmSzh7nhyUsDnrg04OMXc0bS4ssFzfGaxWrJwaqhrC2tDTgfAYhWHiWeVDmGJvbxfO59z7Mqaz7/u69xuFhgdMKTV4a0FpKwoq2q7roBI3FBGL1Dgpboi1GZQSsFOmYoKdGRaRLwXnG6Vtw7jT1Ir40bJHh8a3n3zgG//WBK2/cAIfStDTcAogdVUZ5Tm2q7eID60v0OnEk0mPdG8A0IUNJVDUYWR3qT+TmKgXPHfcPFyPn/OwNRQiQJenbrLJryrW426aQ53zUq9hI6uNTnVp2FLUTVpluG9zlYhK6goK8G9Jv3ifvesUkSCF5t9hF631gEQH1v6UC/LSIY6xW6DdSDs4N/JnluWMHzxQ3fZnw3zJMF/qsQwhdEZAx8XkT+X+CvAf8mhPDficjfAf4O8F8DPw68vfvzYeB/7v79Q0eiFJcmE5Z729hBGsGK7ZoBhoAxBg88Ol3w9K1dkjRjtV5yofvQPixQjOkb6YhohpMLkYJF0FqRZgYVDMvyEV47rr39WS7feAcvvf4FTo9OCRJIhjnZaMKqFUbW44JhtghcvHSZydY1JpMdROD+bM6//u3f4/tuXWPlPKerexSpkA1Sbl6acmPvMu3AkIqiKEZc2c+QXGjRGBzb44Rg1ygHWhzeaNrG88a921TlABcOWVkXqyQUpGmKUgrvHcEHjEkYJik7kyFbkwnrdYGsZog4nPboxKAHecyaEoNpLQMiY2XxFKOc2kNbOQzCfia0bbzg18fHtHWDCrAcTRiUJUiD9oLz0fyHic15bQCnLYVVOKVYO4sTwHoMilYCmY8lpxqh6QBK6JqLOmI7C+kaWDo8ohXJsMH5wHJdY5cluU/JRhN2ENbrOa2zsemnCyTJEOdLmnZNgaNtLIVOCQasbRhnE5oO/FXrFUmiOvpaaJo2+p88lKsFxijq2j3GTn+2xp/4/Ut0RvvybyLtgsH+M/gLT8PLvw7lkmZxQLb3NtonP4a++7vRKzPchXms+vUhoLEEDLWFtrHoZID2LVVpSaoDJE3g5FXC7DXyNGN7a8zy9IQhNZWv8T4wLLbwWxeZPfkTrLduxLy5fjIIgVCXkOxwfQd2si12RwWzxnJU1aQJLEwSZ5zhmPTdP07z+hdYf/U3efW+sH9lSvHogLUfk9MgJsMlGdiGRgv1owfkKE7mJblpaeyMxCsayXBjASq0tdCZyL0k3bwom8mpb8sinMlV/RTnFNy8oPnZ5yz16i53v/g61gveJxu5y2gwKjBQLT4saeuGxnoaAgGDUhnoDPelL1EYR5Yo7rshSTDsJbGtzLxULNocgt4wONAzZBYRhYhHhYCWBlEeRQISzcoiMcU6MRN2xxneB7Q9Bjy1T3m6OOV4b84Xj6bxPuoicxSn8x7kRHzQZxNJJ+lt1LnQM0SxK8OG9ZGeXep1t3jez2rxenwmXdDoHzB6B9nYsDbP3ZjMezwR8Btf1dkZisCpJxi7yrUQewTG17kuHbxnE4XezH0+QHMDGjuc2DNRm+PQJ4D37xxiw2evoj1EfFfRrWKSfP/7mczYS3T9ZmOl4Xnm6zygOoOx3378keAphHAfuN/9vBCRrwNXgZ8Gfqh72j8EPkm8+fw08I9C3NPfFZGpiFzutvPtd0IbLox3qZN76MRhVIK1Ld57RMFoOKK1LUqEoBWLcs14uIUSQ/A14tqYB9Z57iUERCeRpg10oMPHhFcU89mS6dVbHC7ucvfON7m+N+Lo4ZSVC0ymU8QYTk8XtLZCScbu9DrDyS1GoysgCbPZHbanwmS7YFunPJFeosgGpEaTpBpjEkIDQWlOFqdoMyLVFeLhxrUrvHl4xJ37D9kaFbztxpjFGpZ1w6xJcOYCv/Pr/4C2bJFzJ1kp2USEaK0QUSSpkGhDYlKe/U9/lj2TQmix3qOUoraOTCusFdbWoZWi8cIAmNiW1njEC21VxfYQWsebtwjGe3RraVJN7hTegdKayjtECY8ax8wrXqvAOcPXq5pRUCytZ6w9V1LNVQNKxZWIoVuNxKuK1Bi0RGkvqPi4NooQHOMtjfctZeM5Olkjs5YLF3bJkxznjjk5naEFCJ6qWRO0pW5qBhguTsckekitT0llyrIN+GBpqpYiS1ACrY2rMus9TdmgVELStbPZ+AP+qC/G4/GnYvz7uH/hGlR9QvqVXyHdf5pKYiFHM97HbO3D1/4Z+fYtKjVAl3N8aqOX0NvoE/QK6xTq0nsxd7+IMjCrLMZksHuLdnYfRcO4mJLiqPY/yvGNv4DfmDIC1RM/xkoUrl/d99VrRG+K2n07q6sf4uj2b5CHhocuwecpIZvC8pDB0Su0o2u4YgoBkr1bWKVp25p1JfhsTBYqkBxsjc5yQtuQHrzIcDDk5qVbtI9eIpFB5Aoyj/EPsYtPob75BUK9IDjF4toP8Gjr/V2btghORDrGKcTKts2k1cl2yge+fmfFC5ni0rZBJdtMh56xrLDtmqpqqOuadVPRWE3rE9owoPWKgCFowQSN95rFA49WLVVtqJuEOgivPrCI8p1UGL1MCrWJk3LWAyamVntBGzofVJQSRRGluxCLlXbyhFvjltoKR8cGCZagE1alpigPUGxhJd4b+ym6c9WfsTg9E0X3b/BR0uMM0NCzMxuPzpl1Rc4BqPNxAT1A6/W7WK3WVcL9AeQSRDbnQugSweWtcOw8MdOdzegLO7fffeikyLknS+9Phn5iCxsk2O/zZkP0nqheZozSmgYfe91tNL0APSBE+sbKbLYn/T7R82Y29s4NXSI7sDFqcS649NuMP5bnSURuAc8Dvwfsn7uhPCDS4hBvTG+ee9md7rG33HxE5G8CfxPgwqV9tCiM0rQqEn1Gks4gHWnf6XhMnqVUbcW6atme7EQKMvT6aE81xtfnxQilA66pKcucpqlo65Kjo1NWFrayIV/84m9x77VX8aXl4oVtWgeDgWZ3Zw+A8dZFdvefwCmDlwmXL94AUTxx+SpP33gC2zqOT2c03nHv8AF4R55l0M5JKbly5W1cu3QZrTIu7zXMFiWpBC5NCzIZY11DlhhWtmRdloS0oFycYKsIFKVz8G0WQDEuBWsdiMNVjpVKuLol3PQNqinRxmPxNG28VJq25TdOWn5v6bFKU0vGMCz5+G7O+8SyZzyj8YTWtaBV9Es5S5Zodl2Nt0I9mZDN1tjgork1CL+x1nx14bmUaiY0KB9YBEuL4q7TfHPmmRjhz49gpDW2O++t7+L26W8GsilDDiGgjCMbKioLdWWZz9eICLat2J2mJKmhLGtUsKzLmtl8gRrVtGWLSSYMhgqT5BSjGhVSEh2jLRZ1SZ7m0auWJAQbz1VZwWy1JBMVqzpNAJo/ztfi8fhTMv6k7l/pYIwqdrGnK9QTP0Sy/zbae19Bv/JvKV99gezGJyjf8xcJn/4foWqwOkMdHcbvtIrf0xCE6s6XWCyWpBrqfIfx5WdwO9dRp/cwSYrYinS6w8NLH6FJBhBi1wTxAS+6M1XHsvOetQ8hVg0Hk+LFYPUg9r3buoJvl6i64UhdJyku0mZjgji0h+bBNzCpIU9z6tUCb9eo1KBshcpSlHf4JMU5j6KlbKBuBwyyuNAzzpNQQb3ErjwumXB66y+xLm5tpCAJcZo7H48ZfTD95HfGtIRgyEeGJ/YNk51tlifHHB/OKStHaQ11GNI0BbUlFhshMaAzaIxArjSqk36cy2iCxaIISmjaOOmneLSKC9PeS9TaQGUjfDDSzdFWMErIjHRdCYS2Z21EqE4DD+dxwe59wjS1FG7FqnVMwhFjfZOFzfBdblOfdB0rvWQjP8Wf43bkHJAJqpei6CrgOumro07+XUaHzfHd4KZNhVzHeHX7HjbyW3yeik9mE5K5AV1RNjy/7d5ndD5p+Lxh/fyebCoBVexzqjpG6IzB6q+LMznuDOF1EQLSAe1uO/SfL5ydC9e9sequtI0WSW+HN91VQY8kNwsSCF3p47cf3zV4EpER8CvAfxFCmJ9vmhdCCPIWWPlHjxDCLwG/BPD0c88GLYpRPmBeVjgXDWLxeMYv8O7WNkUx5Gg2w7v2rDLj/H7Qq6PC9u41PvyJ/4AnyzUvfO73WZ0uGWjDjf2bhMazOjxkHAqu7dygXC65fEGjjEOlwmA4ATNksn2Ti5efJ0lyxGiMgpfvHVCVS4TAy9/6Fo8Oj0kQjg8fxBj/nT32pynN+oSvfe11WgRTDBhOdhgWY4bDEcWgYGtrF0HRNg2P7r3CfF4T1Jj56UsRCEofTPaWhUN/LrpVgWasFX/jE9/P5Ogu3paxCsRoTk+XTFLFi0vFI6/4xQtCpgL/tNW8ssj4l+uMz6iMvz5puKQ9bWVJrcZZ0DrmwDRtZL/0ck2Dx3cVJEsfuFsK7xgpfjiHQZKhbEvjBe/gXuv53MqxsIEX14NvrCoAACAASURBVIofnAQqH0tpE6VidLBSm5WMJ3qOgvUkRpOkwrKGmLMBwVuWi5JiMGY6SmidRXmL0UJZNYz3LMV2yqpsOT22SHbMbipUNidLhnEdOTHU1nJ0+gijNE3dbED3cDAgWNu1yngck/lncfxJ3r8GaRYsCmxJ86n/BXn2J0me+3Gqh6/EbKCbz+OxEBrM9efh8FU8XRPuEGKwpIZmvWKcaZQEmnLG6ZvfZOvBixhb4YJhOB1j0eT3fpukuMLs4kcIXbjjZl5BNkHKMQMorrgESDNNPtnFZhdwyRjbtFR2hTz9fpoi3o/wARdaJJuQf/gXsKrm9z/zj0nnbzIZJdy4dpWByam9IMGiBvvkfs1gUDAbP8OiqUl1SqHXpPYRjbe03rEavZPl1lMd2AOnYrp6RyD3RzWmXHeTbyyc6g3Snsor7j84pVkvaX1gWWfMKo8NKmb3hYA3miwrmKTCjet7jMcj7h2ecu9ghkYYZcJkMuHhoxOOygok0AYB78kTjVbglcTq4xCogmI4Srg4gQTbcRUJjxaWdeUY6IAO0hW90M25inWZIAScDVRLxwVzjCBo73j38D6fWtyM56q7/6HORRZIH0i5sZ7H46Q2wmYXj9S1MOnjCsIZKImkZA94Ov7qvMzHWyW6DZjpNUB6/xExVqbzjPZAV/pXBjYVcdFrdUaGCT0b1Et5/bt1/0rP+IQNWAxd1EGQc7lW/Uvk7PNHcBh5VoXqgHg4q4LvlA7pg8fopcV4vOT8bvTX3rlj0qO47zQbfFfgSUQS4o3nH4cQfrV7+KCns0XkMvCwe/wucP3cy691j/2hI5a4O9blKQ/uvo71MN25iDEJPgRm8zlHR3fIE81sscSjuHXlSnem43Lg7IPHA5vme+w98QPkq/u8/PKrjNR1tocjGtvy8ssvsvzSp3g0nzE7XVKXFUliSAYJe/uX+PBHPs5wssvOzogLE41ShtPKY62jXq+5Wmi+/rXP8epnP8tsvkaZhNPTOTpLec/7fgTBcPLwVVa1p2wSanUZn5QEFdt/6CR2UddGM8oTpDyl9kNyEVJp2N7bx3uHdRbvHN5b8LG1pnaeJEuZDEZcv7TDz33/u/nAxOBnDzFZRuM8wQW2hjmhqngQDH9lH06rwMR4FkuLyTPaqqLOE35l5vlbE49OUqyNfamCiiGY9bok7VdASncMmFAI5ErxscKxrTzaGtYSb3pG4E7j+cJCMIlHvEOvhecHMbk17VYXNgQc0WRpY4Tx5nslujN8GgEcIcSqy6p01Gkgz1OmWxPu37tN3VqGSpjsZSwOHLPTBdMroKXAkJGnGeuyYr6cY5KMdV2zNchJ05TStoj3TEcj1uuSqmmwj8HTn7nxJ33/MkaTj6e0pwmDneu0979A61p0M4PtZ6i++kkGg0Dy8CXc5Y8RJNBaH1e7Ivz/7L3pr2XXeeb3W8MeznTnujWzilQVxUEUJVGSpbYkW24JduwgjcCGO0bSaCRB0kHajTSCIB/yF+RTPuZL0EmApIMgdidQd0NW2u62Wx4kWW1NpEiRKpLFKtZ8p3PvGfaw1nrzYa29z6Ut2VaAGOxOLYK8vOeece991nrW8zzv84Yg3DlxjIyCYo3CTxkaQ5nNaXzAKc0kKzDi0W7J2snr1FQcqk+gU78vncytQUioY9W6oy/xdh7ROU3IEG+pXElpG5rFFLYkSSwBrS35hefw7Zzmu79NWe2xvnOe7Y0Jvo5MewgNWVFy8dyE1q8j4rh8fkTbDDFWo+0ZDh8EpH4UFYTh2bQYaoJOMQWdBNW1AjktASkFIVHtSdL5ndcqPn4hZ2caDS6TMqMJHlEWkxs+du0SGyNDM9/HO4fIEbZa8NErZ/jU81f51vfepiwtX/jsx5lOj/kH//DLNM7HYhGItg7dsSyKOgiTScaGXvDOm/cJWB7sHXLl/DY7O2OGG5vsHzcUVmEkMm6gcGhqCWglsS9nWzDRBa6ZYvMhwTmsjx0gFLEMfyUPJTErgQ8R3RuZVVCELqOoC7TsHpOCi1RYPU8n0XUZWqfbDafD2h/rWIQWAYNBUh/eSOeErnVLeC+900tiOjFUxEa8ETQl0Ks6CNTzXKdeOySVTq2gyylw1zFW/TsXjyLKdJGdMjH2p6sCVN3zJODVfaYV35ZeP23gQ4gpB6dkuvi+U5EAwp+3pfrLVNsp4B8Ar4nIf3fqT/8Y+NvAf5t+funU7b+ulPrfiUbL6Z/rFyCenIP5Ib/9u/+U/R/eZGNnl4996gtk+QDlHd//wSv88de+ynph2JwM2d7d5vOf+QKdwy1Im7C5omuwqJRBNBhbcH77DCeZ4e2bt/nuKz/g0YNDcmv58Ec/zkuf/3m+9KXf5MH9inzrMn/tZ/4Gn/v051MYZjxpddMyXRxTGvjWN/4v/uhkwY0bb9BWQpYVuOWCcjhEFQVa13jvOTp8QFsZplVOU+yQDxu0aVC2xAdPqFqQQKMtIQTWti5xbeR4cvNTNM99jLapqauKqq5om4q6WmJCzWc/8jzXnn6SzcwwXOyj7r2NX5ygVQ6mQdoG0AQfMCbjrbbhcpVzRte86w0Vms3JmGWek+F4ocgYlDUqeG40hjIzrNl4WTdqHqNCjUJpi/Me03oKrfj5deHLleGcFl6wgQskQ57WXM7gQi4cirB0mrPGYCXE4LyUdaBUl54ehVkjoPC950FEyAqLtgG8wWhFXhbkRUyJ39jeYrZ/nBg6GK4VPLo1Q7SQjxRGCsaDEcN8SLWsaZqWwXCNYVEyLCzDMuNgvmRZN7EcWAkmzwlV82fo7sfjX9/xVzF/yfgsfvcZsvuv4bJ1wuJdwrvfIH/p1/DH+4TlAWHtIu25F2EwQTWRIdatwyqDUzDIc7ayloP5lEXw7K4V1D5xDlrAghmN4rxkLYQstk1JIETilylGp6SFKxJR0i902nsWeh2HQXxADbfxTQuP3kJMiSqGVDe/RTaaYC59lOVr/5LB8T3OnbtMWQplIQyydfRySl0fo2WOyY7J9Qi0JWtbRIM1JZXVhPI8J8sBflBS7X6kl4g6kq/zOv2pE9aXl4NCp+4EQTRVI9yaCuMzGYUx0Xuka4phwYvPfwBZHLA8nqO1Jy9trFYOwv0HD1mrPT/32Rc5PJqyvbXOcrGgyAxndjfYP6rYOzjBEyvsAtE7VmYaW814c/+Qg6OKy+fPo82cb37rNa5cucCzz48YDSxNS6zEQ4NWMRomgEFjlaFxlj0ZMQpzPCWvzzbwyqbsInpKKEpvXdo6sVVLR81ZBUH10UUdQdTFD6weT6IdIxCMvytSpg6dcVoTu0F0d+nykyJg60StNF+nCsiOxVIJNElXFXkK8ehufl95uyPYCSExTF0Uw4rB6mXELo6ig0CqA48SW6ZoE03nnS+1oyx1+vxKR8orBT6JcmkN9/GzB90ft+766n2DCXwGDTopEml782PHX4Z5+mngbwEvK6W+k277b4iTzv+hlPqPgXeAX01/+zKxzPcGsdT3P/yLXkArRd1WHE1PWJ7MGU2aWKlgLZuTMdeufYA//Orv4W1O8DAuC4rBWpwUCIRImr93KFBaUZTrbG7uMBicwWbXWNQGaV7h/MUr/NwX/j0mm1s8c+Mmd+6eoMYfYLI14dFRxbKdsVZmbK1NMMFTv/M6baH49LMv8NoPb/DxX/472KxAK2FQliglzE4WlHnLdP9dDvYOWbQZPl+jXd5lvjxgMNxmslFQ6AzvZoivKbIxtswIuWZYWAIDlIRoju+uPm3IWfKcVNQP3kH++B2mTUUYFhSlJSBYLEFspJaDwioTwdFazjeOAq/MA1luaQV0teSJTPPzmeLpkUN5jbOW3WZBM1/SekNpcyxCpnU8FyGgEZwKWG14ejTgyWzJK63lK4cVXmsmzjFUcL927DvPRmbYKmE3D2hRZEr3sQWhNy52pDQEL7EtTUw+Q2vQRmG0BQmMNwxbW0OWJ47GO4phwVZYJzdzXBuYnTTYgZBlmmYRmBcVCstgUGCzjHIwZDqdsqhbikHUukWE+aJiWTdomz9uDPxv3vj/fP4SpZHt67SDbdi7gW5PyLRBl2dg/RLjH36J5tWXqS98gsFwAzc/wiajhiDgPaMiR2clG8px50RotWGYWeZVTW4yhmsj7GiMqz1GGZqsQPod+6lFqJNeOsklyR/l/A5n1QGDzRJjFEoWsQeln7C/f5/qrQc4rxi3R8hUY4/eJm9qNtYLsiJgpcUGBbVHNSe4akmrLMgCJQeYvCQ/c4ksy9EqsH/vXU4WmnK4jlk7w9zmK2b59HvlFANyurqrI4B73Sbe69qlLf72L36E4SDj9776Dbxonrl2hWr6iOCWjIeWPCuo6wUHB8exx92i4cr1D6G149lrV9BG07SB3bPrXLp4lisV/M7XXgZi0QohzlWDzHD33Rlv33yXlz72AkblrI/WWW4dYcoNbt56xJNPXcY7j9IajMIoBd7Q4BCEXGtUntNWARmtIbWKnRtirxFIjAlKpfiK0AMRpUEp34OU/nD0dg4h9Uh5j+TXA5ku9kBWpfyEHmv0dpB4zEMPrvrrmtDLZ10ypVIqFnK9x4SuepZJunoFUnNnUp86JT1oWj10BaGMinNx57/qP7OKa4VRKh4akZ59U6ndV1BdsGroqwa9AqVS+66uF56KwD2k50UiUyc6JY+nArWYnCCYkIirHzP+MtV2f0B/Ov7M+Os/4v4C/N2/6HlPjzIr2R5tUpZDjnWGKAvKoLVid2eTrPRsb0woUjXGB578AMVwk3iK1Hu+XKuU2phN4UPgzZtvcv/+AZoh47LkQy/8FOevPB0rxh7s8+yzn+CVm7/Lw9uv8s7/cofLV29CHrh+tuRTz5zjUr7k/rd/l+2Pfp5rz36SRhxKjiJs90Jbaay1DAcKjWHh5vzw7iOefebTvHDtOY7mh8xmM15/82V8c4GLF54kMw3b6zll7gHH0XTByWyK84rJ2gaD0Zi18Rree/7ZV/4Jv7Q7xD+4i7XQuoZGhHvHsLm+xkBBiwcvDLwmQ2OUotXw+aHip2hpJooDNGICmYadoWaioInNUqCF25OzXMqOUPUSF0LsASUgyhAgpoRriwtC7udopfiQgSe3C06qlvttziuLhidzxc9OCs5aQZQwC54qhWZ6o1E+TggdgDKdYZzYq6/rKeV9C6JiuKmCK9d3WO4f4UPcNW1tbnA4n2G0oV42EGBzJyO4wPF0wUIrlBxxafdMvM+iwtU1lAX7RzNaF5tQN+Ji1V8IWJvx2DD+b874q5i/5PgBzbe/jCp2UItjZLhGyBTqzstkm2fJfMNyuIX1Fe7bv0lIXhZSyyajBGsLmrZi0dRMijwmeaMQ0QyKjMFwECtoVYgLgNlEqdj/MsYdxJ24gtQhIy4oGoX4mq0Hf8C4fReaAoehdRU+CINhwe5GwdGx0FQVtQQGcsyozFCDAYYZUlX4ao5MJszQzOUS88svUk8uISZDPXiFJxbfJ7QV+BmSlVyeKHbHmvvTQw7Mh3rBRFKwYTdjq5AUFE0fDyAdgkJSmGaUJZVWvPT8Fa4/dZG6WjKZlChTMLCwt6xZn1g0LXfvPuLugz3u3H3E2zdv88YP3uCXf+3f5WMffxGlozfGuZbJuGQ0HLC2O+LcjU1OplNyG9t1oQyta5ken/D8c8+S2QFHxwtu3X2XD16/Bipj2dTMlw1lURBUil1RGqcz3MLFdUkLeW4p2iWLMOaPH22xzxhVRBaml9aIn1+ncyddj5aIAnr5KAKFZJhO+Uh9HFJ32FIMQc/yhy69u7tf5wzuHhISkO8Pe8xJSlJWQN5DTvTgpwc76bx1L59epntMX9sWO8dHoNg/h+of3wPJUyA7HsN4m6iuk0gEXdFknhBhdxB1zIDSpM0DyUfVfbQODXVsX/9RNGLie9BJ6vPqlJn+R4z3RcK4VrA52GQ82eBB8gXlmcZqy/Fyzltv3yIrcsZZRmkDZ3fPonUWqyJSYml3zLu+NN3JaNqWl7/3HQ4ezJlOT2i14cmnX+DDF56mtlAtW17+wXe48Z1/Rr3U1E3Fq/+yRivhj9dHfPvZ62wauHU45W+dvcZzH/ocFy48xa23bkBCrNZa8mIdpRV7D++zt39MXQcu7e7y1OUd5s2YZnZCWR3zvds3mOdLJqUlH+3SLkYYnzESzeWgaOqG5vZtjhdzDiXw9Ze/w4g5F/U5Qtvg2kCBYUmUmVhUVCpQlCWhDlQI3kOuDdJEScpai1GBq1mKwu1+2IKBeA5axSBznGtattYmHD1qYDDEzxcMchvltSDkHhoCmVY44uZJqcBEQ5kbcuN4ocwRcSwF9j0UHbpPX1h8NIoG3V+/dDU3KI0hNbI0Uc60WY5vHReurVGMNYfv+Ngtfdmwe+0yDx89QnTAtTPKwlAOhLoSjk5aStvgvGN7sk7wjkU1w2qFsYpQBeq6xmY5rQ8sa4emawb6eDwef/mhyjHF8z9He+/lWMW2c5Xm+19hNN4i3PgtPAY9eQrJS4rjN8mP78LQoPGQWUoc4o9RYqidsL2mUTpweDxjfZQzmozZGY9ogoIsIFqxGOz08osQK5YgOWFkVbLuiIb0g+IJnPNkozPxO+UDyjsezI7w8/tk2iJhQZlbFvWYsoWyFIwpqdqYu4YdsN9scHj203gCZrSDVgadjRgWkioFM9Yv7XL49rcZjbbIinXc8SPMTlwnu2Tx3seTSI3en0WawzvpMflRVJDYMPziZuxb2TqGZc5kMmS2nBO0JgTH7ft73L5zj3t37/HaD27xnW9/k7pu2Hv0gLLIo7TjBe9jTMSF3S329o556oktXnnthMwaQKU4GItozWBQoq0iV8J4AK//4A2UUgw3tpisT5jsjPEuZiBZayiDTSwHoITMWlRWokWzEIMyiS3qjkOHHTqCp1/MVJyrexZOEo5I5f86AqMOQ3TRWX3ypkTjeZe7pNK8K0p6NSu2I+nStBM4Uask8l4U7M9XAjsdgurO2SnGS+IN9Lzoe6Q+VmBRiEU7Jta7SfdoxQqUpYq6LvCzB9Pp8+l0PYUUhaCSB1B1RnTRScVZGd77vHGBuO3w9BWeyf7TffYe5P2I8b4AT5052mtL1UJVt+TWYIzi3oMD3rn9CKVytrcmjAYZw9E4PjCd0PfmNnhEYHb0LjbLyfMJk7WSH7z6Dm3VUFUtt/WbvLr7PY6lYXp0zPf++E949PAAoywBxfFszs76hEs7uzx1/gkqv+SMGrL/8B7aBsYbZ1nbOcHVTfzXtewf7DOfLbh99x0e7c+plnD46C6L+Xm0MdhQszUqqRczHt17h1leYJjw4NXXGDR74Bz5oqFdLnG+pXaBG8tjXr93h//q5z4D032ycowNmjAqGc4X1HUVAyNt7LRufQuAF4PDYI3FeRd3OCYyP5nVqQmpEJyP2rctMCJczIS2rcjLEjMasjjJCdqghBj1QAzalBApaqsNKggnbUMZoDRx96uDolEanKNJwZomCt8gAWUsDkm0NHgVvQKVbxFX0EGo4KOnzA4qrn/sAtN3H+KdpixKRAkH0wOmswXjrZLhQDHZmCOqJddDMhOYHs8YDgtOljNEqxg06kFhmQwUTdvENHvvCV5wEpLp8/F4PH6C0Va4r/8P6OtfhB/8Y5DPUj71Es2Nf86gOaJVJcodYY4fwmg3LazxO2GUQXAoDMoqfLGONkLVCOOdC5ThgNF4QBsUqBKzdY27w+eoiitp0QhJikl9vqRbHuIyYIKnrO5zrmzJxk+hjUVQ+CShjyebtO1lDu05qqM9bGZxt76BmIaAp9ETHl3/FSbf/98YkGFCxfitf85gaJlJzfLsh5Htp3nnoCbb+0POXziHGu5Qmx3mC0dr2yhXkSrYE7sUWQXVg6SuOL73uHemXenICsXGWsYTu2ugNa5tGI8GnD93nrfeeRfxjunxPvcfHLO/N+XBg0Nee/UVqmpBlg34qU98kixaoAjO0zqPtZas0Ny7v0ezWLIxHmB0lIjywpAXlt1z53i0t8e1DzxJtmvZ3v0U3gUWiwUHxzOyrGSQW5wBUIiJpvjCRLFIa4PVikpNsL0RKAIApVfgUXEKgKjou5EkdWl1Km8osfIxGmk1VwVUNE8jiI6+ohUckM4G1LM5KnSAKQEF3WVDJa9T2sxKMlWnd91HHHSjT0iQjgnrXlR1OGjFivW/xD6npx6cwMsKrvWh4+nB8TiknHGhg2UphT0awEVCXDu6AgQ6Vi/1rOuaUSuNSqWe0iec0zNV0bBl4nv6cxzj7wvwJAkACYraBabzijv3H3DGw2zZcDKvCK1w7cmrXH7iMjvnUjGMAoXBmFE8gApik6CWenYTpy3r519i88xFvv/D36ZphPmi5uR7b/JbX/0DXBtwDlxTQYDxsIiyjXfU1YJ39+7BKy2jYcnRouHMuwOapkFlJW+89Qpvv/YGvj7imetPYQYFX//md3ntxi0uP/ExtBlwb++Q1965y+Z4wG4x4DjE5pEKzzAruffNP0EvDjmuG2zrmLUNynvKImM6W/BoesxGOeSDxpNpg1KCyS21q9EE6qaFtiUYQ60txoCxGV4srVJoq1D+BKuEEDzaZhijCMFjrCE3OV5gI8uwwdA6j1eWYphTuwaVRSOoiEcHQUuFzXJcEFoJuCAcuMBcWXIdGAZBS8AryENgrTTMK08QyFIVR+y20EbfAR0FTZxPiHEFzgnKQ2gUtljwgU9ssLUz4q1vLJhPa7Y2JizrY+b+mFYJk7UdTmZ3sMPAbOEp1YDCesxYsTGZcDQ9Icst49EAR0AIbK+NqJuWRT1HAWVmUDYjOJ/264/H4/GXHPmYMNhEN0tytyTc+DLuwk8z+Jn/gvDG79Le/TZ5u8SYgro8gzMPEGZ4FRBtCBSMN87h2gWDbIhv9pjOW86tVdhyTJg8we31j3I0uMTCTvDKEsSh/GpnH8vkT/lGVJRbrJ9ztr7JeGCjNKEMomJzcqugIXZh2Ggfsb95FjdcI7v9DbQqUDbHFWfxoy0WZsJ2e8xEKzaGQhuENixZIkixxtH5T7Lx8Ptk5ZimDejBBNUuyI2iLC1LpenMyKjTEo96D9OU8gn6mAVh1f/syXMbrI2G+NZTNRV5ZpmMCq4/9QRt6/iDP/w6h0vP8cJxdLRkNj/B2pxf+MUv8ov/1i9BcJzMZ7St0DQ1uc0xaFrnCK5lY5LTOgcorDGMJzlrkzHOOR483GdtPEYbzd7hFK0VlQtsbIwZDwsWdYQqQSsKZTgzyAg+nodcaypV4sMSq6OxOXhJFXUqHYUkrwVitXPiR5RWETBpSTlQ8TgGkb6fnSbtS3VkqjocYhIb1WckKRWvmc5TLZ1S0/lr9Spc89QPpMNCSeXpH5O8Rh3AOAWWupiDlTxHD6JUB350nP/7F+ggdPd3ia6pLncKb1DKdzA7xTxEhil+FtOzZ/HAJEqvqzZV3e/Q9xfsGbMOFEaAq5WcamD8o8f7Ajx57xlo+Jtf+DxffPZp9o/mbGxuMV6bUDcNm+WT6Gcv8eIzz7F99ioM1ugLILVFFefodi0ASmfsXPwsohyiMq49/TwP92aEOrD0NU0rLBY1mYbJMOPs2QEfubbN5cuX+Mo3bvDaWwtOli27wfHXPv4C53cv8j/+xm/yyndf5tab32f3yQ/xP/3D3+BbX/s2//YXP8av/I1fY2P7LNOTJbdv30O5fT78wSfYm874o29+j9F4iA7C4bJha3ObvG1pZxU+V0zvzxi1LprEQwtBcM5zWFfcXMz56x+8glnEmAMrgmpbbAh4pTE6Up02CCa0SFA4HXMvBEXQBdZ6dFNhxGEaj3KgbIYiQxcl4jNsrfBti7QeaTyeJUvXEHRBg8LYAmVycnHUbYXxDtvW6CBsiyYLAe8DhY7lvVlC+HULLpV/xoqHeLtXUWbwQVCmo1LT9ysElI/Uupacybri4pM7HN07ZHbSopQlzywh06yd2+TiMjB9dMi8PaHMFcwEVzvGoxyrBmTW4poGbTTGWDJrKHILJqNpI1NnjcZaTVYOaBcVUP+Vfwcej399h/g6lssPNkBacqVA5rhyHbn8Avrt36O+8GnKpz6Kuftd5GgD3AlBTGp3EXDiqLNNliePKAcjBk8+STZ/g2JyljvbP8vx+Epk2EOA4HtJJDaTTXNfZ7alW3yEreVt1rLYcQBsbPtB2y9+hrjZUQLc/zoPh1cYsmA03gIsx6ZEtKa9+jn27n+d0fI2IbTM1p5htvnBuHjpgGpa8qKkZoSTEXW+RXt8SFYofLOIG6dTkgkqldWHKHf1o0cCpMU3oEUTVOCZqxsYJdRtTd00CAEvjrO72xSZJTM/zWxWs/doircZzz//PH/nP/9P+dVf/mW0DhwfH7B3PGW2qHC+YTjKyIxiZ7PgJGtpnXA8q2KcjDHk1vDC9fO8+qbm4GjKvKqpqgUuaHSmeOrJy1y7vEVVO8ooeiAGssxiZQQE5osWFwRlc5pFQ6aalJvU1XIlnw/dmp6ggVErZeX08eqBhqwegyT7raB9xxqRZL0YwKqFBEg79qV73cQCdaile1JWkl3PTnWxAB2g665/9CrjqiOTwimGqgv+7H9PlXFA3x6m1y7ppWhSXpOc6nUnWlYPkwgdezZMuviE7vOE7tMm0a9rbu/fKzuq7jNGeVEDQfn0+X88RHpfgCdrLKPRBtevfw6eTvJOarWyKjlLF4OyHWxKf1KsAGWciCSxCyIB8QvKwqCMMG8XOKfJMsva2oiLu9s8e3mXjzy9zec++kE2z38Avf3bDL/2KufOjfniZz7Lix/5BFmR8Z9slwxyw5lz5ygM/Nf/5a+jg2F7a4uNM2cRpfnZX/hVfvYLv8JX/u8v8d0/+hq5USwWc268cRe0Ym044bAS1oqCsV3j+OFNNhqPloAJAYtCN45pW7MMClfXfPLsNkGELMswSe+NzSoV1uaEtsUgZMQMKFk2kebNM3SwKDvCxF7ltwAAIABJREFUDgJqeYivKmw5JBtsELISV0HtHE21RFyL+BbXtjiBqm2oJSa0Oh8w2tKk1tUqQOMbtAJjAuMgoBUuka9zCVQSGa5+BxUfiZOQjKxCpqJ5M84TsSzZtS2183gf8E6xfn7IoDC8/e4dfAPeNSzbmu2L2wQc071DGqlojcc7j3hDaA3HizlGW65ducLmeMLBdMpiWce2CtbiReEU2NzG9xEcIcQsr8fj8fiJRnVM8dLfZPn9LzE6+yJ1taTONuH1PyC7eJ3qwicpty/jHr1DfvQ25vgmLostPkQUVina2QHtk58gm32dOhjK8RmkvYkZnWU5OEvcEcfJfWVTkG6NWIGNbuEUwYhnpJZkRY41HhWqWGkk0diM1rH/pdUYDe14jD2+zXA8ZlAUNE6T6dhPU7aucrT9FNPqBEOgKTbQybws4tHtgsZucTBvMb5B2TNU8g77+xX+/KWY6JP8O5FhSt+zzhidwF8nLcWqrSjfJ1GKK2cmeO9ovaCCj4G7EiA4BsWYZ65f5ep/9h9w78EjTmYzLpw9w8bGOt4tWcxmHBycgBg2BjlqWMb3r4WN9WEqFlE0rUPQGGNQxrA2Kfnpl65y49Yhd+4fsgywNhpy+ewWH7iyTdu0tN6QK0/wcdFem+TsTDSBwN7+ksOTyJLNBdas40hcUkpSw9009ynifJuaiNDhCWVW8QKd6qfCaQO+xAbBHYPUSaGJNenvp9Pf6JioU+xfB7lTEGXnxeopKCSFYK78Qz0r1eE5HdduOQVIOqbnFPGUJFl6KXLV8CVVziU+rROftfSibr8xUJIAmzpt2ZEE3k59R2T1ytJFLnQsXHf/dFAjM6pS+lSXivXjc//eH+DJFhibJ6NjTAXt++p0n11glVJKXyq52ss4Dg/f5uDRLdp2iXNV1H0F7r57m7//9/59ynLA9vYOGxvbjCfrrE0mrK+tkedDsqzEFAP+3otf5O/rDGsztM57uvLpD38xod9IAX76E7/Y67odbRkkSnKDzR3+6FuvobXpKzAMmuXhAUrBT3/0BebvPGD98IRcaTQGG6BUhiMlvCOBG64mK3OeHE8wizkFJl0Isf2C8YGByciUi3qw1thE84YAtg041aBDhrdD8iGorCYrJ7SmTLkbDVIv8a7G+0DbNNRiqYqMw/kSlWVkQWIpLm30BiGINogYcC6Zu+OsaEMgI/bAcy46OWI8yemqyJUZr0v0U8pEoCsa6sDGkeJepmhdzfrZc5wcn7BYzmiCMFpXZBNHObJUdU1dNdjS4pxCXGA5D0zv7dG2wvbGmKZaoIWYUZUX1G1F6zyTQcbacIyfz8mUwreCdw4XHjcGfjx+shFEqL/1G5i2odq8gKruoOopYe8G3grDaz9DePt3KO98D9n9IOID3uiUC6sIGLL1HU7ufJ+B8mRlQbH3fUYDy2JwnVaXqYydtDFc/dMtVmkNTveJ/xXAljmFmpPhMdrEAj8JKY8ogDHorCAED5WluvcOa2e2wVeYpmEtW2P67r/C4Fle/CS+nBA6YiiV2meLh4zvfJ0SFy0UzRLJS8zOc9SjAbL+RPSYdOAO4uKlkmeLVfl6bxLvlnUBRGMMbIwKpvM5i5MFBEeexyrn5WKBD57N9Q2KIufqExcQAe8dIVQsF1MePDxC5yMundulKAuODg5x4imLksn6GVrJAMinVTTBa41WmmUtDHLLC89c4MVnzlE7RWbi/HVSORQ5ZRnwXvA+bi61UhweTWNquII8y8lMzJFaywK6aVGUdNJT/Nwrj1d/LhNYVqnibFWSHxf9jrHrW7N0IFSv1sb3LFGyAgod5ECSw0lLXz3eY6ZurLDNKaku3XA6qjsl3XcAq/d8p/e0ugbS/N+BvdPkR/pFEpBTScYNfQ8/g8KD6WTD1WeNoVXdAYysleqlt8Q2SZcFefob3FUfajSOoPSK7fpzVoP3BXiCdOB6+ta859z1Q/o7n8Ys/aJcFlvsnl/DaIPRBpTFmIwPvaD5BW16+rHLFeqh8595MyodvNXdVu/ndAw/iSHsqMGUZREM09kSFaJJ2RiNUfHfjVFOdjRHHj3CKIsog1GKQmWcOMchGZtljl3MOTMaMvIBbIkLjiKhclFgUbS+wRhNCPH0a52CQZWl9Qt0MGjl0DVoW2LHY0JZEowhLCuchya3zAM0WlFR0HjhRAyzfJ0s08jJFMGiQ4itJpRHO4c2FtIElWuNBIUPgiVW5iGBUkEtsJBEKStoEq0auioQFD5A5YTataAa8gNN2AFTWta3B9y//QCvWgZnYDAEHSa0S0+1VhO0oJVBvBC80MyFqvbo5LFonENCoA2CyXSi5he0QbFYViCCsZrgwEtAawO0/y+u4Mfj/69D5WNksElx8Rpy4Tpy/2Xk9ncQnZMNtgjrZ9CuornwcdzhTZwoGufJbEaQgMtzpg/28cUGCyWsVzPy9QnFYMT+2nWQ6DPp25VIiBJKUH06csxOow/IVES+xtULdDYH0Wgl6KAjaNIhemy0xsgCbUBJg6ckU8K8UezPNObgNc5sn6e2Oyx74KNXy4q05I9e5mz1Q4rSUARDaAwm36BY19jRNe5KV20e+jghSa04tIptaqLvtZOoSH6YlR8nJLZj+ughVdWyNiko8gzxgWI05NadOzi3ZGOygc0sEjzeNcxmc6azClUOWB8MKcohGmFQWtZHOUWRsTYqaZoMHzx5luEdKKVjzEMQlo1QT11i2sBYk8BKQWYleUpDsiIARjNY28YHhyxrwnLG3sGCRRuBVxEcXmtUCKAMWiRWH/ema+nXF9XflFg5BV12pgqJTQqCdD7pxOKrLnCJLp/A95V5AtEgHuh9QEoUpIBiNNEb1bNHq9TwjsnoKIugoyQYU75XGO495EbX0f4UE9ahl+7/+7W2c7anW7pmyIKOmFCF/rXSA4COESMxodLFX/XPszLBB7qATEkbCTn1XpHVao7ujOw/erxPwNOqYu40mAndFgc4HcoVOlSbHhfSqVR2SG7joQ7pQvQ+IMGDauI1+adovNh1PNGB6e/e+/S4+J5MQrDRNxDv0zhP61wKb42v472ibj0vv3Gf2gFtzAvSOvqTjDZcP7eJf7RgEvLYrFM8Bo3TQqUUThSZwMh4Xjp/htDUGFNg8xLfLFEIJdEYp5XQpF2JSPQXSVBk0mDtAJP8EU4pRGfURYkeDvEu4HKQZcPMBdAa41s2DAStmZ8cc17nLJZLnBbEtdRtSxsClTJokwNQ5jm6gta35CQJzhoy5xkEoQlxt9CIIqg0WYiiJZZPIwGHYemFWhwuKByOIDGmYOv8GCU1e/dPmJ14JmPL8gBya2jWa6gtqtAswzLtVjPqRQVoNtfGbK2vMx6MERGW9SFtXSPBMa88s9rjXUtmDYPM4lqPASr/GDg9Hj/Z0Epo1YiwPMTefgX96BWsErwtaW9+A+0XmEdv4ALwxM/gDx6i3UOCxAKZJgTGa2Oc0pBvkx3fJw9LGF+lGu70Uky/gElsegt0k1Z8H92uXro1T1HrDazsoUJAlAdp0d0imlpuOK/R1lDPlwx1hQsj9jZf4uTKs7iTh1g8YX23X6hXPpW4EW3XrrI3u0MuoFwWWxwdeHxzwnQ8R211bJLqDS0duOtNu7LaoEp6ZiRmWokSxAtvPjzhxZcuAh6lhOViDgiDsmB9c4u9gyUns/uMyiz2DvRgjGU0nqC1IbOW5fyYg8N99h494ODRHkVZkOUZEDC6IKOlcS1Cjgcym6EtBO/x6ePnxpJbG8N8dVzog07LswjbW2tcOrtO5Ry3bj5kWXmuXL/CN7/7FkMNI1Wx1Osx9NF0bI5iteJrtD+VEJ4S11Uyg6t0jvuoglPHLVbsddTgavGPJnHVE0aR6ekkstQXrgMb4dTJgAgwdMfapEdEY1OyyXRtW05LiRGCJNwHCCExax2JIZCYqnhNx6y/FZukeuDUqbtdZZyO7BMdKKIHhZIk3ihZJj07gXAUMT+tfy3fA04lJoJ7ZWKwp3jwmhhl8KPH+wI81XXDjbduEUQIPvS03YrT4z3BXCHEizQkGrHzPkVGIzIgzkvKPkkVKN0/AhAIIRBCJME7sOSDTzscRZHnUev3Hqs1mbGUgxJrY/n/bFEzr2u8KBofIpgKHueFRTtEZ0Oq+X6kWlVMUddodkZD6gctLUIQzRoGYzNqCbhGcBicVjxqWrZHI3JVkOkcK4LonFk9ZxjPLiKxnYALPpWnCrmK2vTdYsD5akaNpVSCXhvDxgZF3dBUxxTLiuA9pQEfappmFo2rKothZFKxPbIoM2SO4FrHcj7DL5dUrsX5QKUNJi+wZoRZnFBIoEzmQaPjF8WKQsTjuu0S8XaHplaaKsCwzDhctmggV4YmsXtnLqxzvH/I0V4yDdp1wnyJTATnG6gtlIKr6liFIYpcWShhOM6oqFjalslkgnUzmmMPKJwXJEu73uBZNJ66bfHeRTPh4/F4/ATDSEM5GXLyxlexO8/hW4V++BaDj3wCtX2O+k/+Ea7RWDukFUVzssfMCN61aKsYaY9bzsnOXqVpaqQsQSmq8hJB5SspQiTOScQatJ6tSXNWV9quToGpvewC0+ot8vqIzAiZAaNdXDiVid4VDYftOW66XXbtPrVd42TyNEEb9Pr5CHKShNLltUUWRCimb7M9f51s8zySZSiTkVEQFLQiDJqCeXCJfVAxcyctc1qr3hseGXVFLLPtbkntXCSgjOaH7x4x+PyzGFEEN0eCQylDUQ64dHbAYTnFuTb6qcTTNhWHxw/Z29vncDqlWc6p64a2jR0s2srRNItTMlXH4mlEK4wCbXSU8BKKCUpjTEY5LHAeyiJnUJZoayiKnMIompljX80xWjO0wuZ6wfbmAM0VfN1w9PJd9pQhdWFPwGQFJCKjAySVIXEr8XfdJy/FY2QU+JDkvUT7hLjWBVbMlBKdgHVq/dKxQaduW/2nO0cqLb86msrT9bbS7TRGQn/dQWKyEnCSxIx1UEmdAk2R1FL9bz05Iqv7xfdJz8Kt1KbuiMSfXbZZV80dmatTRQfESvX4/dFx0yCk6jwIKiSmLh5/r1RvaBf1PmeeWud5uHcUvyz9RRwPntUGozSZMVilyLQm0zEc0+iICoMEWtfSOkfTtoTWgfOEZC50EnDe40OIBkkXcCK0PuYOuZRY7SNzidJQ5AVt63DepTDO2CokBEmsVJx1etYKklFNMZ5ss75zjtnBQ4KP4V1CIDc5k6yk9TMc8UtZIAQJVB4apTBKcxRalq3j8nCCNRZCwJpYsrlmNUoiUECTaGSLk9iUNwB5PmB3OUMjjKzGD3JUnqMWCzJfY0LL4uSAul4SmoblskLrKG1JXjI9npEZi2qEFo3oDMlziuGAC1nO3vEhTdMyb5fUtWaZDxht7NKEGn+0T6YDLp1GkcBQK6ZBOqmeoODQBSTLmBJQTmh8UqmtxmMohxl5rrjz9iEhCEVpoLIooxmORhhT44OHrMYvWlCCVgVlphgMoVJLqkVN+2jJ+ewSMgq4qiFoAaXRAlpHoK10jjYtWkNmLIfLxSn+8/F4PP78IfkagwffQsbr2Gc+Q/X7/z3h6mdYvPX7yL0tVLGBzI5QrkH/4Mv4tqbRmmGe49uWhW+i7/PgJlZnWJlT6Ys0o2uxXLqrsoI+EykkQ2cv65xmIDSJcVC0asSbxYe5Wn8dmiPQgtMOo6MkglJUonkj7FDvvcpgo6DVGWJzTu3rTykAibVQYJdHnFv+ADvI0SpDmxwxFlT8XkXI0dLWB1SDndS2TQgHt9C2QA23UnRLXPiDEgi6jzvp1ncVYG0t49f/nY9QaBP/nlm00iyWS9784RvMZlNOjo+ZHh8xn81p24amcXHO99B6cF7iJg4Ts368IGS9BOYhSXMBJToeYy+gm54NMSicWlIv4+8LVpbiLotboVYeH2V6IDJUGmMVlzaFm1NoxaP7Aqh0bLVesUl9BlLXRiTdr2MOO9amY2xICeQd4QCoEAjpOZWKoKxv4ktyGHeVfdI9T6e9pQbBSiXP3cqT1Fd7pusxYS66piwq3TuVt/Xgp7+AoP+5soifutS696IUokNi3JJPrp+dNf2i0jFikhi2Dox2AJIQAeOpyryOXouJ4vEdSEfrpcDN91Jw7x3vC/BklGKIwfnICLnEAIlEkKOVpoLYNDZEWs6FgA/RLBmCj8yPD9Te45zHCzhJRr5EYnXVjS4FN4Z0EUX9XcXF1MfXNaZG6VTl0Gn8EvrfvV9VHHSlkooIpkZ5ztWrT/Pum6/j23mkrEVzZmPCoAk40WAMQwl4JIZPGsNAFAtq7lRLTuqGrbUBdVOTYxBtUDgM0Noom2WuJU4FGm0UtWsxWkNdM1KakGmKtREuiy1YhjpQPdjnePow5ikJ7C8r9hvDEk1rLXbhOfAK8YENL2RZ/DKE+RxrFFZnXNzc4Wh2gpseRdC5nHEQAtmZi8zKhs32JG1iFGiP8o6R0sz7Lw2MVeBh3dKaLFbPoAnW0Oaae4PA+rBguTikWjqKIQxKzeLRksY5Dk+WbG9bXD3H+xqtNQqD8UPIZjhTsWgcw8Kgm5zF/SWDrYxiQ4PJ8AcgzpPlhtligSdeI4Msx4gCtegXi8fj8fiLhrcDiskId/P7NN/7Ryjx+KN3UGbI2ou/RPXN/5naLbFnL6Bu32VcKNYHBUZ7fAYBy3BUYtfPUZ19keXmNfzaOdps2LPwkuS5IBJlN4Su/YYIqS1FWgKSRNbJJcf2PK+vfY4nHv4L1twDlGrJMgWmZO/Ec/vOMWX2W1zeOsfe8EOc7H44rS3dhieWs4dungsgOjBevMlGGWNTrIksSNwmBkTHFlEWRVs/oC3WCbpAlFDf/i7m4Xfh8qfIn/oMgukXYek9LMKgNJzfGnFxI+Py7oDF4QNevn2D6ckJzbLieLqHa2vaxsdNsUjMoGuh9Rq0QSlLkWeUQ80gU+RaUMpDCLhWMV/EQhnfOoIPsaWXCJpUxOJNv/iCxasAYmP+kuoW9Ni4WFQXXqmT0bmTs2I6p4ij9TVX1xt+uJhx2+X90rwqTJOefQkSerDSZUoiXSse3gsaOrP3qRiDzhydSCJW3qIIFDTpHPe/CRDoFK/3JKArUqeIDqyk6jsU4iV5k1YkAn0gpfSMlkrxGN3RjLdGsLbKXFoRJ9277UMs+3feC4LxvqeetzNCx6Vd+msqAr0kMCarS/dGOv4qPmNAB5MM/OFPGcvfO94X4KlpWt65dYfWx/YY3oeYnI0mJMTqfKyCCj6k4lVoQ1zYO5+dALHUkBhE1sXYB4m0nTbpoku6qDKI/CmZRmJDWk9MytYqMkeREQtoFFZDpuNJy7TGSiBTsSWKUWDJOTp3jm8Nx0yrZfJuOTITeLgMTP2SiyFjZHJapXotfSlRVx8pxWaRsWMMtBUqLxHxiGuh6zQUP2zcPRLjBKw2iAJtohFUT4aErOSwLDk3P+Hg3rtU0z1OyPl2lfMvZp49P+GkrgkefOsQAsYMGAwMdrFkvWm5ZBuuD+F6YSn1klAtKYcDLtotbh0c0opCVQvq+7fQaxscuQG5zLDEY1RqjQnCSdpF5TF8HKsiSPNaUXtFkYHKM8Q0DAYbPHpwG20CRakxVtM4jzI5+yeHlHUeoxKUxamYdTM7XuBMQ9U6Cq2RyuARZs2CutKwphlsDqhtQ/PQUWQ5J2HG0fQI1zrseMDSucfA6fH4yYZSVJc+z2j/FvrgdcAwqe8ioy38d/5Xtk2F2rCo5gb2TEZWDFFiaOolXglZrhgWOXZ3zHFesZjdpDEZbJTQLaadPNdZGkKsttJ9a6rOxNvtxnXaucfJsbFbvHLfMz7axyjP1bNrLKXlzQND9tH/iOXbv4+Z3aK5cpVgh5G56iq9RCUZKRBSiTzBM9ZLtM3IVRvTsq3HKItXcfHxIaO2ChrH8ev/FJ78LOQ7+NlDqKaoW9/AjXfRZ5+NwMCnaU15EMVz5w1fuLoEd0y1XPK1r765WtCCpvHRoB2IKd5lYShLw2ZmyI1GqxBZeoSAjzYN0bRe8F5RtYaTmcM5jySVYSUrtXRF60rFeJW4yPvITHUeGq1BmWi4V9HbqdGp8iuKq0obtIqrR+2EjDmf2LzDYXWZWiyiTU+3RK90J0glZiR5dEi3BRPPf2fqVol5VO/xAsdroAcp8cACkf0TRTSqq8REdQCtB0ydxUWtKvyIYEi0ilEJIWVPaZOWo65tSjTAr/zFOrFSq+9LLy0n2uG9DXg7Hq1/QDovqT2NnIJQp9BN5znrFUDdESQCKVxUr2zUPUvWF0BIB8k6rlD6c/CjxvsCPM3rhm/dvp+i4OPV0McWJJN2NIDHRr9axWax4bTZUIG1EVQEiXp657CXtFOLhu8od/kQsMb2nae1tgTxKBG0pJBGpTAm+mL0qcPqvEu9jyJIi7vDWPprtAUFs3rGeDSgXo6oFjNC8AwHOdoJ123GPIR44WpD5VtOnKNWgleaBTU7wxKalkMJmOWMjcwwTLJegSQzewQNqK79SZQAxShskaGynEprdhcn7L3xKntVwzezLf6VL7mrNYwcbasxgyKGU7oW5RuQQCsNjbEchhPens751nHLeSv81NqA50aa6niOyTWbm+vMjk7IdKBpPe30iGWWY5VlEhyFASsGpzyFVbQuMuFWCUMJiLEcNYFzo5zWCDWB8doGHs181jIYWpaLQFCaydYWVmcs/D3IAsFDYUsa5ngPi2oWO24rS2gNVheUZUFmDYtqSeyC4xnsaHJtaR5WaK0Z5oqZjzLuj/+qPB6Px48ZAsvND+I/9nexCMEUeJvjdU6whhNx5It91Cv/J/rgTTLnkFBHyXhQYvIRc9eS338bObOFnmyhspxk6gS6nfjq9VYAalXO3U30kjSSfvKXuFNXLoYGYwtcsUldB1Ae0Tnbecvk0sc5Gp1NzEF8ed3RAGmLroS4UGtFbi34WTRj6wwdRa0khIHKMtbznKqq2T94leXBTdrnfhU5uYMxFqs97t1vY3evEVTa+AmxVFwJ37u14InCsV24ZOTVKJ1hrGI4ytgpNGWuYwWwkMCRw+NpvacNitarxEpZfFAEMXFhVlBLweH/w96b9dqWXFd634yI1ezm7NPcJpPZkRKplFSkKMuSSiWXIcCSXIYBPbgKBvxg1C/wj/A/cQF+MGzAEAwZVdCbyyq7iipbDUvJpNgkk9nf5tzT7WY10Uw/RKy1T8piQbQBISHceEhenrPP7lasiBFjjjHmcCB4S/IuywA0b9DGFB1RYVnsZEuSkgKkxUSkmWGbLI4ixd9mFFMO28aMmDDkyBbT4lPLQ7fll06f8c7dYwaWuVxXGBGZsEHMQCUVxknSsdSU34Tk/WvKzpIihBbBxMLK3NMN58mhqDOzpnyeGxOFKcwlspzrNLFNMhFdM0skmo4uwfKe9L6gvYCSVFqgmLm0dny+DNomsfr0HifeSWYWTueoAuaMqIk5m4GeClMa1hRAOuc1CbN0ULCzTjCj2kKySBblTxrpgqh+4m3/hQBPKYEPWcCIZpedkfJpU/wcLScma39QsMaUzIac1uqK02By6RljcgPMMnOkMDUadQ6WbIyltYZF5WhsQ2MdtjA4U25SLJqpxKSVirnUQ66TB40MKTtXTFJUPZ9tb1k1NdWjB2Be562f/XnO2VI92dGq5DYoVc2tKhqFhatRIlazAMsaoa4cy9gifsQY4YUfOK1qlill5wVSPmN+P4nSBLiytCcr7pxguo5nP/guP6ThXz34Mu/thc4X/ddY430PLkFKWGORaoUMe3AnRNY4FVy9ZEg7PlR4cX3Hu1vDb1+0LIjcxsBbmxXf7QasUZJPDN4zICQc5wrJBFSVEzXcoXiNeFWcJmwKPGpqGpsnuAeatuWw2xFGsFSI8WCUMdwRjbDc5GgBkVKvl+yoVBIkS2NWjONAag2HMfB4uaCqHE9fXLN9GjFSsXhY0TrL8GPP2MUCvJVj8u3L8XL8FEOF8eR1/BQkWLSTWkoWw+maqm6IPlveY1KGAItkUamol0uMWPanf4/+1W+gBOZekDAbY3TSHsAx2keL7ZqESaaYVBTIjMC0DxhyLlLlTOnvVjaQD/9PGvE8X30js02FmZgCLbNLSmenF2WD9qGnYoBoMZIwmghiMMZixGDSiNWeZhzQfkcTrkl/9s9Yxh41EKMn3n2GXn2IufgySVxOdi50iU+GP33S8F//2pLzNrP6UrRESfO6rCkSIoQIQ0qEKEQ1hJTLaCnZORIFaxHNh94MPAJ7X9F3SgyGmPL3PRFH+ag9Hbzzc5gJQUoqzLfBTlokBGPyxm1s1kAZ41Aiy6RUaQ+VR9QR1PBzqyueHRo+jZZAmz/0VHYqYMyk4rorF1xFMnsymaGY5oMUUCf5ADnV2jQzVJhjbuIR7Hw+fJLCHM2J75oBo6HM4ySlMnPMccrfbboHTEwuwU6spXAEMqmU2KaTgDCXafMw90wPef+foItRx5Rx+FeBViHZymNj+SbKz4v2b/4bKQGaBU9O34XKdJ9N32ThIL/o7VmQkg1EFmfHGHLbAjnWSVOKhemRWRw5sVSQJ3sVbakVlwkvJjvoigp8er58ibMpw1TgJDMSrXFUYqlsRWMdy6rCOZtvjpSZq1h0T0lgSJE+BA5+ZIgRnxJRs/Mu9AMfP/mMZdPwK7/0Vf70T/413/zKQ05Y8lHt+JqrOKQcyLVuK7oQGTEcup5d1/HKoqGuHb0PLKzFpMiqbbAaMSa79yKKMUpIEREzh7u5uqInsj8knr77Dh+3J/zL5Wt8dLnn0PuS7QIaBqrkUZ87iQ/eA4KtQGKgNY6wuSDFhNkZ1O/5NAmxT1w9G/jdhzWVEz7qs+V/2wcqMYxJ8QidKEQ4zyEyCJG6XL695o7Ya4kII4kaI5aghuRqdjcvSKPldhdZnRmMtURbE00PEqlkQSSSNGGsMI4BxSLR4IfA6AO29lhT4ZqaFCMzC5sIAAAgAElEQVTOWUwCv4XFwiAnhvaVluHjjjoV7Zx/GZL5cvx0Y+KGpsU3acwMApnByYuNYL/625irj5C4Bx+wDtqFoapqEga/eA2/eYPc3NxwdNWVIMmpJMN0ONfirDqWW7KPxGTcZSdXXD65t+0SGwzj0KG3WxbNBhMMq5vvsauWDKaaN2KdSitaNj9l3oCnN7CtXuXV4WNSGvEpfx7IRgxsBi4Gw+2La/w44kOg0htiXbH3CiFxsoroR98ipUh6/HNIMvc2PcMHt4k//IHyj78OjRF6n4gpg6Wcb5eBSJokHiqoMTOAmFLcUQMVkEwuxqkilSGamn0xFiVMzs6KpUphUkkcVEzMYmONeR3TYtt3xiKlGbCQ+8kJ+Zof9yvDxlacuwrj9xizYMTidOTXNk/5328WXKUFapmZlRxFULb+Sbsix81+3t4NlOTTuWQ34Rwp4EYScx6YGkFi6dt2rzg2MUxToSrPJZ0CuvKBoACdI9FkSrZYYaqYCbgZZCdT0hwmMbaZSmITQMt7eGa00sz4zJ9vAnKEAl0FmdD1lPckR4JI5nLjVMI+rueGAvqksLLTHxfQlh3bEwoTKPEFP2l8IcCTppRv6AJQjmFp+YvTQqXODPKMeDMTlSMOcoJoirnuaYq+KU3ot3COpgjoRDKNeGNz3zOjOfzMGYu1hoW1tJWjKSe1ylhq67AiWJMZH1fKgCqG2pkcJ0CiloQD+n7gjUcPef7ZC+6uLtE3zngRO1bNkmsTeeBqUkpYo3hr0THQEbkZR35uWWGscLJqsWHEqYUUqNSAhvweJJ8ybWYuc6J3ZakayzYqcvWCJ4sNf7R6kw+f3tKPA845DJ5hGEgxoKbBKPjxAJqyUL8PnJwvMGsBm7A3I66pCcmzbNd81u0JBP7wqfJbFxUPKuFJzN2tDQlxgvdZ0B8k21nXYhCJhSE0NJLw5AwtcIhxM21sjaHrBoxpSCGCzSJ+2FMt8wT3wRfBbMBIYhgSadDMVKVMvwo2g/KkxKCM3nOxOc1z406JKbE4b9led4Rt7mcV/cuogpfjpx+a7om3S9lLJ2GqZj9Rf/o27Ru/Au//a6raUVmHNTXej4hbcHjlPyIsTjFaAnfLqbmcBfPrzP8szENZEM29TWCSMYDk8MSUs3NcZZniAsxiha1WnCxBXv9FxptL6quP6L50djyNm+I40iKBSNPr5XX4tvkK2/ED3PAxmEAKOaIkGMFUghEYguXD995HNeFsRQwJIx5Lyxh9Xot2z0m3HyMx4KOhunidVC2B3D3hTz4Y2R0iv/dLpzhrcvmnUENSPH2m6FtiKQmZqaebAVcZ6rqlqS21K0xRGthtD1y1I0uBGB2hfNchae4WYbK7OmUBD1FjBm4h4PsRYxQqm0uOyea1r+hxUmJmpFAlekPd1qxsgNRhpWZEsS6xrhNXPs1AODvcChOuBUiU6zn/vsyBqSw7ga754hRn41S5ylETKe+XJR9qKqvJtN/aia3SDMpKOXLyk2sBYKYAu4kzKhFQmFR6xxXdUWYvc15Xfps6IyuJE3s2T+0jEyRT4vcRRE00rkx1Qc0AaIodyLedIc4voUzgsKj/ymPuxyVMSE/L/VrOOaZkTU2Wz58wvhjgSXNrjMwwSQFQkgXfZSQo7FMuUxUsxPQ1mVLCiyHlvkRz2S8DstxuxdwTm1FYKtCYxZfBJ0YBkcjOBmQYMgWbydpZA2VM1h45Y3Ams1jWQGWF6EfGYSCo5eGDL/Hg4gHdVQKNVBbOTjYsjEGs4UFlGa93XBGJVc3drseEAYeyrKq8yJmAtQkJEU0jxipGUw7XtI4UFDF5cjgRqqpmdDU/ev6C97Y7/nzzZX70bMjAS7Kma7loch84uySMAz4MKAnnaoZxpL1YsNgsaYzhOgxsDztOmgata8QPrNuWZ0PHuhL+zW3gd04zk7VqHd4HnAqtEbpkGFLiFqitoUEwkqhTIhqDz7FLTDK9VChm70diFxkOWUjbWM+YEicPFiR7oJWW7eGAypTfAf1eqbQmkhjGAVfVuQxJRIzhcNhROcvJasG+HzkcPOHuwNlra04frXjW3RBHzRfy5Xg5fpox6UJ0WvQLYJrkBlIyeIwyfPm3kff/bzZ1gOLaDSkQHv4i48XX8uaYn7Q47OaXmP5TNrvpufNjp+007wVSGqhOp+uiPdFIDIHGVWh9gnVrDnjkld8gvbkglzcy68S9155ZjYn9KC+ZbMuP1r/Bmz7hho9zg+RKsZrdr95YfvBR5LozuCKKFmepIwxWWWiAfsuqGakv/5h4d8JVt6Dt3yKuH+JPv4LKEtWKHzz3vOga3nhUU7zRxSgkpdImmMrRVJbloqFykhmi5El+JMaew2Hgboz0g2fwCcRxGJUYs4OtETJ7JiZHwFgzH9qNHPW3RmuQ5WwkUi0p6epy2SspoUhLVLPrm3gBBHbdJSu9xTAgZsE7txdcpg1HtHEfGE2X9d61nq95vgYTICmkTi6zfu5C5cfZVOBIKqLrwozKFMY5lf4KgsjkTenFkRLHJ5sCQSml4VzpEe7piibwoxNSmoUzeQ6kaS7diyiY5ts096Y3TgbITIeJIleZ5DrzpE/luaZbYSJe7t0dUl7HcH9ql3wnEXQKKZ0wpxx//9eNLwR4AvClw/1US7XW5QrnpMqfJq7JN052OSScq0BNLt8YgxjFWjsnWEtJCc/ALM3Pk59LZvpuYrrEyPHnmJw/QhaYiyo+UgIvI2KlsF0JHQ78u3/zR3TbG5LvUT+waS02Gc5F8UE5r2usjNTLBh36Yi3uEOtQOkgdrq4IGhnTyPNnn3K2WaPRszCKGj/XrC2K0QAou0NP0yxxdQPOcBMG3HbPj09e40eXAzb1gM8lwLZBJLdZCfsXjKPHmFxPdlUGG2mwvHh6W/rdDZgQOaRc428rw1hV2JXw3vMdX19a/nTr+Q/PhOgDlbWZUUqx1PwNg8I2BZzmCTdF+lszWZvzhhNQxpgINzsqU+Gi5eF5RVgkhn3C1IZAousHBu9xpgYHwyEwdFBrKrlY5YSWAgtr6LqeMXgqmxfwu90BgPEwcP1xZPlwyenDFbfPDnSHlwnjL8f/h6FHVmZ2JgGU2V2WaExKtG12io4xZCewMxjXoiV7J2tD8qY8n7zLE+YDeP7psQwhhfkyBaTljdOU300MhR9GWmuwFQyyZIgNlQNv3ZwfxXRGL1oSvfcGlMJElZ0okejdGe8/+h3O9++xefFnNDc/xNSWLjTcdBU3QwPVmnjokQdfQ/afotrTxp62yYydUY/EgO0TF/aa+vJD5Mpx87P/BfvN2/l0i6B1Td0ssc7QVI7aGqoKJEWijxy6PdvtlptnPdv9wGGIiHEsFi3L9ZKH5+f8zFtnnJ2dULcNcYj8s4+e0w8HgkmZyQ+A5lZaEnOf1Qk3WHIUQRIp7KDMzI4YyX1MC+1nyGYeY6AVsLVBqdj6DVc9fHA450k843ZImDrvNhT8NF/0cu1Uc5xPrnJMe9UElLU4IZmB99wDVgpQMaDp6NgDilA6l9UooKcEXWXwpWC1oD/J1ZU5tqA8xcxYSQHs6DECoIC8aQ6ZaXbd+5v8PUkp1x0Ztrl59KTJSjk3IbNGE7jKJb5EZtWyDiv/8ax5IuW4oWKoKOeIOSdhJl9mmY9w7GkHao6aq79ufCHAk6pmp0MBImBwVaknl9ObMTY3qBWDq10WlJO/UDEGS36sWDN/YCOWUkYuBn+Lcy7X1zXb+a0hZ3BMfYJKzygKYxfLjStFvJnttLmurimf8FJSti8+Zf/Zj0mpw4gl+ZEUehY8ZrOKRCLRD9yNAUkHTFTCombTGl4cBnZDvgl8GLAirI3lYt2QgseaLDLNGVe5RGlESq0bFk3OMhEHxgnmZs9fJMOPdhCGkbG7wQ+exWKBrQTvR1QTyQ+EokVICUIKxBBomyV2VVMLuUcUcOhHjMCqFtZAtx+JzvFk9AiWbkicVokBi6SIsZaldYSYHSdJLUEjkuJ0NscBGf7laxxjohIlvLijXq85P3c0jyu6Ckw34logOLyVOcJCNTEegCgETVSZKkSMIcTEkCJPr65JMXK2ahnGkb7vsc6SENKQ2D3Z4c5a6kXN7bb/W5v3L8ffnTFFCVB0KpPNf9KcqAjilbS7wqZAPw7ZYVUpaitSSHOOEkwljLKLlg1IRI+CcTMxDMV2PuuRyro4aTukMAGqWFU0gpWGzapl20duJaLFrZtIRev0+VLLJDuRz727/NySlCQVl+tf4Jpz2vd/hJWBIYyY5Tnejwx9oJfXqNKaB6HDe5/7Zqa8jjlj6cfAzeGGeuFYLFbI428ybr7Kly5W/NY3XuErr674xTdOaETpD3u2d7dcXd7y4mbHvhsxxtEslixWLcuzDa+8ueL8/ISzzZrVcsFy0dI6h5DLcrvdjs8un3BSj9gUSWrm6za5vacMwAweCkoqDKDKvRY55O8hSq5SZKJGp2ilvPNIIiKMoWMXT/j++KUCWDs8bgZoBR4UgHYkYaaSlhYNkVKAsRwB9mzTL3EHWTaWwZClsEImS1kkHh1lMztansNM/5ZSnUEzeJkE6DLNSTMzVkfQV4iHqawnOmvRkMlZdw9gTQzUNFcppMY94jNHQJR2LIUSmohYyT1qyr8n8JZztSj/X46XKR855lJf+iuzetJJUaqXmUz5SeMLAZ5EhKZtGUePqyzWZL2PSC7hpaSloaTJ8QIze1RKfNwjFWVyAui9m2C6MEpIKTNFheGasikm6+88FMbkmSyNBjkK1E2maVPKzJaGRDjsWZqeQQ2LhdDZSDsYzuwtbvRYDbm3VRxRb+l8wttycogjtVNaK4zbSNf3NG5NUwvJKyYEog85xykEUvBgDCHlz2OsJQwdtTP4oaPrtryjC253B4b9LV23RcSw2wdCrBiGgd3dHd0wYqwjxXuMsLGEEDC90i8cTVMTOo9YSCGy7xPr1rFyNWPfcaXCl2rlu4eRX9vUEBK1MYzZ55wnn4KKxatDcmb5PWa2CPwS6BgI1hISnLcbNEa2kEFvbWhXDj9U6JidgbaqiUHpd4Ifs0PTSCRGzeVMq+z8iABN7RBj2B2ytisGGEuQWwiJeNnjpn5VL8fL8VOONCllU1l3mIrRkwsqi3VdlVmJfhixTY1RoWkWDJXLjXcL6Mn53MeSgwLJTk6rIx0khY2anFJqpjVwekjWOCVVlssGHYTgd+jzG5ZVBfER6YN/i9s8ggdv589CmoXC93ivieqYN9EsKIZ8oyfwPSbcQegQdYhRFtRc9ZFkR06v32XdGkZbMfQjfVJc1WBFiCmwaQ3t8oR9SnDyNtHULKrE1y96dH/L976T8CFrU5fLNZsHX+KVN1pWqwXr5YKqMriiaU0pEqKnH3p2MXB7u2McBvp+YH/oeOfb/5Yq3HImngfLmD+nWKba05QDGHGo5BJhKoLlqIY4gSTNB7lEzuubKhWozWdtUzbppNgkXI6W03rk9fqKZ+OGTottfnLzJSH91URuCm9SWJPJFABaMgzvgZd7rV6yATNhC/ibBNLZPXcP+JV/50BtQ8Ep5fV1NiLM1NMRrnFkbLSA7gzwJkY0v+JEk2VgMzOcQs6tmVgyLWaDwlodnXDTtdH5padDgczzs/xwfu7y+maKPSoPufe+y5Pne1QoKGA6wOQ5MIdv/jXjCwGeFIgxs0tV5UANIXqcqxEs1pSsiOKWm3IerLVY54gxZidciEQfCtoUUiqJ4KWEBxBD7mk3/T73siGzXpono2qa4wpiStOagbO2XLD8t7kLdQZdIQbq5oTUbxm7Dj8GfIS7Ty953o9EhOA7TpdLrq5vwUfeZEEale/fbvnqxYY2wmfDkAnJ6In7LUYsRI9GTzIV++2W1aImjeO8tqnmkpvv9/gqcuVaLrFo2KFxxJqqzLt84trve2rX8ujxQ9QIw+Cpa8dht2ccBg77O3ywSG9IVaCabg4RQkhc73qslDq3Gi5TwiTofcRYIWLwWVVY7gthVKWSrBWTUiNPaFmI8o2y15yjQjL00uHdCu4iJ6dVTlE3YCpHZKBqKsRVHK4PhFFxlcH73KMOkZLF5YhJqaxlvVrSe8+hG7AGYslp6VPAByWNWch6vBlfjpfjpxg6FecK5Clr0GzPJgttxW4ItkKqzImrgIaeOI5IP0Jdz0zH1IxVZSqRlLtp2rtkso2nzELrMekJ8mETIJmIkZz/lhDEB57voTndYP2eB0//GGe+xtWDr5Gmnl6aG48rFAfckZ3I4x7zD4haNIwsTjZoaOk9dJxh1PNgOdIP16xcIir0Y8CnxOpkw+KNr7P75APG/Zb1uoVqgf7s7zFs3sIAT+881elD3jhfs1qvaBc1i7bGijAOA+OYAZIfbtle7dje3rDfXtPvdnT9HX44cPb4LR5/5ZdwRogx0G1vsNGTtCKKLa7CspYDiYglUQ3PEZN11BiDlKaxUhCrYCjpOiSxxJBQV+dyXgFxuRehnQXfMTTc7Cy/sLohqOMjv5w1tZDKNZNZ2Dw1e56IAFOYoEJuHRke7gGiws7cL7FpYXOyLmoCNYWVpLAuESbgkastGTXN8S1G559RWp2UmZY1SOVJp896ZNOO86ZI8XLETMrzdgIs5bx9XIGnsiVgcmGKKDntXqdf5w83OwGn9TuDxSNTCEfm7agbk/l3k2YRpBTaZ5PsTxxfCPAE2emUR4ag1tqSnj1FFhSkKgmDJaTsfphYpCwGn+i7fOFEppYrvkywVCZzjkYwNkcZqCrWuSJAK8ArhlIOZBamhWJhFRU0hgKc8vM9u3zGdn/Hfuzz9YiBw2HkR9JR3/WkkLi53uG3hyyKT5Gr7Z6TZDkTw+3tltQ21DFrbmJKaD8QrcXGRDLC4bADoO9HTMoWzEEF53LGitBCSHy3c+wPA2O/x5pIu3Ls+8AweLpDz4OLc5q24fLyOSHmXAxLy7qtuAsjq/WKQ3fADIk+gS4qHIKzlpBz5AgKtrRjOFQ1+J6bEHnoHC5G1gi9qfAx5pOZKl6ERgxeQ0H7grhsBo6a6V2HwYdTnjw9Rx2oBsyVIemCFzcus0ajJ2ZLCsPBkupEkoC22U0i6ShgdE5x1hBcTT96tHEomX2kijgNiDqsM8Te48fA4Ie/vYn/cvydGFJO7fOCrEXtVASwppQ24uYVbh//OuHdP8SYxMXKcRnOsK/9AySNuEPPsN5gOKZOU1gHMwOpI0jKG9ZRxzmRAyLHx0gySEr4rkNiYllZFusl2ixzuOxbvwnr12bgJKn0PNOEsRRiSZgEvtMp3Wi2n+csqEi1PMe6BT4mrECrHX7YszZKWwdE4TAErHGMrmWMFePlFfbiq9A8xOoTfH2Bbx+DVCQSzlm++sarvPZwDQh933N7fcPd1SUvnnzA7u6Kbrdl6PbEcSTEACnl9QRAHGpfEMx7BO8JPtF1PSkGjKYchmkUiyvIwiBE/DDkdVaybgZjiRFs02AkFzlt7uAJlJZbpqKqF0QpTeVFUZtKa8IKkcTj04qkkesb4cuLKy4HR0+FKeGdsdSuJvE33JPpyFQ2m2pcRaw9kTUCU5Zkpt8mkMCxVIbOIGWeqyY75SawkgpBMAVuJZgddonifJ+Q0qRDKrPRTOhJKCxq2bfvlfcEKaJx4d7HOgLzCdzNZovczHeu9k106z0maj5RTGCzZEVkcnR6n9OhYsqAuvcFF7CX8QMFDM5P9teOLwx4StMJrUTfmzm7IjNBk9NONffeSTHNJTvQku00LSfHq+FDmuuWsTBRIAUElURu1WzbvydOT5rFkdbaWc8QNd9cUZUYfQ7c1Cz8XJ495s/e/xeYOJA1PJGIYOuKTYwkYBgjtU9IDFQauTokKuNYWcOzoOzuRs6N0JI4hMT1zQExCULA1TVDNxCcYYlyhpJKvhHW0TQOgyEmeG+oCduR7WHP+WbNYX+gH5TgPZvTE6ra8vz5M4yxLNtlseQm7u52+JBLpyfna66f3yBBkWSxtsotXIpgvqryaUNQknF86OGRKA/qRFM5rBH6GBDNInCjOjegtOQTT0qKF8BYkgiNc3w2Bkw4cLf3aBRWK4MYRz9G+m3OMFaFmCpUIlCBBWurzGqRT2NiLJNwMInhQKQ9rTCSuO0CIsqDVyD1Hdc3FclWmIVgxh4OH80nkpfj5fgbDZ2W/ziLtGdPeVm4p8U/uBNCzOUvH8BXDSxPEGPojRYmIm86SUtgcCmJZLZAyyY6uZAovyuZUFIScZTMXJkcdNkfdiwVqBqkbqnrBjtWjA/fRiQfXkU/b+U+ZuZNUhqdWRAVmZ1SRnJopS8MmRGlkUhMHXcHz6KtGTSzBiFFGusIqaMaBxanI1JFGCsiNeJ3aLNCBEaf+OM/f5c3HiwZhwEfMqD65P3vwu6KlLZonNb2zKzlPnPFIZ2U66sX7MKSavWAZrmgboTvfXhHjJ4KMCbixGBdDh+uJeHUE2KDKREUIsIYRlaVxboFGiM67hByRuCYPCcXp1jNruvcDH5ydWewKSgxDixSx2XKrsETO9KxZBKM5ytamMcCNCbX5bFv3X1N0DEAciKc8nUs866UtjI7VoDLvcfPkT9M85QZkBikxBqU9z+VuO5jigm5TX9WNMQTCTFBoqmQrVNrmcLyKJTIiTLBZijGzK4Z0blULUmmoPF7fNbnIxumMnXpew1pjsqcP/vM1001SZ2+tHv/OyOzv358McCTkkXQxuSAOaboAUEoTEEKGfFLbpeiBTDNWRGa9UnW2JkGnGnudCzj5ccqgiUSZ7CGZsr0mDOViDG/rjV2LgH6CJoSMQU0JpxziMDj19/k9be/ycfff4eYPKYsZkkTXhMWiKPnkJQ6DDgjBGPxOrI1wi2WQwxo9IgPdKqExuJvtrTOcdjtqJ1hFSK1KKMmYhBqYyF4xuipU2I0NZ+OlspY2rbh0Hf4ksdgrFDXFXd3tywXS+p2RV23pOB59uQJ3WGPayqGsacyDYumpdsfGHewWAunj84Zx4qrFy9wribGREiJ0HUsRehCQJMw+JFoLY2rCWHyGeXvLYMnJZBwCC1KKDeBE6HBEhk4MyNDN/LaK2eEqiNUAzFCVSn7a+i7FlspN0/2GHGsHy0IPrK97DOrKIKrTAaGWFKMaFvz1qMztrfXDCkwLlvaVhj3e5JRCOQ03pfA6eX4KYcWOYFRU/Qfx3YUWUieW2JMPb9cVRFCwlYVxjisGpJYjOYcMyll8ck5paRjXy+9B2zKhjqflOfXLCLniUVIymKxZLUYMCTqZkky4KqWII68g93bBEtJxqYjATaZdKaNfEqBTqVNSJLMtqUUkTjQDwFTNVRkhtmp4mxNSp7oPUYNy3rPg/XAs90dY4gM0pGefB/5yhnqWoYx8d/9y0/4b/7zr7AxCUJHfzhgNOCNEHzNOB7QmNAiE9B6jTEVwfcgDqlP+OVv/Dwnpxfstjuef/YJbzwQNNocikmFElFx2QSkjqG3jJo+J7yPOOIBjE3ZxMMJiiHZiBeP6JLUOdC6SN8SE9JwxuCsIqmj0TtOK8tn3QO6tMrft8u6uKmsphNLo5S5c8w+FEr5awIkUnY8kZlsknvYfbqms4aozMcZ9Eh+IUWL22wC4scSmdoJPd8D7NOY9HETE2QngKVTnWw2N014ajocFGxDmVRHEASzXpYpPBOTNX0TyXF8A3yupQrFnZjgGNzweag1gyWZYRRzMOy9Z/73dZz4YoAnyddESijb3Hk5JUQCmjKIwaS5tjpVN1Vjof2k/E0sMfsZeZrSHNGafLIKxR48leJEjiXDEHwGcDHOF3eMCTvpACgugjJR5hOagpiK3/hP/wlf//u/Td/vGEbPzfOnfPruH9O9+AQHaEz44EETFkNMgZ0RboOQnGWhym1I+EroDx3+xXMqEYw0+DDSxJhzjKQswsniNbKwgqkdfhjZW+XqBj6966itIRSAOfX72+92nG3OePDgMdv9ntu7W1LwPLzY8DQe6P2Qs6IOHmdtFsdHz25PjgdwFmczKMrNhJUYA21VMRRgW7mKXnPJ02q5NpObkWwJlgIocyviBNaSRk9QAVfTGmW5XDGEQNUoy41l6Edslai7ihgs6wcVJ4slTz+94tWvnOGk4jvP38tdvivHsqnoug4JgeQD3TCyb2q+tKr46LojDUCdOD9tcI3h7nKLjoaXfruX46cd+eSeNw8z7bblZJsFutMCDaQRZ8hJ2CrYuiWNN4hZobaZ2YO51KAyl12kiEY0MjPq9w/MqoUNQlFjslCd3O5psWhoUkNMgaAWgyVOoEmPzzNZ380cinnU4AjH8k7Oksq3tSA4gcpaDiGRgjKqY7O5YNxfMfqU+89VS9YnG16kE8LTd1FT09/tGDtP1bSYypLiJfHJtxhe+VWiW7M/KL//r97nd75WZ7AQE8MhYEPO5RtTTUoBsUsCjsEb9OAxWkHTEg6GP/2L9zk5ec7Jas2hc7zY5jyqXIVQbDk4GxF8GNje3ZJiZLvvUAPO1oiCH29xdcuy3RALe15VFqwldhVna0tTU/Q2+fd5/1ciljFWpEPPEuXhas0ncWAXXakc5WsXJyDOkekTI6RJ15NKrMIErmaWkamDSpk+ed3NTGiOXcjPWy50EfVk8mUu5B2vdyE8JZL35QnXTIA9vzTzblwAS5qmfqaU5skvZS5puS+KUY6pMS9zJe64w2cGz86vO+mWcpyGzh82SQ6WNZhCfOV78X45E47zmVl7m+HVpAn7XJzDxGj9hPHFAE9aEsJVMMYW4XbuUaeEomtK2CnryVpSOdmFOBYEe+zsDORAMwUffWadigjcSJ6EOfMpX+UYcwuXKQfqvtA8pYRxR6edmNwX6khLmnkRUxGa9QnNaoURy4PHr1PXNU/+6A9ohwM7YJ1yaIIkxSHcAV6E7tBxnSJnCE2Ebky4pKTKcb3bURc5RSoTQIuQ3QDRJyAhxtKrcHcQUoyMUUmixBhRhZOTFSkG3njtFbm/xF8AACAASURBVD7+5COub3eMPrJoHLs+sFo0xJgYxxEQhlgs0DGV70cJIeCcRVPWl6WUe/7FGKhMIivSBB8TGM3ZKFomespMXyzXHHIrlyD5hOucxSE8MSOC4+zBGXfX12ifMFEYO4MNC86/dMZJsIzjnodvnRIXgfVZS3frcU54/XyFOa253Xr6q0iKii0U7pMXt7z+6JS6rlisFjTrHoh4Hzh/pWX3zMPt397Ufzn+bowkhZmZS3X5cGbVll5heb47hTElBh9wrsq9MRHqT9+lunkHbS+Ib/wGevZm2W3KBlQ2lKlJbJYsTHECZY8qpg6RiZEom2KpjYhxLBdr+sOBFPN6NuXp3NdSTWyAlDL7vFEBx2JJ/m/ZkovwF2IC5xzjGAiuZrvdcegCp42lqiuCtfTrVwmnXye++Jh6ueHu+hmtKC70uHrAJMPYXXHrv0ZvT/AiuNWGr779FrUVNIx89y+23N3u6cYlIYyEqETv8MC+80Tf49IBLw39OPJr/8Hv8h//g99EDHz7ne/z/o8/zA7J+VKV3V2VFCvUOIwmVg2ggaG7IfpA6PcZoLRL3GKNuAXBVwRTUaen3Mo5bTwrLE0hBKZvTUBkRKsWVWFlAm+1N9x0qxxzoFNbmUnzlJsLT91ZbRrLdbVAJIkrJIGZrfquxCtEUxyeGGyeNBgC6IAaIdLkPTM/1VF8XUpkUyjn57Odpnk85TMVvFRAlkmAjlRhlw8GdgG05ReJ6vZdYEtcf5MkS7TMbREwKR2ZsjLHEZkbDSejpXyYr9HECFLYWVs0UJqkXMby/meyJX+2SQ+txYCWyqHe6MzjzXsTxV35k8YXAjxNCeNR0txUMgOnVNLEp7yFRAgBksHaas48SYXK1sKu5D5v082eWaYYQs5VkayHgey4Sj7M7yGDpcxETSU+U+jNpFlgLuRsqNmCfL89DLk+G2IgaeBwOFAtV/DKqyziRxmIaUTITSj3VlnHikYHJOZGe5dpxBmlLyK5NHgqozSaCIV8tEp285BjEgZrcV45SGRwLltkU261Urd1aTEQORz2aIRPPvmYvjvQD57lckFjlT5msd+ysoToiSkntk8TUWEGl3702Y1jBGMNGvJEbUTwCBJGgjokTm7EBJKwqjgyUAoYDpoIpUGLKYzvZtFil5bkA5oC6iMJhwYljHDYBaLv2Vxki/PdzTXLlXC4+5R+X3F6UvFgUyGPFzy/2ZcFTAqzabC143LXUVUVzz/ecf5ay6oxVKrYVUUKBvlseFm5ezl+ipEPCZM+SIpGSSmgKiXk7hI9fyUDmxgJIaHq2e9HzELQn/uH8MMO9/1/QfXZt4mPfp7+tV9FHvwcpmoKw13oBZHifCpKkrJGSZEsACCZ9Z03DZtZ86Ze5LDM1ZrRe5wYohRtqckAanJEladhQlSCzsJxgRIiqMdyhyq99xDy/hPDgJ58Gfbv42zuMxdDT7p8n+XdHfGNX+Bu9yEni5blyQbTbOh1yZgqel0QU50FxySub3a885c/YFEbrDH0Yy777Xc37LqAT4E4Zo2qSVsu7ADOELTn7OyU07NVOSzn7dBZRyzr1myNl5yvhFZEWeRoln3ge9//S/a31wiwWi0537QsW087dpw+fh1XnRDGxCArFrSk0kx21pwVMwxi6PsaksGliNEtyoo0GZVyt9LCXgbq4Yc43ZPMisSCdPkuKhDcGmtazMWvM0p2bRqjmP1T2nTJsHwTSWuSuFL+TUh4xmr3vxH7J6g5o19+g7T+lQyubQFFc3lsgsZldpsjiDkqqChMUaYtREfs/i9pw3ew/ceYSpB6w1i/zVB/E+meEbc/xsqBVg4Ed0Fwp6h7SDN+ykZ/AN6zb79GZ94kjR6pFrjuU3ANY/UINcsJk5YgZJ1LllMyfiETZ7Zr7ihSGDw0Rx5MhiK5LxLLtdl7n1E//0X8lfGFAE+Qy2+pON/CXBY7skGSZK6baoq5h41kYXbOalKMzfoo1YDG40Wu6oq6aVmuViyXS1yVGZZD19Hdbum6A0okpw/k18uaq4xccznPkZIS45hTzYEYA+MYcsBnmU/DcCCMA8P+jrurp9xcXeKpkQevYojIVYea7Dy7UcuthQpDPUaEiIn5FroU4bkXzlHqFHHAmD04eE1IOV0AkGLWJjjDInPLDD5QmewmHIMnm2xzOxPvPSFmls+gxHGkriq6rqeuG9L+gA/5ZDyxcBnV57+dcj0yo6Vz4+WmJEKItQwhISYH/yn5pFBpzOCyHHMasfhy+pvcdhHl5nlgfWGwElk1LYPAsPcEH0kRnr5/SzgsWD00+H3g2acD7SKwXNQs1hU7Exi3O6rKsHm05HDbQ8ysXUyB3ieWpqFSw/WTnnBa8WizZn/r6XaTg+bleDn+puOei2habPW4MCdnkJv3oGmQ9VnRZ2aWZggR6wcWSo5nEUjxQPPiXezV99lVXya+/bvY134WM3WnyPwzWhLF542jdIbPzIDONvTpPda2wdrIom1wzjCqxfdmDlucgu5m2/ecJyXTR8ralyIWL2Z6zJSILik34LaKqSzRK3J4hjWBpJY4diwqwSWPVBXXm2/QHj7k4tVXsNWKQItqi01ChaXqPuLOOPrFBmzFP/pP/iGbZUXwgd//X/5X9kkwVU0boHFLpFZqc0DHkWEMdDc9N7cdn12+y2/+5q+TuYX8HVnr8N6XGILpc+rcN88YGIA//84Pee8H388hxAjy/IbNesHrr5xz4dcEfc6D188Yk2IDpOTQZDCmxN7EXA8VOGp0ZYF3Su8dn17dYm5/iH3096g0UtsO7JIUL0n7v4TxgI1QL88I1YLDNlCZW0II2HZDs3qLKAts2LPYfgcZP6btvo02C0bzgFB/GfpnVLffpgqfEGKDNg+xwxVV+xnRnRLFoLKY28+Q9GhGmA1WOmv5JrA+SeLl7l3M8JS2SnDbM6QFK79jEX/AYvgRav8PGhmIJ0vCsGe8G8C21K2jbpbI4ZrdweFDoF18m1XVEoY851bmBmMNg1zQNT9Dv/wmB/PV3FImlQwzCvNWvmctpcQceZnKvDbZRXiPyM3aJylMa2GdZtLFlfn9hW/Pooxjn29FyYmNxhg0Hd1w1tq8WceiZ7JHWbiVfArCZPaobRsWixWnmwtOz864OD/nZL2hbltA6ceem+sbXry44tkY6cceTYqrbGGQ8kLifSj0eIZhGSzkQLUYIzEGUoykGEghg79Dt2M87BkOO8aSZN0uV9i6xvhDLjfGxN4aYlI2CO04Mmh2EIpCJQYfI9YsEEZ8EVpP9L81uc+SYBiSp0LoUVw57a3UQlSGMCJWqCqHM5b97sB6tcg2XSInqxolUTct4zBiRbjdbhn8iHP1DGbntVXz9RBjETFYYxmHAZXcV6+2Gc3fJaVDqAViUjREnCh1KeMlCkA2hhQUKyUdXMBqYtzvOIgj1TV3Y4K2gbsKoxvAYtue88cXPH6jxY8jN8+e0u+UuhLsGryAtS2bM4dxFc+T0t/0+burKkxl8SiLtoVxYHsXWDBy2Hbs9uEl6/Ry/NRjAi3Zmj2VBsppXRX3pV8g/OBb8I1/hE2eKDDGiPMHJPakD75F89G38Cnrb6xEGmux8UPu3vl9Yvw95M23MTqSM4ks6jtMvQJS0WsUNro0aM2FPTPrYqplTbQH6tUacRWVNVSpJWqJglGD0QFSj5pNScyGqvsMowO+foQCbfceUj+ka15BEap4jWVExyc4IwxDbpNkTUCINBaaymFQxoufYRw+ZLG4o0nv8/hsRSWK1YgzAWMjXvNab9TD+AFN+oTl6k1Wy98pcVYBqxZNVdYdSY4+sQZC2BPGnv1u5PL6lh/88DOCQt/dFXYpO6+SamFOir3+Xk9LFSVF5fZ6x/NnT8telDOJrDH0feSTp7cEFU6x1JsdUq2zYF5yS5ZJpzTlY6VSUjXGEgIYMyJpRPdPqbbfYx3/BB0OtG3A1g3X4xo1C/C3BPsm4e4567Mz3Maze/6C2EceLf8H6mFDnzYQethfkgJI31OZxMpF1DXcjBu6+DPchreJ20vOTj9iObxH3P8JTXNClCXx9FdIiy+zGL9HE6+w1hLE0Jmv0PEa0axyAKjNsQYqBkl72sOfsQjfwtoWvKNaXsN4Te08pMTNHhp3zU4EKwcal6PM4JBJgcM1RhRbW3qb5TXjbkBDIiblWg1WRiKXtO4J67N/x/X6P+Ngfh5vL6a7rjC9cZI65ZIf5bShlqkQd6xBFhbSpDzv5xvWzLp3+X+LoD43vhjgSUvtPCUSYXbGGTGFQj4mhorNeiFrLCkmXFWxOT3j5OyMBw8fsdmccbI+YbVe41xuInzoOq63Nzz/4JLnL56zu76m2x+yaLw49CanApDjEDQ76XJJMeLHQz5dpcTQdTOQQCPBByQp4zgwHHaEcZhZGWssUhdK2C7pK8tm9FgVDprwITKkSK2GhSb6HMtN73Pz3xjjbPnM9mBlCAMYlwMmVfEGjBVWIWJU+cUaftQBkt+7tTkB15SGyeM4YgWshWbREvoeUWXoB3Zdl9m/yf2YPo+8jbG5alB0ZIW/58KkDN5QngWDcZLT3FPEaKI10Nq8CGm56JpSntuaMMZRyzRpLYfbwLCxSCWMwdLSUMmYAdfyjOtd5Cw6Fk3Nxfk1d7eJ0AXMIqBWuX4y8ODsBFcZFquaOilN7djHiFRZ8B5Czupa1g3LRZMf+6jhR+98mtv1vBwvx99k5EkLlCwmFIvJIZcUm3+9YDw8wX32Q0Qz0xoRltaBq4nB0z/4JvbqL6iHLYNPGB2prOHc3fD0O3+AW/5TzAp0f0c7vse4/xB547/Ma1d1wuLwAdY/Y2i/SsuBkDxD8xUMOdzX1A116nCV5JDK5ZplavAopAEXbzl//j8RxlvS2W+yX/wyLn6KG97D3v0YPflFQvUI8+Sfs6yA9a9SOdjs/y98HEhhRW8sPiTa2mIt1BKpqzqDsJMLtpxxdvGUsdvSjp9SPXiciySay3CtyX0xadeEKNh0IO2uqR+uyQ2VpkN1DlVOKRCSwWAQvWUc9oydp+t7nj69htCzXDiqysy61Vhy4KwzEMphvexBU0ZSSoYfv/cefthjjZA0UrsayOzFGCLXt3ucrVncblmen+TqyD2R/TQ3sg6taNKMElwFWrEdcpuwzXqklmtCnctLXVwgQ4+mLgc6m0/xKfFse6CVCNZxcqJcXbVY7liZK6xVxrTg7q7FLRwhOlZtZKAijYlUP2XhIrHu6A6exJpxrFk1L7D2CXH3gvXpazA+p7GfUuHpvGGpDc3iEf3pbxHcm4xcoM5Biiwu/zmnh29hFPooaDQEyeVHu0x0SehHi7Vasrcs6j21yddgSA0+JMZg8Snx8CywrMcc65Mk65dU6XyFT5bBQu0PrPs/wJ39fYb6lxnMOarnmPCEtv8BGq7AJEb3FqH5MtFd3Ku+2TnmYyrhKpPWaSpdUkwZUirk/z/cdiLSAn8ENOXx/7Oq/rci8jPA/wg8AP4E+KeqOopIA/z3wK8CL4D/SlV//O97DS30YE4KL+GJTGU5nctoRWRESNmxFski8PXmnAcXj1ktFjhriMnTHXa551x3YHfo8IMHtVxsHnC+viCmSAie4D0xBHzwOX5Aizg6BFLKmisK4xRjyuLpGNEUSSk/JvgsSh/9QNLIHLZpLFYVcfnzWBzG1ngd8bmKjU2RUQVSZl46TSyT4RrFaxYLJhRJiWAEo/l5p4gFh5JsBcPIaHOUwtfbhj/ce5I3GQSJoNYyjgPBDyxqS2MNToQQIi5F9vuOu0NPmGhamEX01ubXS+VaWGOPuiqjVAledbmYEBDuIjwopwiNiRplKSAxMoqUPp+C0UhVNE8qQp+UYC24hjR2hMHTtDbX4kXptz3LRYXDsL+MPF2MPDptqbzS3SUSCWscaiKNCN3dgSolXGNxo2HdVhx2kW6/x7oGZy22XVCJkPosy+z7PS+pp787429j/ZL/h703i7V1S8+znm80fzO7tdfazdmnqSo3Zcou7DiJjSU7WAqBRCI3KBKNgQtQkCzgLkECpNyAFC644oIgwFIuIgSyLEzABByBZCMR7DjEdoztalIun6o6/Tl777Vm9zej+7gY/1zHDjnlA8hWxTpD2tp7rT3XXN38x/+N73vf52WxjptFeSq6aE4/vIEinvWDlzm/8xtoruwmS+U4td7g9l+jcwMRYcyFDiHhMLlgzcw1t+y/8LPc/MAfJ5Y92/RrlPQmuodDeoC9/n62h5/BlTPEpxiJPC+fZpPeZhO/xsyGlb/Bm6ZiEs4DWhKd3eP2/x12fAMvifnudRqUu9P/zvbJB4ThLeayhmFgG36OxoLOZ1YC4d2fxbiC64U4gpGRrv80TgtiLeY04gxMBRoCznhaHXlxfoK8KKwet3WvzBkxiysxp5pPqQc2qw2bEjkcEp4Ra0wVT2vtqOX7qYrQegfThCyGo9MwcxpGnKtaq5iWqK0ijNNcndxmkYJcIk1sHVXmZDidA7f7Pd57RGAeI6KCNYausfSNp28Mw5Q4HAf8ZmYua9r7jtOHRPBFh171quIIWaqkwcDG/hZ3x4ljfhUVxeod2IiIYYjKri3cHi0hX2N2r5LsijjsOWvFQazyW5S1MgyGxs/YbiQXx5Q60rzi+sZS7HsIz7E43j9ZpBGafmbXBYbDmvPkudru2W5/Hb/Z0qgyjYW7Q0+Mlq57j/X0U0R9gG5/hLj5XmzYY8tzbvMrTEeDY0/XTCQyj7bKVJRnz1akZPFlJi5FiV9lTpPjMPTk0HG9u8OYhMNydxSsU0QcDzYLXJlIiZG5eHKsGal3zxXZ/x22u1+lXX83am/wp9/AxgPHk1DE0q++Qd69ybD9M2TT3ned8iV6CBYX3iX9dummaZXom4sZ45vcCz5O52kG/pSqnkTEA39LRH4W+IvAf6KqPyki/wXwbwD/+fL3rap+VkR+DPiPgX/pm34Gra6tKnyrYm5dRNjKEpEich/FctHgOGOJYeTrr3+Zt9786v3J4oIe8G1TR0reY4zFWYv3Dd63tG3tNtj1Fuc81lXrrnceBGJKtXCiBubGGBiGM8PpyPlw5HD3jPG8X2as1YlWcq6q/+XzCy3GN3W85xJSErrZkoczCvTOU7SeaqRUQbURIdhCKcJ7c2TrKvvKYsmqaFKMrRt0yhm1MBQlO8PVMtJ8xc889Q1vhgnUEFMixFgFmzlzniKnknHDhDW1cBvnQMgXfIPcjylhEc0XxXqLdWYRQAo513HiI6fsbBXaVxtqZWTpUvT1Vujlw3DKvBRKVgzWVBLwxWJrSybPZ7bbjtYDxrE/T9VpYRqGOXK1Mtw+f8Fh1fL02mBFCeNMyTABZlUYzoU0Ki/1LeuuYesabg8nhiFQRLh5+qieWqeZVBLnacI5IUwTn5ROf6jW7//+xWKcgCUuw927kC5gQ2McvPbd2F/9Xykl4GzVjVgUP+1py8CD628wbwqH2ZKKA020SydHiHTD68hXv4I+y5yvrlj3kebwy5gsNOkXCKeZoAX0HXpfeOy+QBc9pczYsMI/+LM469AEYLBi6dM7cPhN9keDacFJIQVDZ29pj38Xqz1wxRgHVv3APMCzk1+0j7BaLYeorKTgiHOi71dYW3XIqQiNCG3jGJ/+MWJ/hX/+azCs0DhBsBSxlKwgCdHlAy2UKVX4ZhkQ48glI9hFk1ML1JyVHBK0kZQycRgYx4kYEk3bYMXRdT3eNfe/rRgTVn5HF1w+pLEjNR8zxVtiHvHGga8IFuccV+uGR9drNq1HrPD2beLZsw9wbcPV1tPQL3R2XbobyytElomGgVLqAdIgxPnA6QS0K+bzwNV6TaCD/jG3z4/Muce2A50T3HULtmWl77O6eglih4knxvQydvOMRr5BShnvJ7o4InLELlT1WHpaX4gF+mzxOTBNHefQsdvC44czcQrM52fk1JJSzzR6KJbDLJwOsNoE0vTr9OcvQIrk7vPAHZv+fWzqaM0ZbCTPUMSxXqd67yzKEBzX25kcHMPUcBpgu4kUB/PoOJw7nCibzUxRWLWJxtUCxnoYjuCdYmyhaZXGZ+Yxose/B+I4lRZvDcYXNAnx9Iy1vI91M6P/fpL/DipH3t7v70VkYelcHKmyTFXKcl+3fJPG0+9dPGktvU7Lm375o8CfAv6V5f1/DfgPqJvPP7f8G+C/Bf6KiIh+sxLuoqkR7nPqKuOptlqNyL2brSwvcFVFS67jFQGxhpAiSWt+iLOWcZzv8+tijoCQUh0LOu/QcrGwL0cDa5YL3yG2drqstXTtqsIwLYiUpTaqQrSSMnI//oOKja9hj8b7+jWysKSKw2+umd9/hyhUuL/WkZozteUbcqEUCMAHk+WlNXRqGUXJFLyv3SZylT5KUuxCS5q0Rg30SfjhVeGnBsGaWuTcByAv3SQxhrgEC1MKxjmcLIHDqZBTxRsYI0vnb7HLmvrii0tnrrXCp13BicGbwjFbWhRXDJBpDawvAci6uBG1ZhR1bV+1XgpzziAWL7Atgkjhg7s71rsHtNax6j3Taeb5fiCEwvWDDZoNH9wemQs0TtCiNMXgRQgp0bgGmzKPeo+blbdjobcObRzzdK4BwjFws+m47hpuTwNaPHxCevpDs/7A9i/7u+URZsnPvFi9w91v4N78n2mBPJwRK6S0DA6mPdYXxBe2LxfUK7dvCSYI0Sa8NcQYKCq89bVCr4k2D8hqR7SO4Fs0PScXmBIojlIST0xhOsycJ6VYS/fIL6HzAhIJqTLxnFPorskycx6OlNTSesOpZHZ+z8r8CnEltFJoOouzidMsDJOFcaFFiVJyjd0oWq93jFlgwplQLE38RRpW9FLwLz1BbEPOe/I0IhSSNVi1eAei1UBzOwTCcMewP1EAR9VI1hBwSGlgmA9cdY6cZ6ZJuTsGkipiGuacMOWSViZghRLzvZVdpe67SzZBnRC0hpurB1i11LRLg3MtOSvjrHz17SN+ifOKWVlttmS1rLoOa10VnF9eGFDvUarL/WxB8JRMVuEYLIYJZ97hwRMlmKeUQ6KZX+e7nszkdsW6mZmTksPXKOpgfU3yK7y8AL9j086049dwaSIOjjF2xJyIUfE+QewJekXubzDdge3qfYRIToZt84Lt9ooXz4XtqiNJw/HkidlSYqQkizcJ0yamIeLd2zRuxXbzmHL4BsfxGVL2YKYKuF4gT1oUbxJto4TssbMjTgbXz6y7iPEFI4mYDCkv04VWOE8WTY51pxyPhtPoKAJ9N5PVEE6W7W5mHh3HwVPZnYVsGqDDcIvRM1kN46lgp19itfoi7c13kcuKWDoyhdy+QrDfjtIjwMo+J+GZS4+LkSZ/wNxek2T3kZf9x9I8SWX3/zLwWeA/A74K3KnqxZr0JvDq8u9XgTcAVDWJyJ7aGn/2DzznjwM/DrDabLlQxFFzP5KqGWQsgMWLowQWnsDCMakjvxBnYqwZdnbp6Fzgms6Y+0JMLrbaXOrJQ+x93p3kwpiGyoZSqaerZWRYSqqbJJUlAdUtE2Ko2p9S57rG1NZuWcaM92CxRTjoNhvECDFksq3dmEKl86pCUq108KK8Oyuv9bBbtELnbGmMYVdiLWpQimaKXCIVBFIiu8QPO+VX1p6/f4z3zp9aiFYHHrLkALIUT2JqzEGqE2BjPhyZ5pyr1igXZhbSeiyA8sTCWhRLIRU4U7ClUKRgDayM0KJLBEwVahrAiyU1K07HUy18jV3o/IWdcTyPhQDMQ6ARxWdh17ZM1pOsYf3SDW1nePbiORoCXgyNVZ5u1xxSpLEwa+F4KmzbkYxwjhCzsNtd0fQrNAXGY645hcVRjAX30e6KT9Y/muv3e//y20f1vpwT5fwOMr4FNhLHI92j7yfmQHzzF/HnE64tNGfDRO2e5FwgB3w7YDSjY8F7S9tEhqGwaxxiHd46bEmYecZLwQXFJEexGZzhIDdsHrSsV3vKeMay4/0BYnY4DeSuq5lypZLKjbXVXj8rL27BNR9gvNKJYNtAxtLEnnEudL2wbaj0bQrzaAjBs2oj3pTa/VFhnD0r3yxRWlrz3nJh03vWa3i8OhCmwGReRaxFrWcuW5w+I+UZR5165mJwxTBHy5ffNxQeM6brqlVxFdgm1mC95eqqJ41wGgIpFd559oLjcWKzbbm5XvH8gzu8UbyvE4WiixRDPhy3XhhMlzw5yY5UGnzbYzThtGBtgxZwFpqloMJ40hhqIL1CpKU1/nfhbZazPlXGIZANpaLYMQi9F0I7s15VeLNPX0WMR90rrPo3cXJmnpUQG0SVaS645l10zkS/4VwectU47qYbtvoOViPz0DGmBm8ybSPQnwhnxzBc8fhG6OSEsYXNOlSSkb/leiOosYSkdO1IjC13Q0tvr2nnD0gxcUxVNmL3E+34LlchMY2G94LgO0eJPV1fmxRdC85E4twgNuN8pl9l1s2M9BYZNzT+zLqdcc5yGAuNF0pSUrLkZHg2dgzBYchMwdJ1SmNAykwowhyF87nDushufaJzB4xkui5jfRX9WwvH8QXp3V+ibTIbZ8jZsH/bI+0D9MHnWbdXvJL+N5JveZ6/j5J7NI6s/BNCWn3kvvKxiietFrM/KiIPgL8OfPfH+bjf4zl/AvgJgJvHL6mW2s60Ugsma6u2pnpJQZzca6PQUmMZY6pdn2UZU10aokpJqQopc144JLW9VSNYaps950xOiQrnvEDecnWIlVgraTULsl+X8WLVW5GrJsjKwlZZ9FiyiEdrzIuAGKzUQo5s0N0NzvfEPNTCyRoyhaTVLeKpnaq+c7yRlB/KVeukRWmN4qnFfVlso6NtISkihaR1tJVywhvHj7bw9mg4h4gWQ0RrJqC1WCfMcwKkdmBKWAClVeNkrSx23vQ7ImtYHlvdPVdeeHgZt4lhXwrdAnZrxLKzwk6qfqOyTD48vLfdmtcPA23jsCnhsyFJZtaCs5k4gXrLOE/Qfg4oTwAAIABJREFU9gwx4FKqgdA5k2Mg9T06C3m2rNae8RQ4jjPZWLarFpkChkKcEjEXSlgs4nGgSGT/7EyaI3braUsdleYY/v++tD9Z32Lr93v/Wr/0nSr7Nyjv/QIaRsrwOkaONArh7b+FivB4o2x2I2VODNunjEfFGUcx9eRcSMQo+EYwHrZPHLztaHwmphnjHF6AziLF4EyVOqScuDuM7LYN2xJI+Uy7ntApchuFXecoTom6qjqO5aZegLZr0H2m7SBEw2mO9Lhq0p4cZRDazhJyYfaKukTbKi9tYT9Emg10KxiCLo34iIa615YMYIi5Gke+/4f+JP/WX/gL/Kd/5Sd4/UtfXKjrCWlXNM3LyPiMOL4gk7G+drV++72BOTVs3cjTdACWkN1lTGFEUGlxxiIkSrHEbCqnLllE6til5IIhYlTI9bh4r0uTBc0ty/4v1qA5URT2h+fEWCUDcxwR4Ls+8xqfenrDYb7jNO/hrqOxDk31QFuK4s0Sk6K16yRLvBcXRcdy6AdovLB2iiuZkC1hNngTcfIeqpHsbJU+NIEYPQZlJYVN9y5zdHTmbbx5la7bIxFSsLSukNQSsuMUYNsWXnp0JvMm1nhy7gl5JkXPrpmwMTNMBnHKOCk5O4wN5NyS84zNjtU6I7HgjWFdLOdzxEmhk8L3PYTf3nuCyTWGrFiUSCpSi3tTuF6PPOgzOCGlwqPrW5yBOICWTOuElOsYwvtM1yVe8Zn9UbjZZrwzTKPhOBuG2WBMxrjMg+uhkuujo96iM9MEVx6aXsFYGq9MsR7anRa0wM16Zgrv4qcPILc8nwIh7UF/DqeW67XSTZa5NPyfH7EH/L9y26nqnYj8PPDDwAMRccvp7TXgreVhbwGfAt4UEQdcUYWX32TVrkjjfSVny+9UucsSmbJ0SkTIOVXXF7UdqnzIZ8o5VYfXJaeuVG1Q7QzV9k7KmVwMKSfsRZewZBLcBxGneiitxVW5LyBKSQsYcwkUvmTjGaDUiJdLx+biGtTl68gkkhG6B0+w7/02mpWUCxhLIFVOUq6OtTwlvpbhBQZN8AjBah0DlIutUgspByKCcRaTq8h8pY6xRJ4S+JPrhr8ZlhiUXEM1L/yrix7DWns/Kq3icCVnhcoCv39s/dlXplVvC08N9BasMRyXn7mW2nF6YGBLoTXLj0Y/pGaowrPxTG9ayAs12dTw4LWAFUsnwjkGYs44a3np8QPS/lDb7FPk9s1n3Hz7a4TjyHgeib1BfEMxhk89ucFbx93hxAf7E4dzwYsiIREUYkjEceJ4O2FEiV6qkN0anG0Rxvuf0SfrD8/6/du/lHT8Ct3xS7R2Zh9idYD5hNMZ22RcqNeNFkcMiXXXst6s2I+FVBLjsUWmloOJddwyZlau0DYdlnptjjEiVsEopRicszRaeLR29Ksev9pzDgFjBWkzTbZgIyRh09XuMaUKtOvPo5Bjw/N9zxwtN9uR/aRsnGPXKFZnjlHwraFzGd9VGONpVvpVIBfD7XNhnC2uqTFLYhWjlnEYFnYf+Kbj/ecR2HIeBGs9xISK0PiZYnp89xrrm1coZebd97/McX6bV/oNn2oVi+WV9RGr1T6DlKXoqRMF4x2kgjXKzVWHLWfEeY6nkVCgzBPYsLSV6gjPWkcqF0bgRdh/2VfhwoOSovTdCmstx9Oe918ceOWVx5yywTZC03kkG0K05FI7W2k5aMPF1VWz1kR10cZWk5+RKmBPwdB1BZ0Vb6tTszcJMZBS4jw6xFZO3sNtqdrVYjC2sGOiiV8lOMPt2PLitCIFwduq/RCxPHmSmSOUckaTRSUxpw3D3FDSit4J6/aOnBLD3DIER+cdaz/jncEnyzA7rh6NNC7gnGEdYTgabFGSzby8bZn7QKEwRQtqmYJjjIbew3Z3ZpoE39T7ZZqUc1IaW+8t57NlPzhWjeJMnfKsWuXxdaZWndCvQ3VxZ8NpMjxYJzariobwbiIbIUzCPFqOJ+U0rHFNpOsirRNizozRM0eYomGzKfhcGKZAGB0pKV6EKEpJsJoC1mU+an0ct91jIC4bTw/8aaqI8ueBf57qWPnXgP9h+ZCfWd7+xeX/f+6b6gWWzeeCJqhcIYtzDrPodYDF+VZv7oiQU1zmyBUTX3KujorlVVsooFIZQiHci6CR+lgpFdyIWHKuF3LJ1SVnTL2cSsnL2FqJy3PIQjC9sFy89ZQFDldKrvwlvQQrLkWgKNbKgkYwxFc/g33/GwylIJrx1EDI6C2aFkwCjttcOBeHF+Vg6mO65bEYS86FvqKzqdptJRflbDJgWUnhR3xi2gk/t4+Iq+J1MYJzDusghnDPcrILLb2yshpSunCtuHdDosrKCt9mDRtbaKigvihKT8Eb5YExbG2hq7rPD8sQMcuY0bDRzMzIXTIM4rhpCsVYQircjQVtHNZkjFWe3PTsNg3D1FFOAXVKY4V8e8eqc8yh5kj5vgNv2I9HvHGMcyCKwTuHG2dc4/FFmaaAxgwWTNcwWmitw1qDu4DiPll/KNYfxP4l8czm9u/gzIFcMl2nHA4dD5sJ5xPWZsRYDtFhs4KrkEYrVMenURwDh5PBZMETyAWSb2qXOSsqBbvOdKtI1wmnN6QexKxHmoRfnSk+E47KOAli4aqBdXDkYpg6MFiMEUKIhDHgmxarHqaOxszEqDx8oPimgnCNKjeTZTh5zoNl0yWmbOg6pWBZrQzew7qFUJTT6KomMkZirFqt4uDJ0x1//sf/VXzbsebM8xIqlHCJcDKkinXwa1a2p+RMTjCZmewML/fCd766XfbiOj1wxixmF70HXiY1YHtoNmRpCDotkwbHeTQUuRiQEgoYsegCHF0UUVWrpBBjHdXNZcAYw2rVczwd2Z8n7sZUOxypjoCs6VFbx5cFsIvtvVTO5FLoLZmo1tZz/OV1oI5p8oQo5KUYXLnaVSFb8lwzQK0RJArD0TCp4MRCrtmlj7Yzcyp0OtOL5eGjM2FecdSGTTdTzhaCR6SvrnE1mODR0ZJ9gVXkMFu6LtI3M0kLmyXuxMsd1lpWvXA+egYRGpdxvkCb6DfgREnngXWxpFILz3EUUqhuwVI8Jns0eZ6dDCqJzSrQtgVnQKzSuogrlnGosTGbPpCdks+eGcu6D8RgURVu9xtCycwiuDBTGqWxynG6ZtZImasO2bqAc1Uy0jSZkl0d286O07mjlMx8zsTkcL4WuTEZrAvoIExDw6r76Ev/43SeXgb+2qIbMMBPqerfEJEvAD8pIn8Z+FXgry6P/6vAfyUivwW8AH7sY3wOLgnilyyamBanxSIgr6e2RDEs1O8MWnDWVNqqtVymZ7UhVShURpK1laJbu0hV2B0X4XhJBeuEvHB/ajFmFkFhLRzEGMTWUeKl+1IWkbhodY2JmCUoU9FcMffmotta9l7rPZIL5uFD1tePGJ+/TxEhilCcEIsiziIpYyi4rHwjCy83hVPI9MZwUwN+CKWwUcskhSRQjMUqOE21XWqq40ON8COdsrM9/8vdzN3SwUox44wjCAgGZw2Nt6Sca2cuJQxSeTQ5VT2Awo2B12x9sYLUk50UnCqNMVwZw8ZkGqngTLtg70upKAC7xAXE5cXnLQxSOCVDEOVkHXd2Zm0NguXpaxv+6R/4Pk53J768H3jl0TX74VQ3y+d78J6b3RZjPSEGusWWnEokUZDG0hoYcqDtOzrXEsOA6S1DWzBtj5XK00olL6rfT7pOf4jW7/v+JfmMzkeCVvdoDtBbqRFHGmktDLPhPDsaUViaQKpSxdEpk0+ldskBZyq7OeTaPcpYclJyaoiNw4WAuY7L9X6Nf7Tibv/3efHc4lJLpoap31k4qeJyoozCQ2NonGBxlOJImplLpO8HHnQTbWcYsmXce9btTNMYSlPY9sqByKDVmJSNkKJlOmTGWRhC1XmKFXIppBhIucJ0jXN0D5/wqe/6I6j1/GOf/x7e+NpXCSkve0HVZNVoglJF7HJL02WKyXxlFl5/0fKlduIHl7Dxi/D7MpwQrZ31VBRpetQckRKx4sA3qCaQmkEqRRfQMvwuJMlyGC4iFDJOJjarlvFU9bSaKmamFPjKl79O4zMhR1IaefzSFSXCaRgxjUNke7+N6HLQllx1u/VeVk05zjpeHFdM8wtsrzhTRdSahGfPe5Jamj7gm4JOllyExlYhfWMTOfSco+Foq8lo7TNX3ZnTqYGo7PzIugn4aNl2hdMYKM1MbxNHTRDbeujUgPOFPLc8P7ZoaujXmaadGYPFZANWGUbP47UFzqysEAJMe0FcRhqp04NoYICmzey2hRgsWTIZZddHotoKRUXQ0ZObgg3Kel3F7e+95+gNdHNDX5STQpo7DscG5zKmiazagk/gS+HTuubL78ELzTxYTZyjoekTTbOM/3whZMN59pSiWFtYbwqrvnYi5+jYD2uaHMma2XWZ09BwvQqkUvXHH7U+jtvu/wL+2D/k/b8N/NA/5P0T8C/8Xs/7D3wMKcUK01pGUlVoXavBEOb7x2mMlXBNxcSnlGreHTWQMsYal6KlAiwvQvFL1k1hIZKnVIsiIxitN1xr3Yf5bbG2TescexnRLciEhZSAUNuq3vt7mGUdHV6CgAQRu0Sj1BOJa+oIsnz2eyiHW1KphZJZnB5iQbLQLI6zL51mmlVX27mqHEoldXsRRuoGrEkxkshAFnuvz0IFGwvqlB/eeD67avmZZ4EvnhPZCDkHVr5lmhNFlTkGWuew4phiQgqkRVLmKbzqhCdtPZGqGAJKI7A2sBN4YGFjCmtraMSwhOWQtOoLjECV/30okG8oWOtonWfS2mb+tgdXxLajm0d2zYo3vv4WZYhYsTReePnhDTHDOI1YC08f7qq7Yjhj80TXNotQtefueOJwiJwRSoxoTLz8cMsrj3d88d3n7EPGNZ75NGC0sF2t7/lin6x/9NcfxP5FmWnMiW1f8D3EUFCdmZNgMYxROCfDEKA4y8YL3vSEORBiQlPESaJtPPtB6TqDsw7pLBP1dO0wWN/ji2HVviDiYDJ4B655wnrzdQ6nwO668GBXi4PnJ2U4KudsaXuPtVUbZKyjaT0lFbwpjLlQPDSbTDlDJzBmJYxK45V2O9PnxPN9Q7KFuwy3+y2NTYhLNF3ESSYHh20cWgp92zBnBWtIsiLMGWkSP/rP/LN8+df/Ll99/evkpIikKkJGManwjfff4zxmYvIMFhwF15x5tY8sARpcxNc5K9OcsM7gYiGLkqeZVkBkZrKZWCCXBms8i2AKY2qHrBhFc6xsH2E57NaA8q6xdcQGeGvImMW4VPP7YqiieDUZcYo4uOqVXVMnAGYx+dTbmd6bjWoKcV5yCoU5tgzR0zWFlIXdduJ4dDRtYNXCPDlk6DmdPTd9IvmRtjFohFEi3jiGoeVqPRE0s10nVC3ZJlo8yWRsV3h29iABXyzn4xprIze7E+f9muPJk7QhaGF/FlZ9JtrA82PDrlFcAZ2Ex+sTuz5xSJnb0XI4G1atkoYW30SsEZwB5+o9Ypo9KTmcyaweJDLCae5RjazmnhwcbRNZbSdiUJwvPHCZ49zwuFVcmjnTkLPSJKEXx11JrFYjG5txsaIornvPE5tJS5rFfDa0/USJljlbTqPA0nV1PuObuTZXgiVlT9MX1s3I9S7SNcL5DNtWOR8apDQfedl/yxDGVUsdKVFfbKUUvGvuLfEpxYoMMNVlV0rVJl3CgFWVMNcia+mWVo1NTsuN0GIbX5kkS7FVcoZimGOoBVnOCyNKsdbcBzZe+Eg5Z4xYrHWgmRhnvKuVqTG1u2VZEp7hvtgSKgsFqSnNxQr+yWv47/xe7n7r12t0iSreWhxKdIWQoBfLu2Phsztlm2ESmNTwYKnejDHYArPogl2oRaKTSl/vnWXnCisnrCx8u4XPP4Zf2Xl+fp/50mQIc6B1VUwfQmZMC+Oi1L83wMsennpDIzAWZdQq8NoZZSvK1sCVhU6UtYX2Mq4T7qOBzFJ0XjRq9f9rgrdZirBc6in5xhneTTOtGA4vBs4vpvvfcV7cMcZamqbBe8PxPFLU8XS74nHb07UObwzH/REZDSeEISiFTMbw9gcHcoHzOaAoKSU6DMY50qW9/sn6ZH3MZY1yc12FzuOsROoF4K2iIbM/rxkmT05CMgmcRaSSlHOGq11Ld1UHR/HWYeaMcQ3ZOXarQD4pZCW7kTE51nNDOBiYDWGj5CFR7Ofw/oucTvOSP1ZqUWKEIEpadFM5joxzWsgsArZhdsqkYM7CeF7cbF4wtnCcwTjFeEOzzeRJICrXrtA1SnSJnAyffmo4x5kXe8FbS7Pt0DEzn448e2fPT//UT/Nj/+Kf47VPfYp/+y/+Jf77//q/5Dd+7e9xHEYMivcNt8e3OU3PCLNlLp50FrxVHmwm4mquxQrKJRmiaQrbZuIUZjRBmCfmnAnJYI3n9hRqAUNhXPhtF3Cl846UE2nJNlNZJAtSxd5TsWRxeG8ZxokizbL3OMDx9FHLej2RXEdSs4Q0N6jrMWoQozhXG1qpQG1qL7pZ6vtMWTRRRZlPnt2DgETDA2e4ah1jSogohwhJI9JExmBxLuJMYmU8YiKSHH7ynI2jvzrhrgN2aUi8OBtcW0gu1YN8SpxiIU6eziS6dWTlJ3K03B09rXpKgnF0nE/K44eBEi0pOQ6xo2NmNBlrlLUzpKx0bcAUQxgbJjWkoqz7iJ57slq8zWiOTLngiaTg0Sax2k2sGiUZ5fZFS9DCw/VMlz3zZFh7TyOCJs/kIsWNOFeYsyNkxRHZRMPxDGwNa8k87BxmHTmHhnfuGlwD1kbEFny2HI513IwoxmZW7ZmNwKrPGIHDXug6rVmFXcLmj5ZxfEsUT7JU/WURg1fjWiXFxhiXgqbCJENKv9tCvzjwLqwma2o2TSkJ1Yy1/v6mmy9jOT7E5dc2qls+Z7Xo19y4jGSpc/GSq6Jfy6XfjlkE7s65KmLWhKlMgAU3/Du+v0Xobqwn51g3JyO8+rk/wvbBNbdvfY1xOJFLoJeCDgNxSjTGMAXlbhYmA9fWY3KonTGpLBlHLZxmgY2CF8Fp5qY1eCPcWGitp/EeiTOtOH5YCp9uhNtk+eIEv3XOPC+Zuak5fldG6I3h2kBCsGQOWRmLElA6gSsjXFmhNYWNEbYidA4asUvKdv3GRaRyyOA+tkC0tm2rxKz+LqxQXXoFislYqSwoKRBz1bJZWzOIUsy1c1U8ZMthmhkjvP+i5nk1VumMJaVESMqcwXUNKobOCr6xjDGz7brKxpkjomCxy6T2k+rpk/XxVy5wPAtjsMTouN13eJ/YXI3sesNVV2/8zgs320A5C+VYDzree+ZUSC9aQshkCivnUAGjHmdgaIUcHdv1iTQWQvJ06uhWtZPduBm3fsLYOPYffIFndwVjMpHIrolsnOVw6iAXzuczRQw5CTSeYoWYhNPZ49cJ2yRSchz3nnPytLZwOgm7pmBKxrpIEGV7dUSKIEPLpMLdITDm2p3xXVu7XBr40X/qT2DHma/80t+g/Lk/Q9+8zGe+43P8m//uf8S7b3yF//F/+pu8+8Edanve+IX/hpWLmMZhIrQPE06Ul199lT//r/87eOuWXLrFyYajuA2YA9Y1YBuSzBTjKTjW20hj+zq5sG6RUighRGKILDkQFBSjNUb2Xhi74FWcbTmM+/q2gF80t7eDJWgPxbG9thhXD19lwenUWBWqy7vIPcCZ+kzkJcli1Rg2DZyCEoaWrs9cW2Vd6kjzkAtNN6LWcpcgq2G9Dmw7ZU6F02g4uUyvhtYYrDUMZM4RGldY94YyC85mQhBCE6F1+NAyD54JIfWeR7tMtx3ZnSJjtrzzruXJTUAkEVPL+0e42gTOmmrjohjEKxKpEw5bi5HDnec8OMqmx3nlNCe0T4zPenIWHnSJvhvJo2d/sNX9aCxBhf3QkebAkz5QckPbGVwU/GrCaqFYZQiWkgxN6+nWiVgKro8comOiplaY84UDJsSzsNoUDqEWkbtNrveQYtmIQQtYH0lTleaA5XSu+igvyno3fuR1/y1RPEHVFRlkEXBnRC6E69px8N4v/JAazqglY6h6HETxrkNVKCXV912wBpfnlw9PHWpsFc7lfF94NV2DYO+7IyUv9NoyY7TaXu2SNF1yrKNCgZwjxrgPE6mXguzSdYILm0qra8+5xYVXuy7blz7D1cvfBiVTcqx/p0CaJubxzHg+c44T5u7rvDfNrJ2jICStIbreKF6gNZZGaiHzwFVtUgaurKdztsLZGk/IhrWZeSkWbiTzyBu+p1NOoTrm3orCXoVTUl4P0Irgqe66XurmcyXCWpTOVLfERoSVqaBPj9T2eTY8j8JLrtSwzCKEZVx3Wbp0k8qSI2elpmBbo/RtJWAB5FxV+ro8Jvt6Oi6aKVlpvEOlauRkKZ7HrFjXUCj4prKmrKldxKpdq2PEYUrV4VgglfBJpt0n6//DEjQnnCnYRll5z3k27F9sCf3Meh1Y72qH5nxwdMbTdYnjOGGsx+TEKxvLW1OsGW3OklNEY2Ewa0Qdjc4QDY+2E9ZMJF0xnKqpIpxO+Fw4nm5RUfaHFbv1iYfXVbZ51RhKNpSl5dGtWkrrCCqM5zON1EODpoQaw92pZdtlciw8agrWZ/Is9I2y2SiTK6go5wy6KmyweGO5m+3iXrZQhMYJ2/U1/95f/kuEMHF9/ZCLs7ptex6+/Fkm+xjpO7RkVg9e4fD8fUyb6R1Mo3DMnn/85R/g2z/7T6BaIZP3h1ERilTTj9gqWyhZEHE8uYE/8ce/g+P5xJvvnFh1zb3cIuaAUl1cYgxouQ+UrcbpWthqMXjfVgCwr8acMJ/ZrLYYE3AYgk4YtziRyxIqr1V6XgHOS/t9ASuLrV/DRXaVZ0McDKFkrAhs4YOsvAiZXWr4VKMc2oR5MFTCtghdIxxH5fnB41VY9wktFmNmpqwcBiFlwVjHKidWpUPNSHEFjY51N2FsphhlDj3OCfhIDB7bF/qS+fznKm0+nJXcRp7uznTr6lJ3WDZdLTznUHAddXpkM0+7gcPB4EKHsakacdTxxCoTSrIF7QLbTeLG12tnHMBnKC4xzJZgI6aDr+w9Rjydgw2ZwRbG2WKMQrBYcTTqeK2JfOHo2JeZvlNIDucDMTo6o/QBjsHwwclw1XucZqI1nJKwWkdMdoSh50WAKVayf99GNq1w96KhSh//n+tbpniKMSKL8w2qo7aO5dIi4C5LyzZXxtIyYnPOLk6835FLV5Yuhan6nyomr4M8a2voY0r53qIPy8hQqsNONdcTiWYoIKbAEhasmPpx1leXR6odrpLyfSdLWVqzKVahopiKT6DQuNUygspVJG8qKTeLRbAgCetb7GpLm2/YIWQjlGdP+eDXfpExJWZVwpJNt0VojbAxytYWHorSW8PKdbQkrPfYyhZHSqGRTPEtWwpDiZiScGI4qvCwFB4Z4Y0Md9bzdgh8R5u41nvcFlaEnakvnM4KXqAxNSKlCkAzDcL/MdX8qZed4rUKYZXKprrUkpX8JEvnThAMBwrSNXhxy0+xCsxzqaGgSA1BRgTRKr60RnC+FtVeoGAISw6hcRZn6/dvpG4oLG1/NZXY3qksJ1B+V3H3yfpkfZyVs3AY15RcaL3SX52Zb1eUIsRgmaylawsWJcaGbtWRwgkxltN5YtdY5rkQYqHrW4wIV61FnGHVJZIUpqh0c0M5O/KmY729ols58B3arFF3Rd++zOl9y0Nzy3Vec3wBj24SZvA83lVnb9EKB256RzhFiBmbDI0okiyn6EipYZwK29VEtIlzrqNs12YOokvgsaexBbHCrMqcoBiPdw5ZuhMYz273gH69Zr3ZLviZi78NbvcHTufzvYD0+77vT/Obv/wG++NzihYe7JTTYPiNX/tVvvSlL/L5z30PKlplD7bqXo3WQ7cVoQEaW7i+dvyTP/gSYj23L9ZgOzZds4TCLoJaPsxQBYNK3WtqkoIQU+3o+6Zm23VtFYuXnHjtM99J0SPj8Y5wjsRYaEpcOjLlQ47T4rS719waRbIuiBtIRRlzvYmXYvHrRJsNCcPjzczTdeKuJDZSKy3TGvqmcDoZ7o5rqlmxEMeMsUCrhLNhGh3SJKazQa3DNDNFPXcnT+dmOmlALI0JmGZCtbC/6wmzpW0jV9cRixCToWkUeRAJRcjRVg4WDe/uDV4Cx2lN20YerBLeZbQYdmsl9xPzrBQjnAbDZ59MrFEOfWRlIcREEcM0C/tzDQ82wbN1uWqplhD7OUAuHSsTMBK4XkUGoE8GFx17VVZZeGWTURVe3zu6bUCSBZto1bA/G0QtJUVGbfFSWDcFp0LxjmQLqybxbDDEkJgixNCwEmVMH31D+JYpnkrKKLUQcdaSY0TcRfxcsQMXG/mFR3RhD12YSiktXaTG3RdRItzb73OuAEwjF54RcFHgqJBKdeNpqS4wv3QxVHQhc1dQZ8q1A+Z8C2JIYcLaOmbUnCmaMdbiTG3xqgjGXIRnF9vqotfSajcVrSNI1/jFkSsUW6GVrTHoS5/i4Q82jK//Jodn73BKgbUIprU8amFnhCsMV2JZecFTU8ANBbMA2UQEsR4XI9YkjBiiOFot4DKIsI7QWEtE+frk+Fyb6bQWeUHBIayk6sqcSLXhWlPhY9ZSFufcF8bMv3xtUVu7ToYqgk/KEnZ8+bMUMgLnokzOUazHQM0DQzCasKViGGQBhtYdqiIlnF8gdMvX1HhPrnUvIdcIn0sXsmaKCZRM0kpc974WsKqGmC/Q6U/WJ+vjraLCeSpMU0fb1biklIVHVxMJxTeF89BTdw+DaCImlsLeMhfldop0fYP3npuNJ44BXXmyBMZcCMVSVplNMrRXj2h8i0rV5WDraaaYFTevfA8vNX8bayZeGGEOlmtv0MagzhIWbSEpk8hsfXVa9euJlA1lTMx5JkU4ZrfsrZl1UxiiVFNcVHoL874nqEUlAwVxBt85TFSkNTieIRQ5AAAgAElEQVQi7z2/5d33X/D0yaN6rS/liio8uzsSY933qk5rxfWj7+Vu//OEWIN/tSi3793y03/9J/nuf/8/xFIdcxfpQ1FqV0gF6x1t73n68oZvvD1wPEXee/+OMUz80VMdv2TNFVUjUp3NZZleUJ3eRSGkyHkecN6RY8C5BhFL0bjwtmAeIue7gaLQ54RmYYhKG/XD7tViiinUMSN5MT0pxJRxpYAr3Dw6cz71zNFxOzsahdUq8WyeEVclLSEL8xFuc8swOs6TYwy1Y2g2z9ntIq02uAR9sbx719B1SyfdZcZDyxwMjg7jKwusINzNhk2bUCJtF3mw+7/Ze7NfS7PzvO/3ruEb9njmqq6hu6vnZneT7ZCULImSaEmwFcSSbEX2RSI48E2QwHBymfwLARIkQIBc5SIIkvhGiRwhAiybkinJIkVRItlN9tzVXV3VNZ95D9+wplys75zqAFJAAUnQCGoBB6gq1Dl7n733t753Pe/z/p6A74Wj4woxnum4J7QV6z4yH/UctZrj5YTpOFEXPdO6J0TNohFEG0iG+bjHpEg51pRNhw8dRyNPcLA50YQ+YBCOloJWgaqCrhOqqs22kUmkWUXqCra9Zr9JID1zDAvTsjfzoCOV0rQroV0r0JEJwhWtkUl3HuPmGkM8UIx7RS2wToFCBVoMvonEVjOuLTKKXJ47HrbC6cpQF4IpIiP5nBdPMSa87weV6Iz1xCNgJvnP/YAkOANWnmEDzm6MMcacQTdMS2mdPUxZj2XwM+XCRWtN8PF8fNRog/eOEAPaaBjabvnnD8RYNEVh8K5HVMK5hhjJF5nP47B5mk8GRII+J5erITQ3xgzFEyWYz4BA9aCSpQEvoI2BwaAuZCvVZOcSTxrFbHmLB15Yp0ATBR8MythMIFcKaxKFGrAPyuRiL0FUiSZFkjGYCDoOfBOrmInCJ6FSoJynUvDTY9gxiloSnkiPRqVEMUjMWTXLO4QdDlcpaL6/SrxcC5u6J4ShjXcW6jm07nzKGXc5Rif7AlCC0VmB0yrl9yGBxuaid+BuJcVQEA0v36BaGWsG86fGFIrOnW2Kjz5rKeX2XUJyUaeyBTSfODMfKzseHq/H68dbShJlFeidI3QVhdXEPuG9oirBr0oUBh8jo0Ljuw5blhCypLtuA7ONiiuzyMN1oigKJDWMpo6V91TKUUhCe0VZ7FFOtmBgsClAtKBMwuqIi1P29Yxp77haW1bOcXshzHSN2hSMLtBWE1wYBmQSI+3oe0uvYDxxVHWPWWoe9AHnNDtzR98WKCf0a0vrhSU1zlnooUuBSe0pxiPAkiRgdYGMSqq65uDoiPFsih7yQlOmzHB4eDwchPLVliQxmV6l90NrJilCJ2xMOpbHn8DgS1LD4U0GBSu36xNVbZiEku9/7xMOj49JrkfHhvG4plLZ6xLOJvZEnSMLZPBhMtiSChLbI01tFU00VPUY71sKa+k7YXFwF00goViuG+ZDPqiEhthZRM1J4TOTgUSCxEG5AmK2pEQSe9uBVDYcF5GTdcX2Vs+siiijKJXQEjlZGJZrS1l3JAKb847JpGX/YARBOFl5DhpP2IKNUFOPVuxONKM6g4dVgqUErl5c4yNYCQSvcU6IaJbrgssXV4QktI0hes206jh1mmWrUSqwUWe4qPcGrVtMmeic4nRVslhZJhOPkcDWZofVOWLHx4QpsgLXi6IYQ0PEYWlc4HRZcOVqhxreFZU8+yeK9aqm85rGRRY+Z6ZeHWsiERcKjo4USYGtHKX2pFliMsre1qrJE66tS3QhYYses1ly91NwRrGzuUJ7WK0Tm0qQSuON5uFaKKSgdT0uRmrj0EViUn7ep+3k0QSFiMY5hzEmT8pFybEnQ9/ofOpt8BWFgZYrwx2y67oBsKnO/z0OGXda63zBDFWpVpzjCTKzKSIxktRgKI/pPBRXkmCspXO5ah8mTdFGKK2lA1AKW2hKa/E+ZIVMDVlyKSd4W51xMykNLCj1aJIvx6KcSaOgjcnPeYhD0UZRxZoLpWF3lFuPbVQsgqfVI5TNo6JW5bR2nyIqY2/Pz3yjGHDGkpJGJI/bKlFEFRFPDu0c8vmuFDl/a5LylFqbcmuu0oYoaShwLOs+UJcFp23Apchba/iHWwLDYyjJUz8xZnp6jJCiDD6xLHOHlCNqosrCvlIq+ydUVhQ5L3oGGVzr7OFIkFJmvpxhJHwSjAw+OjUUiMPnQymVwRFK5Swx0sAOy367DEYdjoyP1+P1Y6yUhLgeYZJnrx5AiVbYtoZ2FVln8hJTq1F9ImhFaQXnEsEnyrpElOKgy+TxaVxRWcODA41ULWHS0/dC02hGccKFURo0rPyVQo94oa4MWifeXmgWbc0oRqY2oVZtbkvp7PkjZmN6j5BE0ypN0zsKEbrGoATqHcfTkZz7CLhxR/TC/n5NSU3wlsp4jHhmukNLQElFlOzF9CmhdcH7733M7/7Lf81/9I9/k/SZzLcYYoYaD8VLTmpI1NU4j7rriO9gMnOMCqEuPWdRKmc4GRHB954iKUrJvDnKyHxaUo+u0i/vk/qSVHTYwp5f0sbocyBwGhTrvBflzDxVGGxZE7UlsCaKpm0bnPJEEu3qGK0LTtYNwfeZDwjMR5rp2BBj/tlRsqKWb21piLZKOUEiZU+ttpFFJ8ymnvF4RVnkmaSTLqBKjThDSIrC9liVSEHRtSXLBrTyLNYWKSJdG1kdBerSEtBUhWd5YjDRIkXPaNyxWgl9b5iNhcIGqrFQj3raDg4OKnyw2KpnVCSaPtH7xOmyZFK3UCWsFcajiI0Gox0BxXweKeuWskgsT+H0tKbtetarEhcstloxG+cp+HWjKEXRh0TXFuxu5yGrxbHiYGGYTjwb08RJ4yltj1aK1kWW/YwfHUd2a8NCIrWBCksvLaXKYMvmVEHh0FUuzJUIfi10XrM8sGA0l3c7NnZ6khe2neeTW2PUWhAbKEyi0h6UpuuE1anhqTEkLX/JFT98jv7f3FR+3HWmHMln2nI5eRpSCjgf0AMe7cyI3XUd1trz9t1ZIWWGgmP4yXjvhpaOnD+WKWx2AcVEGphQMeXRfGM0ylpUEvq+RQ2tN200epiCkaHdFIciLpF742cXYhwS1Y0xuZALnhAiRsl5sZbjT7LSZIxG20EiH4pCM/xehbHnBZRSQh3GjMqKm13i/vM/w8bmFpd+8A1SiihbYWXwhZGwMZNRkuRsvRATncl+IJUy2DIoTYzCzBQkFQlujVIg2jDTIQctDmeDelB+zthNGs2691RiaPuOAsX3G+HZCrbM0I5L2bgek2QO1fBOKBLhTDEc+CpRFKARYzCDCTNPcgCSiOfw0qEVO7Tgzj4TIUZEMnIiDPE8wqPiOsfwxGw/EMky+rn3YfAoPDoIP16P14+1ChOpYiJ6Qx09YhRp1hNNRDFCNZFoFMrAxuXnOLz/MGcopkiKnouXXmQ8rTm6+TYbhXDaRcqyICVD0CskaVYdFJKYT+5RygyHpu0DJI+2GitCahdgax4eLXF94qhNvPqkw151LJNjg0A1rnHOo33OEdU2sV4KJ80Ma3qs7ZDeECRR1TlRYHGqkKjRNjAaLWlWUFWaulqhjHC6cuiihUJB8MQkKBRKgQ+KYCcUpUXE5L0pBfrQ5/YZkRQSxyfHrJoV86lGU7BcNiidFT1TC/Woy7YOSvIQTsIYz6wOdOuOSKZ+pySsfeJ06aAH7TyuWQMMntn8ng2up5x7ev530ESCQB+hz5kmg082oXW+nwRrcoRISkCGI+d8UouTkqzR5D2P6Akx4Xy+X4QI3ZkVJURKXbJSFh8S0yIrNatWYzXEPnJ8UrDyMJ+Ai4qHhxZrIoVNTMcdTddw79ChusjGZYNPkbHxNK0mJEUXEmVIlCbRLOdEn2C8YN0ZVEh0a8PJSjEtPBt1R9IOTVZpbArMjWdWJYoyEkhMR5q2FSZFhzU5Luy4V5QmsT3LeIzVWuN7jzUtViKFJLqlYtEZZlZwMSN5Ugt9JyCJceFxDk7XIKOOFIV1U3J4XLNdZ3vGfhOwpTCdBVLydAEetorgyLFAjcHqMEz+ZeRAuwyYyrG321IpOD3R2TvbW7TVGDwbVT6kNyKs1tlOM9WKTYS7zeccVZDVg0G6TUO0SYwZVxAFWxhSioOp/JGCcFYwPZrGe6REnS3v/XkrzzmX1QifEb8yCL+i5Hwy7qyAS6Rz9YqYICR86DEDvEOhSEOW3pkH6qwdmAZP02fbi9aawZ+lh4Lp7O/DY0pmFz1SzPLFbFQuqvwgWdsYGVnDm/dPKCYz5k+9SDi6g775A4wvUXZoQcXcHrNElCpYpx5Rgk2DfK1NfoyUAytbF8B7lFgCgUKBlZgjJCSXO2e9e4uQVN6IRsoCHhMNfYp8b534d7cgJA14PNkYmchFl5JhNFhyAZU3LxkAdMPLHfMpTZ15BoaiNA0/58z3dAYwVZIN4TmnKqGMHsz/6fx782sqMExyRmRQ/HJhba0a5PyzPvH/kx/wx+v/zyslKIPi8ijRjxzJRrRPnC4LQivopNisFJOdKVs7Vzh+cAAChbUUhaW0hmq8ldk5o4bKawodUbEldcJasidQysihWzKvG1Jj8X3GniQ8Ggc2sX96SNv1nK5zQOtb90ukToy3DHMpUDoDDLUCaSIkTQzZDGxEqOrMqrMSqaKwdoq214SgSL1mPnbU0wVda4mqIaVIXYKUGmtHRO9zyDiWdS8o05CaJatmTSY6OxYnC37vG/8Go/KFJkbY3N5gW21D6NGqpFQdWgWImsUCFmtNypHF+fClBGNKVDFFtUtScojkoaPkA8l3uWVlA1vW4kOejlYiGax85rUarvezA5VojYg/3ztELEoBCkSd3ROEpu1wfZf38PMD1xBATyKqfM/ofaLrHa1POB9wPhFcOLulsGgzqmJnpHJLkoBrBV1HtFHMtxyTlH1efavY2+o4OC45OtUsfUCPI1UbcsutFy7uOLQGXXiSM0QvRPGkaNDi8UHRdYqTpkDryKgKaBWJvcGLp94UDJFKBwKw7CKTWpEECi2QeuqZQ4LQdXkPNioT00MQSgtV7RDlKFROnbBTIbnIeJ2ZUeujmqMmT87tbTWsV4bGVRiJLE8S880epTwqKqKPrF1go8yt5dgaDh+W1LOGVcqpG+vh82wlQtCsmgKtwRaOug5Y7fC9pqsC3hkWS0MQRRlTVsxUyiqZi1y0CSqY1pHjpbBu/+rr/nNTPAXvKGxBCnFgNaVzcrhIboPlFlpuc1lrB5O4p+s+QyBPWX1Acpo3SmeT5nChCDllO6dc54mt3AUyiM5mQW1MNiaem2UylyPEYU4kgbYGo7OhWSS34JLKHi2tdK7wyVOEkIu7lBKiNUoGQOdwwWmlEa3PxLGsqsRESh5HzmOKMSJKsfbZCP/8tOSbf/Yt5jrx4nqf7aImWo2SAfMwSOcuCQfesaUEP0wmeAMElzUZMYSU41IKo7MHQQG2gNahs9LOmXUMgX4o5Dwxf2CjRhvP9040V4rIRaNyxMuZ7pMPF8ShMEbS0MaT86LqbO4FoO97CqszdFQPELuUX3d1piBpjRk8ZiIgkjMFz5OHVS5m+74fPkNy/qWHYOdznwMyUOsTSj8qth6vx+vHWTFq9iMstWBUbv0rlVg2gltBZcB3wlZxDWU1zjtGtSaS6F1EtGd5732qyZQ76xO06ZmUHVEN2ZxOWDaG6HNc7a32Fte2r1KkwLLrwAlGLItVx4c3jzKKTgKrHsKBJsSSzVDx/LOBojSIrXCrHnQiURJ9QXCCHRlWTWRkEqYXTtcVRdmhXcHcCr141kvNRpVQ5SlB5Wyy8YUt/ul/+l+yXgX+6//iv8F7MDGP7pejEcE1TIrstfq9P/gBL79wjePjI7qmGw5wg9mIbINIYmna3EEogkeKRNPl/T4nT2SrgRLJu6NERLLioBVYbfDNQwpbYGzFjmkZ62x9SGeFztl2o1K2F6REGhRuUQolGud7tCSU0hhTUxcWa0vatmM2MVRlhYsMxvU80BIHuLCkRO8jR6ueo4Vj3Qe6PkM56UOO7IqJUSksRXOwLLHJMp+0bE6h9bDaV0TtcSkzxJRk/1GKmnUjjEctKnj8qRADNMtAM+8ZYXDrgvW6JkmXQZ9dQe8A41gvawSPmIRSgYvbCSueIAnXZ+jrulGsuwJVJHwRslcrs6FxC9AmUtmMwDg+VjRdwWTkaVOOFxLlYBzpAGkTQRKjOkdxWR2oRRgZDyGHBfdtop46xhse12a+IHrNU5d6TlcWryOrXrPqIhe3A6lLeCpWLmKM0DXC9lQwhVCoyP5xyckiZ+IZ67DW4VOkiUJURbaClBlUOxp51svIuAjMlGEmJoOVi/y6/lXrc1E8JfKN1Q2+n3TOSMpqQjPIrlpn8OGZ6nSm7FhrzzlQkMOEs2dGwRCxYqwlDebwGM5CiPOj5xt4zIyVsxZXgnNmkzC0iB6FFBMiIQ5KWEwkGRQshOjDZ36zR0DOECKdX2d/1WC2ljSM7np3XlCde6WCH6Y2ZCgSFKZPVMbw+jSyFzouvPvHbIUObIk2hhAj2ueTU0iCiomdrIWhk5AkokJ+XgEQiYSUKFQ2yWuVzluHVmtU8gOwFPSgFJlhoytED5tHonWaP11FfnNHkVI2lKczsAoaIWapdvjeQE7D1kjGA6gM1gxZVM0FrkA6k6PIeAclKt+chuZpCh7vE0VRDmzShOgcuxMGHERKQ3h0ChiVp3hCivn1Rw1+Kc45MI/X4/XXWZJgPLYZadIZjAl0y5KiiEyU53CpODlI7O6t0bP9fKAqs7+urApWixMkrChtSeUtEzRmqSiS4t4q4coe5xQHJxWBgJtEjhbX2a6nqE5IxnPvOLGKETvqKXxJ5RSrtcfWlq1tyUVJgq7rwUeic2ix9H3E9CWzwrNVBqpYcCgNxxEulp6ZsgSrqEaOi6Wi7yNtsCxIRC/ouWP3yot8+W/8Iu+88z6iDGJ8bpvYjAcoqg1u3PiI+eYe3/mzH7Ixm5CGKducupDO2UoR4WRRslxPMq+GSDXu2fPFsBMohCG5Qdm8TypBxQyp1DaB8qzWx+j5NjFEWpPQtiRKGq7xfJCOMBjGs/KUOX75vtD3EWsrgmuJMVGWFdoIkiwtLdNZgQ/jzG3SKpuZ+0DrXEb6pcTd+wfcuPkJi6NDfLvG9Z6m91ycay6MNe2xw8eGOl4Y6OaK+w8KjIFXntoj2DV37h3TeA9EnDc0zmAQ9iY9Kw/rJjCdgiPRLB0ffRopLmnEBDbHa0obWa5L3LqkJGCmCWxDPeoRk/falBLBgu+ywnTcClUZwEWi1yxPDURh6RWTUcN4FCls3tOtDWxMcwHaNQWiIuNJSxeF41OhHoFziqbLB+YQFW0XOVklpqJoo6FRkdluQ1l6mgZskaOaC6PQKfLEzhq3MnRVx8blFmMTrtGsTg1CZFQ0RGratUUko3cmRrFqIsdLS10ItQlMS8FoB+OGZmEI2tF3QuoMQSJm1tM0idgqlM4CyuXp571tRyaKkxLe+VyoDOsMRXDeukmPiOLnSoLW51j9EMNnWmJqMJfnG3mKKU+mDMVQQkg+DNwgsuqFDH7yrIrk6axMzjWSe69qAC2GGEkhDMZvneWZlA3Pvc+FlTX2PGtPm/whDNEPIaAhFy9xgEX6bK6OMeKGu7gShdJnKljktC65ufM8z9x/m8tWUfkObXMcQErgRciRJ3nCLkke49SSfQIh5tdJy1nLEsqYcCmcTykSIuoMJEmWpVNMGJWVHkXCKsNSQPUeI8J7jWLXRPZE5cmSofjUchZzkzDnr2mGaZ61x6KAiwmlcxGbYjrfIBPDpKPkFPQwKIaQAz5jyptg7z367HPhZfi/Q5EYh/deDdOMMat5LkTi8HkheRIpT2A+LqAer7/GSpIngRWJ9aJiYgWDZ1RH5lVgVwyfLDWHh/tcu/oU1ij63g2HPsP69IjXX3mBtVuxenjIlanGtJr37wWsjaTWEFaGLgamc+h7TYfhuF9SiVAjqNJjXEm3HtN0UIqiHglOJaq6Z2Mvq/haFOvYDRgQRewdZbXGxoRaKi7vwqdHgT4JB6Zj2WlOesXeXKgroSHQdI4YNdokmnXAmEmmpKeAMUMRKRZMRaELilEFyvDWO+/ifU/nXEYenO3zKe9NZz6kl165hFEbTKYTNuZztrY3efKZFwaVKl+cVqeh9Z4yeTwYHDnjs4iQfGBxumS8M0LPA1WVfawu5OzTM6VLhn1IK6Es1TBUpDDKZ6xJVAgOU5V07ZqyrvEJ1k1iOuloOkuKED0cnawIumB3FxCFlY4L5oCRekAjDYu+ZXGywqsxD5eJg4Wjcy0hJOaTmlXbYzSMC4P3kWo8Zb5dYNuGg9WSg7Vj3QhiExUBwoSm8YTGYUqFKYTJTHFz0bE1CqR+RmwEGxxT8Sjts9JmAs4L64Whc4aq6JlMPGJyPpyy2WdqjUPbnlGRCza90BQCrAt6DSIe0YnpJLcm830nopoCpXp0VKwPDfWkQ5Sic0JpA7sbSy7qgi0UdxVsbjaUZSK4DKeOwWA0tJ1mZzerifOxZrrbkSzEKPgq4TpNcBW7E8GqgtO1xUWPJNiYVugiK5kzk4hE6pFnM1hmmyPuPlghRhAXmJYlpYLtkfCFqeGgL1lWNUWK2AT/23ev/6XX/eeieBI1+Ji0zpNhMSKi0NbghziWM9UJHhnKYwx5amNQmmxR8Aj0/ci0DeC6LnuHhjaaNjnAUrTKocQqFwtn980zoNtZq+/sRp5bTooQE1qy0TumhI9hCOgdCjpjIYEP4Vwizu23bMLM2XmPnmcKGV4XtRraW0OhqFJOJxcZ1BzhR5deRPoFTx99gtWGY6+YjyxelxAiYsyQ6DsgH87N1PnPZ2+6Ynh+MY/9WhI9mZtkjcqm8kEdE5FzIniKKRO5fWCsNcdB+Mba8Y+2DUGFwXgpBKVQMaIlTyDFMyVuaNLlSJSsAqFz6vXpoufj/RVG55adMRalMnYCZIjFMeftNyEb7tEpK3eS9wdlhjFmpdFEfAxopVBG52cR0wDGe+R3SzENHqjH1dPj9eMvrRJbqsN1Bh8zrNEXnt5HTKmpxomL2gNrYttm5aVbE8SjdUHvA1IoPrh1i7JucF3iC9WYZ3Y17+5H5ig6FVkHRR96FseWiGVcFKQygHJUNtLFHrEhR60kzZcuwroVFssxq0VJnxSWhBHDWjwqJaazRBUaXIKTo4K3TiOqCtRKEAPOCzuVZlR4bjQNYy1MpOT2UuNVoCgVfRO5cfshDw5WJApUyjYKUlaB18uOe4cNb/3obXy7xHcdwX+mH5I3WJBEUVX83V/7T3jm2WvUZYk2Fm00RZEjus4BlzpPzfa9pyIr9VYpkiRms5JLu9PcFjOJuoBqlPf3mOLZsHXuFMSMRLHGZGUrgUhgPtaQPEi2apRViesbNre2aNueplnjQ0mMBdUsq9rjwlHJEr9eoY0dOiPCvf0TYu/YX66RaDhpOnYnJfNpQe8MKXhQiqqwVAXsbcxIaN5+7y49woXtMdcu7qLCMa7r6VrHUQNVmaiqEaftkqpOpHXizo0ejGLyvMJ1ik0bURuJ3nUkrzOo2WlUKdRWUReJogBrFDFYVBiRlEeSZ2cjF1mVgq7Jz9XYDu8stCWjcU9KPdIltkpBYRkVFVtzhQ5gZYRvltxDcCExGglGaZyL2C2YacuuKXCuow0BWyWqDUOSMrdEnUdUJPnIybJlszJUJh84bt9fc2GUD7yWMRul5qUrNc/tzDk9avjevYarI8PezgYvXtslqIJCKfres9hfsCo/ZevJ5+lO7gKB0HoOP73NzdPAreOe7Y0pSBxUv798fT6KJyAHAw9TUAzTbUqBMSTAFsVnsANxMJarc5XoDCmgxDziPoVw3oKKg5qhtCaQzedqMIjbokCQHImQ4qPJrGHlm7CCkFWRJGlI3A7ElAni2TAezgshW5TEkKm+YQAFOOfO20IpZHkRUUMOksIUJTHF7OUZIgO0Vhid8Q1JabQGFzQ/uPpVPp1d4uU77/CEP6QSzfGgkIkyiBKWrmNaqMGLnVlLIVmWJCb4POUWz9qlmdSdfMjtOYQgueVoJE+ldUPLVIumU4FNq3Ah8FsHiteqgpnqMCn/TkFnjpRXktuFQwMuILRJ0CmezcHlSbnhfXQBDk4d+VwJiiZP/2XL0/CVn9fgs89+rMF4LpKRDiobobDqDIA5hHAqhbUaox5tpMYajORxaRfi49Lp8fprrUSinvdsq5Y9nZjPhd7nqJaqhNhB0Qu9X/LwXo/RFwiS6F1gczLi6HTF9Y8/IDSJNhgIlg9GntdHNVfnwvfv96yiQplsyrWjDhUV3pXYRFZUmgKlhGWXqKrE5qTjQVJctJrW94zGGZ3i4qN9s1mvOTqxzP2YJnh82dLoHJbOcIgI0hElYILQNuBJbBWBcR056vLVeO/2Xf7033ybg+NTXEhIABsSUkBKitX6hLffehfnIHQLHj68f27NCAOyhahA573z+vUbTOdTLl++mDl3kvd1BgtDSpkLOimFjdrh24iXgGhF1IbRdMZ86wL7i8haRVZxSVRlLoSG/cEYnVs12mBszjiLgCKQ0DjsMBacgRCRIitkKbE5n9GvVxR1YrGIWGupy5LxqGI0rjE24LqOUgcInuAcyiQubo0IIbE5KtnbnoAIbdcNLEJN9BFj84F/Whteem6PPmSKOKL5yS9eJZmC/YM1+6tD3n/4PqTIzgVDFzwnBwEfhHEtHOxHvv6lmrnZQ0ukiwmCIDpRlppJZZhUJZU1bE4LRkb45EHDdDQmeU+/OmGrTmjnKN2KHz7wrLbH6NCwMSm5vYZiVHD34ZqnWDDZmTAqLbvjEbrQnN454d7tBxyvOmRvl62JYXs6pU6eUndoDEeriLY19eaEvZ0NpqOa7e1NXOc5PVrz7ocfc3TsqMrI03tbaCOIlJYAACAASURBVFH43nN6dMprT9dc2tuhjNC1LdqYbCEJPcE7fvXrL/Dw8JT9/YaDuwc0vuB3/ugNbh+e8PTlDZ4cl0z7j9geF4DhWz+6ye7OhPHY0Enig67j5750iZ3JLvzh51h5erRyD1wNBjx8yFMmWtN3HX2bGU6ih4gUBDFyPmHX925oN+Ub8tkUnC3swG7KRVbqI0hGIlp5lEmUA4HzpFaIZybGhNV5Qs7HADFmQJsSjC0JPgxtKc5VGUi4rkWUhhgyyVaE4CPW2Ezr7tsMjpRHj5PyaNkwT5KXkke/XwyerDgLgci9+WX255e5evApXzt8CyURpQzWLUEJ/+Io8lQR+Zm5wusEXtOiaKxh5ONgtlRonQuVEPLvphgK0pjQRqFDLv9KneNQMr/EkEh8Y2npYuLf2XBIssQBRuCVsAwJnXJRGcmeJiUwAdrBh6XQ9GlQpQY5qjAKHwbj5fCxSDlVeJD3MwU+DN9ypmqdv2rdGRAhAwxzcLmQO3KZip79W4Mr7UxylP/rOPPj9Xj9OCsm4fb9iq1Kc2F3xYnz+BQofeK0FfCADKFN5QmHhzWlRGbzjTyoQsPR/Z5qPOfhPozrSIXmIHgOGhhXhnXsSUlxdEyODDGRpvUUWphtB5qmoulgrCBUDmMSIgGxwnNbcKI1MSSCcoSUfX9N4+g6R9SJ/R6CFsa+ojagdURLJJpAMUp0OtImITqFEj+YxQ3KBPbvHxJW96BxGEkEsk1BfKIsIpvzKV98aZuHDxQnx5v8+R9+k9HeFURbXnruEnWZIDtOs6KkFWMd6due4ANea0LrCCmSEixOj2mXC5qmJfYO1/b5fhEEE6GWxPa4YmQ6rC2ZTHa48/GnHNxLhLanO/iYdrXG2IJ13wMRpQXftFgNEJi6lp96cUpwnuBbUlIYe4VKAspMadwE73p8CNQFuHRE8+kpvcBhzNYNrRLG9zy9WxNSZHdSsmo9Kxc4PVnReShVjrcprUZSQEdom8hHD3o60TRdT2UMyihu3kl41+NiIibHnpnz8tMbbIzGXNme86dv3OFw2XJhr2ZSGJ6/MuPKfBtlSt795DaXn9jAEJnNRthyg/3jU7SquHn7Id9/5yOenBeYIlIZTd/0nFSRO0s4PDzl8hMbvLJbsuiEZdA888SE9SqwLlb83V/6Re6dtHxy9w43Tg44OlZ8880bXLs05idef4aiqvDO89SlJ7h90PA7//ovaHzHv/+rP4syE/74O2/h+sBXXrnGn3/3Az59eI/trQ0u723w8e33uVyPuXrxIv/iT97m0lMTfvbv/DzvvHWTN967zetfeJlbD/a5d3yfq7vb9Ouehyu4lCLXLu7w1ofv8uwzF6jMnJ//auR4vc/2dId+dcrBaUdrA89f2OAnXnyWe0d3+RsvXeNoCT/48BYnTeLe6uCvvO4/F8VTIrflzng9576mAayoJEepKK0HUnX+/4Kcc53O2nsAxmS0QS4MzNmDIALe+XMeE0ohSpOCIwVPDFnCLazFx0CM2cTXtfl0cNY2rKzNZvLB7BxjymDPQQrJ+A9BmXyaOBu3T5y1GjNe4ayJpQSCj+dKSIgeozVFWZ7jF0IY2mEDzqB3jqA8YLmxdwWqitdPPiLREFSBij2/uiP8d7cDX9gwbEdFh2OqEqXvcaLwg/EaFD5CoYRSkfEFwTHSgh6MjEkEneAMaikx8efryLeXgX+6ZxEMrSSOg8qakcvgzIfOsxlyPEsapu6Syq9tkYQg+bynGVSkUrGxW3K8nwN7z6b8whC1U2jJfrWYp1kKk5W5pveDOXyQ5EkY88jfFVIe0SZlvpRVMqhZuRiL5MP241m7x+uvu3onRBSUDW2Xr6cHh7nNXdaRUQFFHYg+0YZE7/uMCuh6oo9YI1CBkjUXRgXHrbC2gVXICpYxwkwpdIQTJTSrbFOIKRcqDR5VLhkrwyxWBDTeOLRxtLmRhmUA1QY9TMsmSpWoTMtSNdQjWHaa1hdMR9C3ms40eEnIGpRN4MA1BanSXN0zEEqqcsbiFG7+6M9opSYiqKSJSShEaB7e4t0/fMD9H4xZnyw4PjnErQ+IxZxitMmnPzLEASiskmO19hRGWHSecTXClEXmyvmMFiDCYrHEBYcJAZ88KkR8dEiEoBKIxpKoC0UIidPW893v/rc457E6om1B0znGheJ07bBasb1Rc6EW7p8s2diesX/acnDYUViojWL/eMl8XnH5whYvX55y5+4Bd/eXTKuSUaXY2Jjy4uVNLmxvcPPuId966xazUVZ4Xr+2y7NP71GUI268/zGx9bxx64Dnn91mZhRGWeZTy8ZsTmyX3Dw8paoLlidrRBSbswkxRe7cXVDNR1yaFIyrkiYEmj7xwacP+N03r/PUkzNee+YKH9x4wPNXd5g64S+u7zOd1lRlzY1PjvDO0SbYX75HbRVf/7de4uHBIccdPFHPCXub/PD2Xb76pWe4euUiR9+9zv0H73J14wk+PI4oU3LtmT12pxdxq1MKY7i9v+TG/in3DnqsGbG7bfjaqxf52s9+hRevPMHvfutd/uiHb/Jr23s4MWztbvLU7gQTFbrv6PqOpiu4c9DQJcOi7Xhue8ZrLz7Ld969x9225YXY8eWXn0ZP4PoH7zEuK944OOXFuOL5S9s8ONjn2rVNZvXT/KtvvcP1+w2IZjqd881vf8KiW6N94MqVLX701geMCuHO/WN+/t/7OjuzCaPZmPGtjsPeY8oxT+5tcGFvgy583g3jKRujtdHn5uJc9MRhMi4bya01QB4dVZJn6LMqk4seM3h78nh6GqCT4PoBZaAEawvcUJzlfLtM4M5Tdo4UEmItMfhcsAw4Aud8VpDIqlhKib5rh2Dg/P3eeXSRm15KhL7rhokz/2icPhuPUMo+gsRFRQiPCkcZYltiGEImh4lChpu9934ImVT0eHSCj+spr7QVsV0RnUclobaWv7cDv3+34dcvFIDCEQmiSNbkFPWY6FNuS4oVpPcZ0kn2WRkSUSsaH7BJKDKdiT9ZJP5wHfkPtix74vEpgrKMUGgcoi0PgrAZAyoJfpDodcp+KJPymHEQIYoMwcN5pHXz4ph+3dGt/OBtStg4IAYERBJlbbE+t1HHoxJbWNq2zdM0gwpllND7HMKpVWJU2VxIAUosTZc5NTlkFEKMhAiL7nEJ9Xj9+MtqeGnDMVaKB2uYrAyzlDhZKFQrHJSOOT0qJpYHJSlovA7E5DAF0Gv6boQZ9WxMl1ybjHnvSPjYJ2Zas2M948Kx8JoDDS0KIxFjE5ghiqIXZmPHzX3hWlmxdg4JmkYnfIhcmELwieB9btOrrOiXIfGwE0JKaAwuedbJ41MFSXjm2VdZPzzg5u0j1l1iVBrWqzHvn5DVYTnldN3yrTdvM9/aYu/ykxlgaTVKaw6P9/nhGx+AT7QxUKaQo1m8ziPtkk3CyJD5FxOF0Vht6L2nKCxd32OVZjqyzOcV9w+WLNY9/+QfvM683GDRJHzfYgTm06zsb09qPrixz2/98XsYrfn5L15lYzTmiQtjNqZTbGE4OlzQtD3zzQ20j3zrz97lV37uWS5uzDlxju0LTxFOT/jo+kc4a7HGsnTwzjs3uHphxtdfuYKpRjz9xJg3f/gpt/cXnK5WdOvAL//N53jh4gYP7h3wJx8f84MP3qLvOl57aoNkSr743GUOO89PfvVl3nnrJr//vesUSrM9rVFjw2986WXe//gu33zjBs8+pXliZ4v3793mxYnwwhde4H/637+LlsCrz1wkhcTulTn/4O//EsoXvHv793ji4kW2K8Mbf/4+X3/tGca65L/6X/6AUnuev3KJk+MTZnsT3v/gU45PWh4cnBKS540P77DqWnb3ZnQusFw2tF7zxo3b/OyXX+HFp5/kd/74TS5t7vOlZ55lb2vOWjrmGxuUVcn7n9zm+ad3seMxf/Tn17m3v2LVdvzKL7zCl155nY9u3eWZ40N2x4bXXnqSj67v8+TlCadr4be/8X10jDz95ByXNNdvPeBvfeUljtcLOjVle6vjw9uf0nhBwjGXd6eMyxmxbfnyixe59cmah8e3mY0sh/cfsndZc7R2PFge8OqzV7i4+wTf/+GHSK147bVn2bt7yoefHsC1KaPpFtoe886H97hyaZcghveu3+KLr77wV173n4viSSTHrmiVGShneWmiFFopXN+SUsL1ucCwVuj6fiCJ58JJyOZna4vscRoAiDFmo3ieWtOIMhniNrTrQvAD0iAXVgnO5eEYc6abLSqUZJR/jOAQQvCkgTBuTPYYJaPpQ/Y1Re+z10gU0WWYmrF2iErJcDEhEaInpOxx0krngk3IffdhYi8lhqlBPSAPPDHmliQxm6GVstkrpQzRDLl9UXh+At85cdzoAtcKSxCNEXeeJ3dWRFqRHOWSMk5AGYsJER8cLgpeWQqEEB2/sy98v1P8x3uJDZUIovIpImm62DMvLKuiQC1aaoFDgXagDp/FN6ShxIlkPmYit/jqiaYRhy0MfZP9EFrnQlCSsPI9VVVQFpaYerrgUUoYjwxJCvrurOASJEZsoamLXKgWRYFzPXVR4n2iLiyJNOQWCsbkaRweF0+P119jGYGL2hD6yKyH6CMhaXwQkk0sFwVto3LQqs00audDHjgRhdSRKnaY3nDSl/QSecICVUK5yEalSF7TNYbNIiBasFWgKHpOlgVNW9AsLetVInnhQEfckFDgG4UqoBGBGDKmJEWwFVH3mCJAI1jRFHXHtII+Kg4XMBoZbt64jXGGMmluPDjE+UiQhxkjIBkYaU3Gl/RSsntJQAxKBKUtQUVOmj4famJiESKiYFopKgO1sRRGcDFRFQVfvjInRIWuSk7WDhc8J21AUuTaxTn/+X/4y5yuet69+4Dm4Igf3Gx5/vIOp4sFje+pKsPBSc/ILfjK5U2e/I2f4P7de4yLklv3T7lyecb1j+/xvU+P2SkUFy7t8n98901+9ede5uqzV3jn/QfMXplRScE/+60/4Ne/9hoTXfOnHz/gF3/6Featxzy1y+svPMODZU9L4nRlmO5tc//627z+pWvcbdfc+ugem6Yi6gnt6i4/+fyTLI8f0ivF6194kdv3jzi5/R6ffFjz0YM12hRceuoyN2/v4w6O+Wf3v814VvGjTw7Qkjh8uGLZe6QXvvmt96CwXNidM55ts79+wAtPb/D+e7d58/o9trcqrl3d5cHBGp0cq9MFS7/k8m7FUxe3eObCJcaV5nh1ysWLO3xy/5Rf+cknee7py7x54wBJK159epdXrjzBLH5M3ze8em2HG/sn7G6e8Pq1J/j4zh3eu32bpze3+aM3blONAj/98ksc3R/z0cf3OGk77i0i6v4JyjV0yyn//f/8z5HgCd2Ki198hjeu32VzVnHnfsfBySmj8YQHD06w94/42lee5flnniRg+ef/8tt8+cWa7XLG9Ruap3dLNqebHJy2vPHh+/zjX//bfHJ7wbf+1TcZT+c8vH/Mpd2KO7cX6HbNtd0tXrpymW+/fZO9zTGvbU+ZTbYYXzKsusA3v/MjXn1mB2s1exs1oe8poufwtOc7f/HeX33d/3+2w/zfrBwM7Iky+FwGHpMawnqRQdYVTYwJXFafMutDnbf5tFK5JZeyiQ8fcuBwjIg2uBhpnRsKoay25JafI7sbh8DgKBTVmNitH5mUh4s/d35iVqyG9mEIAUlZRkdywVSYAhf88PM8qNy2YpjwIHlSykb2z5AZzp9TGL7XmMyvcs7hfRjsUbnhFweCV0qKFBKrgcCrlUFJIEqkxfBv7xh++0HkH10YVKEACY9SBh+GfCfJJv2slEWSAgkuF5w+Ya2h6wL/w8PIHaf4Jxcj2xkiTkgJL4q1a9nUBa4a0S9a5vKIl5WGvmkIMWcKkk3i2b6a261BhHpSMaqhLT0y1ucqXzsgBLS1WG0JPuJdxkQ4FxhPR/Qhn2rrekxdFTSrZW4jSKQsSgRFSImuz5l+W/MZTdezbDoiMgRLWwT32DT+eP3Yqwvw3tIxHgc2NhInh5r9E0XnNL3OWZFtW9FHTzErsabEOU8Kkd4n1susKo9Lz6ZKQMRHhe5gbyaID9hOEYNnfyU0vUc3mvmGZXMe2Jp7brvE0WmBMQlXN5S+ou0tpVFcUYoQDOLzeKsKgjE5AmTLFsxLQ1sHFhpcguZImEwjM5uBtfNZ5KjT7GyMcMFRjwr+1k++jC0ND/ePWa9aFAGvZ6yiw6assnfB8/NffYH/7B9+maQ8N6/f4ea9BRd2N9h0x9w96liL5cVLW/zw/RtIPWKxdrxz4y6/9KUn+M1ffZW/ePsTvv3WLf7OTz3LnZsP+R//1+/wC19+leMbR7x564Dnnr+GTY63P7jL01cv0nUF9+/cw27MeHhwyvc/vcuVi9tc31/yM1+6xrPPX+Pd/Tf4+lde5KeeusA3vv8+X31qk6kIFAVhvsFHd/a5+ckBpw8e8vvf/hGLaNgZJa6/+wFLRnz9b77Mduv4ow9u8vqLT2CWaz587y63Hpyy/P4tGhf5hdd2GCn47T95k2ee3mMyL7mxH/mZn/gCm5OSD24s+eVffJ0nL27yp29/i+cuTHlqWuLmU9Lc8mtf+xK/++13ee25HX7jF3+CW/eOuXn6I1576SqHBx3vfHqHCy8+wWaRWDY9H94+BruJjwZbWu49XHDSJObTGVaVfHJwjE49ExIHJ4f88OM7PHtpB2tq9i5dYOeJCRcvXKJzhk/u3+LBwRrjPuEkRHQ54c/eP2B39/9k7z1jLMvT877f/6SbU93KOXaFrs5humdmJ8/u7HJ3ubtMK1IyKFkmSNlfLMA2DEGAAUMfDBsQINOgbBmQSEnLFUktd5ezYcJO6unu6Z7u6a4OVd1dOadbN6cT//5wTtWQtkZcfpC9MOb9UqnPvbfq9rnnvc/7vL8nxRs3H9HW4nO6Bvu6qB1UmRyIU67ZvDmzRGdcJSlV0rEsFgVeODPExkGF7fU1ZDhMs1qlZsHWXp6GV0NTIJoI09epsV+weOpiL/cWd1jbq7O8MUNLRCOuSbY2CmwrJQrVGuVGkVdeGqKh2ZjFCj97/x6abdOZiFG2TTpbEizPb5Pud2jv7aBRdljZXOXi6SHqZZO9/B5uuMiF4xMsLGwSDllcmDjOzKM1wiGL7laNtJ5mNxOmULc+87z/hWie4HCxwccD6LqOaZp+RpnrYug6uqEeASyFEIRDYUzTCkZbwdjMcY4+qqobEL39JHEFCZ5ECUZ1yuHWmweqpiOFhsT1IZOahhqKoEkH17ZwLBMp3QDhrwTbHz6AU8ogqDLYBPRNN36sCZ6LxEPXNFAD6rYHAhWERFE1kDbS839PKUBTfDUtFAoFXicH1/H9PN5f2iJU1MPVXd/Q7nouVV3FC7aE/e0/iVQ8kkaI51odvrvX5JttKmGp4CkC6fmmIsdT0IWg6XgYwt830cB/3Lavrm02HP7ZjkVS0/ivOyElfH6SJ/y/s+s5xHSdPcfDLJZoDR6eK8ARQIBW0RSfHWX77ZSfXyhkALDziFYFpaYkHYtQdJo4ju95s70mhm7g4UffOLaDofoeM01VqVaauI6/suzYJmZABvabcRVF1Xzly/Y5M0IR5EqVAKCqoagqtmV/7nn6vP7GJaRgcc9fqc+EIGFA2JPEwx5V4aKgkQk3cByJ44RAOtSbTcLhCGEBhgbCcbGbLvOmTjosGU3CZt2jXFfQgIiAtPBN2K4jiBqSmOaSzdjYDmSTNvGoR6UcotLQMU2FaEjQkdBIhgWEoOg5hPE313x132VosJ2MFgdd4KkhSs0mB0WLlKERD+lYUqBoGs0eh5ZkGE0I8g2JoWkcH+rgYTpOpVTjWG8ri/tVPlxo4qi+uiw8STlX5Wfbq3zj4jFOdrXx5tXHqCp85VvP89bb16iVIJZuJZXOo4Uj/NIL0/z4vZvcWtjjoPoJ+zWTdDLC5k6V9YM6DdejeO0RTcdipLeDrpDC3EqOF4/30hkL86NrD2lpTyJwcFWF3/zlL9CTjfEv/vQ99nIV/tXqbfSowlgqzg9vP6Feq3NxepDlvSp7xQpnRruxaw0WQwX+y7/7JdZ3G3wyv8rvfPUCtx6usVhr0hpOIrwaMqKRqznEDYFqSP7x3/8ltvaKfPhokanhMboSMU5Ml/nqC08RM8JYtknEsrFKJrlak+Utk8WlJabHuynUYd/T8aTLiZFOMJtIx+JEXwelqsNO/oDTA1nMmk2t2WS4r52yqbC/m6M3E+bZ84NEQlHuPFrh8skp2ntaufnWXRQcKtUGj1Z3MHSNnsFOFtdrKMKjuyfLQHuGR+u7WNUqrekodbOFzdw28Wwby9sF9vL79PX0Ua1WWNw44NKFSXAU6tUKKxvLjI9NoxwY5Op7xGIKlnSIhiJUGhYXpvsRnoJuNologoFsnOGTnTxYyNGSClGsCTa29sgdHDBxcYSuFpWp0U60aIxyLcdQey/1qsnCVonx4VaaDYf2rg7qtTJX764TwWJ1dRvVayKVMMVcGS0kSHSmGBwZpmzuEzEMMm06O9t1Pr6/Qm97mHAkRbXc4NqNGfpbkmwWTW4/vE84lUWWDD68s8CLF0ZJJjOs7a185nn/C9E8+VwkDT1QWTzv04w48HOAhATwmx/HtjCtJgQNAlJihAy/2QgCdIXwvUNC1fyYENf1mwHhGzoVRWB7Lqrur/h6LrjSBSExrQaW3fSp5YHKdMhvkp7nS9Yy8F4FMSCKqvjRKyh4nnM0Qjx8TJ/GwwSJ6IqKZZngegHU0/OVJc3nGEEwqhNBs+A4QJCRpyrouo7rujiOjfQ8HNcKtgwVpKZiSpeyotLiuuDZHNMluzGN/2Xd5JczKpOxEJ7qUG1I6qpCRPjATNu2MRCoYR3XqdNA5VrZ5Qd5lzNhlV9v8wgH3jIZbAZ60m+28DxSSDTFJ4g70udKCenTxP11YIkShAQfEpU8oSCEiiYg5li4dUHRqWM7/ghADWkkk2lChkGuVMaVCqpuBJuLig/bEwqq5wWICw3XlRhGwINSFTRVw3UFIh4j4aPcMHSdSNhA1w00TcNxPRr1Bvl79z5dKvi8Pq+/phIGXOxwKTQhHVHo6cnS1CRuo06pCo7jYcccDE1i1j3md2r+64dqoKs6yVYd6eqcG29nZ69KrW4z2RGir+niOi571QqDHS20pHWmG5KNvI3UFdIpm3KjwVBLkvHWGI4FjhZjr25TbQrK+QKJeJhsS5onpTjVukBTXEwJhmti1uusWZL5XIFQMsFXnhnBXcvjJk3UcJxrM3NMjfXSk80we3eZkaEuysUKM483+MZLF6nWLK5cn+fCmQlEOIXnVJGuvzUmETQtm4pj8eWJTuxShY8X94nHo0QU+P0/eotnTgzzwlQL37syQ7StjVefOslP3r3JO7cWmexOMre0QTge5/yxLpa38hjxEN88O8TVe+sUahbtqSiPVzbpbWvh/OkJ8vk8T18eZ6S9nT98+zZ97RmaxQY/ur9KTBP0d7Xy5M4yE22ddIVDFFJx6pko46MjrOUfMTkcY7i9jbtLW0yM9pAvO+zulxhIxbh6d5Wm5zGciWLldrn+cBXbsTk23sHSgw2Od6dRKxVq5Rp9rQnqjs17D59QOChz5eN7mE3Y2d0jJsCUNSIK6NLBSMS4t77Db790Gdds8i83NtgrSwrFHCEpsRUFaTfpyKQZ6Mkw1NXN45Uc7z98RKuiYcfihBsN8oU6XVmD88da2dst86C6QDYVoiWTBldwZqIfqZg4TYfulhDG8T68epO6ayGkx1rO5O2P7qKgs19q0ni8yImRfjaKOuv5Pc4eG6BUbLKyvMZAS5pavsR2uYge2iR/UGN/v0gs4fH0pUvkCxWMfIGDnQNODPdjxLrZyuWZHs7QnmohGU5wbW4ZBcnocAfjw+1s5Q+YHp8kV2owPTHAT6884Z65w4vnjlOWAscu8vzJCRbX86y6Jc6c6OFEXy/1usMbV2+QiYfx0gnmtjbIxFvp6Ipwd8HGbhRpS3UR7TZ4vLNOKNxDT1Llg9u79LZH2a026Uym2as1WFybpz0VIRqKsrJVJVfO+5OTz6hfiOYJCNQLN6CCH2baiaMIFtd1CIfDgaqkoqoqzaaJQEHVlIAsbqBIFyl9uKYRMhCKn93meI6/mu/6jZAbbNpZtomuGb45WlMxTdMnabtWkM/mb7hpQTadgj++883m/mafrmvoRoimZaNIGUSWqNi2i1BA1TSElDiu6zt9Ar+V5/pmas/z0AwdaVp4nofjuniW5TcyhoFQVDzPxjD0I3inZZmB6uQ3hp5toQqOIkcMPYym6miuiSslnqcwnRT0GCrf3bX4uG5xJiYYCrmkhYoUrq8OKRqearPXsPlBzuNGzSalCn47q3EmDp4bwCSDaIVPy4cGGMJDKoo/Ggy288IIzCAawYWjxukw+04T4KkKDgquZTF68lncRAoZsAh0wzjKEZwM+F8KAkXREIp6hK9Q8J/DQzXQk85RjI/AB4yqht9cObaNYzWPfHPNegXXcSiVyjx88CCIhvi8Pq+/vtKpOL/1K8+wvr5ByVKpmoLOsEE006BYczCFgul5uLbNk1Id06ohpENI+sy6wVSCvtYQ0oiiaU2G+zMUXItmyKGjI41bLnN/J88zrQNEZJHubIzebIb7q5tUihpqezufrBSxPUlPa4Kl7TqpRJyT40P88Pos00acWDSBaAocT6IqHmbTRqiC6eFOCqE6A5OjRCMZdnMr9HW1U2o6pOIJGk2Th092+OKZMRqFJqvbZb79lfNs7u7zwZ1VXnvuBF3ZDB/em+f0iUmuzM8hha9mq6ogpgq64mm283kWciVePDvCgycb9LUm0E2Hd+4u0ZGKMD7Uzv37T5jdzPO7v/ECWUPwxt0V/rPXLuA2q6zuFrh4bBTpRdkuVelva2F+aYd8MU9nS5g3373J2FAnaVVnr2AyMdhOzAiTTMQ5OJij0JdcLAAAIABJREFULR1n6aBIuiPBt772DGtLW9gKXBjp4v7sPA3X5WsnxljdyPHR7Aq/+ksX6Ghv48naLkPDvbTqKn/89idMj/RiaFAVgtGRPpBJItk0Fyd6SSo6f3z1J4yMpMkf5Nk7qHBwUAQXXFXl/NQQx/sH8FyX0swMqbTO/SebaBa88e5NLNXDrRYQeZua7dHf18nzl06xX6jy4yt3MVSNenWNh4sbjHUnefl0P6s7Vd6v7XNidBjDgxv318ikPTJ6mLtzGzDayrOnz7CXq/Dxo0ckBrMUSlW2ClV6urqZebyKFtbJqtCWSRNSwXUTmKaDXciTEtDS2s78wgEdrSlq1gHnTw8TFxH+1x+8z/ruDi+dnaJc7uadWzO8f3uW8YEsj9Z3aYnpPF7eI5YIgaqzsn3A5IkhomaGtt0Ss0vriIrFqf52zFCcmblZfvWVSySNJC73uDw5QC7XoCvdws5+k7duPCEUC1MqWBzkStzcLhJQIunpGaCwmWewoxvUOiLWSXu6SN0sUfZqKFLDa0rK1QOsRpzu7hYKpQJfem4KWXG59sZHfOH8AJYZpuFIXGlz6ewYjYoDfPAfPO9/IZonEYxedN038LquD4f0PIKLm6+++CG7vlph234UgPQOVSGOMAG+v0YeZcNZVhNpO6jhULBt5aEIjXAoitms+aRZRaAqGpZpoqGAHsY0m2iqdhQP41+Q/dV9AnCk5/keBbNaBSSu4z9GXQ/75OvA7yOD8RqHoE8p0fUQVrOBbui4h0gA/PHVYZCwT7wGTfe3SGzH8mGWnovrWLi2D9z0bBMvJEBRwXYQnk3UbAAeqgqeppP0XNK6zn+XMCiYFt/daTLTUKjg0KsqtEc0Vusmq03Y8CQxV+V3OhTGIwJVutiewBMBk0XRfKq6vyrpZ9HhjzAcPDzFp4grHhgSHOn/TAr/88MmShWSiKqw6zo0bYuQqjN65jzh1i78bUt5FAiN8JtkGWhW/iZmADFFCejDwfMffHYIVHVd/3lRlCD8WPor447jYjuW7y2THlL1gamf1+f181atYTG7XGZ4cIqtpTVy1TKXz05TazR468cf8Xe+/iyFfIG3bz5hoL+NT9YLGEh0TUXXNeKJCKNTx3n06DHby1t0nJ3EQJLb3mOqt5daucIzkyMMd3YwV2kQVTX2S01KRZNjfV1Uqx5bB00Gs0mkKwmp0BHXWN0scnywh65Ugo82y3hKBkP4IdxNBOFwmGs3H3DuWCv1gwb/4kdvQySB1GvMLa1zfnoY6VrUzArNRpOm8Bge6MSyFNY39pnuTaHVG9zLVTnXHmVvad0P0lV18Dx0Q6O3q5WqWecP37jNmYke9vdLWJaJlhjAjsRZXl+go7uVpbUcP/vkEVPDbbQoKst7dTRd8t2fXENXFPq62gkJh++8fY1LxweZGujhh+9fo290hJGpfn7w5k289R26WpJsF9a4dHKEqK7x5rv3eOp4H6bl8sMbi/ztr55m5cEi88sbZBNxtrbr5Jo28bDC96/MgaryyqVxBuIJ/vWfv0c8FSIsTV6/sUbfUJavPXeCP3v/FhXb5FvnjvHoyQ7FYh6nEudHD9aZHMvwzcvnsaTgny68zZmpQbpaWijk91hc36Nhwe5Bmc7ONCElzMTwEHOPF0hnI3w8v8PEyAAnBvqwheC9j2a4//iHTAz20NGWpG6ZlPYbmI6LVWuwsLzJ0naekOqT7gpVE131GOhtp7UlS3J1j8WVPFvbV4nHY+zlCrx4GuJqnEdrLq5dZ3Kki9evz1NrVsi2d1JtuJTrTZ66cIreaAx1eZ1Co0JnSwLPsjFtgwfzOeoHebpTYVp7W9krOKRVl6mxUUy7jK5FGOrtpuaUWVjbpVIsUqs2ePWFE6zcWaXoQiVfJmHA0FAfWwc1Kpakt6Odmbkt+rJ1To32sLhRpCPbAa7L2l6Nnq4U1XIV0/S4v7DOxOAY9VKBpY0S8zt3SRoKe3t5MtkIlhvCdgULy3laig1MxUCRHrvz20xPD9PX2gmKx8rKGr19PTx7eoz7T5ZJdHRQ8jRWH2+yU6jy6oXzn3ne/0I0TwCqoiI8Fyk+NXEfhjiqmnY0InMcJwit9UcyUvjqhKbq2LaFJ92gifKbJz8U1kPRVMAfIylCAdelWa8cjf5sy8R0/I0/oSmBidw/VnrC90oF4zpHumihEEiwAkM6QkEGG36H6pkIMtQUzcDzfJS8PAxqwydc+5uGji90CAnBKq8nvCCzD2zb8jlQwZzL9Tx/m8+1fdO45+A4Dpbqm9DVgGGU8J3hWAgf7uk6KNJDlZJsSOM3u6Kseyqf5E02nCaRhoIp4ULc4FlN5ZgMk9IsNA8sIf3QYKngCb9pVIWCpvhrzq4qA4o5qJ6/reh4EltVaLouBU9Bw8c0iECFUgMeluvYSDSiwsOSHoZqEI3FgpGl3zz5ocz+uwzP8xtpYXza5BzysLxgWxHE0XYieJiWg22bqGoYFFCFilBDRCKfqmeu66Lpxl+hy39en9dfV5YnIR7hxoNF9qoNLp05xq25BRp1h1cvn+D27CqeZXP+5CCPV3PoCELhEAiwpccXTo3ywY3rWI7Kq184yceP1jl7dooXnjnL9au36OvqIBLS+f0//xnhUJhMLMLK9i7tmRiu7bFX2eO5c6MU9/dZ3NrllXPH2S8W2TGrnD3Wx3aljutF8KTEVEDxXKSmIlSDwY4kmie4NbfE8ale5pd2eDyX47WLIyzt5dmru3z7pZN8dPshWjTGcye6+d++d4WJ4R5OT45QKx6Qsar0dnaTW83jeUHkiS4I6SG290usPVqnuytFKGYwt5HnlXPHaDRNfvzOdf7Wq+cZ7W7jjSsfMdLfxtmpCW7OPGbroES2JUEyqjPY30trLMJ33rrFqYkehjrS3HzwkFQ8TndI8uevX6etL0tLOs6tmWX6hzLMr+zSGo1w9uwUwx0t/MH33uPC9CBP9fWTa9oMDXZxqq+bd+7MsV+p89qpSZYO8rxzY5beM8d49+Y8KDDalmZtvUilbnKpp4fbD56wtVfg+GArTz6e5e7iHr3dWZ5s11ncLpPO6ty4/4i5lV26WqNcnB5l5sk2Wzt5ikqceq5ESyLMyf5ehJT8sx9+xNMXJ5nqyLK+X+fS9BCaB//6jdv0d8aZGhzi3Zll2rIRzp0+S0SDP3/3Jp0tGVQlTEu2m+reGlsbeWyhIEIRClUXVamRzaZ9hphUkNKhIxvmyZNdUoqguyXFzkGNkAfdCZ14Vzv53TLtSYNoKML1O48Z6kxhVW12i0W+eLmDuBLjT97ewXK30QXkckWe7OTpaA0x2dXOxtougwNp2jpaaGlt5afv32B6pBNaEyhCsr61S8mOEVFVQpE4ccViZ3+Xod5udrYluVwVLexfo5pNi+6WOB8/XGB4oI32TJSw3uTYyWPoQufG3YfYXgOEJJtN8mRtm5z0Y+Wr+0VUI0KuUkcLhUhkwmh1DR2XRtMhX2pQL25gmk1wm5hOlJ18lYYp2Zqf5xsvnufF08N8dO8Rj7bXPvO8/4VonqSU1JsNDF3H8+xgtAUECoJtWYRCYQg2ovwQYDdQCHyDuOt6R5twiqKgKj5007IafkKyHkIoPnXcNxVbKALCkSgNywLXxvOCrT1D97fPArK4wH9BMDQ94KTYWM0moVAIVA3VULFtC0XRP1VJ4NOLcJCrZtvWX+E4HbGo/N/Mb7iC0ZtjW36zKL0AqukhHYkq8IndjoPj2Nh2A1wbVdPx8HxDu6Ii3IAnJX1OlutJhPQQUvqxKU0LoRqkhMs3W1TiSgjPsfGkgu7aNBWHZuCzcoWC6gYIAyFwEf5mpFCwXA+p+MwmH0Tl4UgPVwosT2J7Co5UMDw/GkF3/a06FYmjSqQUOFJi4KGhYCkqeipBWDfwpBs0Pz6r5pDpdRjuy2EjLAKwp3T8+w+2En0vFYBASAVDi/icPdf3lgnkEbDUC1hd3mGH+nl9Xj9nxSJhdE2wdVDmzOQgptnkoG5zeWoEs1JCbdQ5MzXEUq7Kwf6B/+ZGKP554zpcv7fA2fE++tui/MWVBRLxKGapysKqw9NfuEREdXn75iP+0e/9KusrS3z/+izffHWapmmxkXe5eGKMx3MrdLdnef5cH588XiARzfD158/z0+ufUKtbtGfGKFc8dFXBMDRMCZZt89RT07x/5RYXTo5xeWKIn3KLpNZHMp4gP7fLKyeG2NvYQ9cNpntbuHJrlhMjXTx7eoS3b88Ti8b4+oXjvHP7AZt1HVcBW/pvXFxhsJWvcqo/yzefn+bK1TmaySYrGwds7hT4yrOnmR7t48dX7pLu6ObsQAff+dFNmio8/+xp5ld3qTXrxJUINRP0cAQRSmCqCeqmw7mpcVRDYVIYDPR20Zo0SGUSnBxup2kpvPfRAwbVEFc/eYzjuTw/PcDs+jYzKwecnermZ3fmWNo/4OXpIZY2t/jJ3TUmR3uRsRilgyJ9nSm6WjtwtSr66jbbm3kcqRGPheiKp2nLxOjrt3jhwkk2tvfZrtZob+8gHIkRTYRp7ehgfbPIcFeGpnR44eQEDx+u8mh5Fa9Ro1aq0SyWWH+8xJO5JdJJHVluUrdqhEMSIxyisF9lqDXFw608NW+Wat3ErVfpbDtOTA3xxse3ackYCMUBR2Vpc5sL4x10ZRLcn31Cb1+GU6NjfPxgg3KpTCoVZzAV4fHDVZJRg4Yr0aJhREgw2tWFaruUmjbn+1oY7GglbISY394gLJNsb+aYHuigrjSIJjqJpjPoBxWqpQJbe3mEqtK0JIvL27TEwwx1t7KV2+Pk8QmWHm9jWxqeMIlGWnEth72SS39nEs/1aG+NM7u0xdruAvFQiJG+LPamS3tbCt1zqdSqFOqCe0/uojqSREJQquc4MXGC9z56xMRoCy9evIiwFVZ3Nkin42xt79FsSPLVKmfOjNAZTzHzaBVDLzPePcjiRpFrjx5wbDBEMgR5VeHEYCsrGxWsxjoxQ9CRSXzmef/Z+Mz/F+tQXXClh6pqhEIh3++kav4FM4BhOo7tm77xxy667vuNDjfLvMAz5Xn+Nhaeh+f6F1QhPf+C67lIL9jKcyWWaaIqCpFoFD1koIdC2KYVcKICEnjAjZLBCC1khNBUNRgXqnieQHr+i5Gi+MGzh8eqiq/OCOGv2R/+rqqqouoGoXDU9zUFKS1KgCk4bB5lQFTXFAUhPV+l8Tw8zwHpoKsKiqYRVQUd6RaEYeBoKp6iHoW/qdLDkA6q8BUtW3g0FRVVeoSFSggbzwVNKGiKF2TaaTTRaErYd8EMFCffCC79kGANCDz4iitRHFBcUKSK8AR6oAxaAlx8j1hTCMoSHBQ0z//bWvgeNKnrNDUF4cmjxunQvySli5RukODiQ0gVIYI8Q/+jpqkYIZ1w2EBVFcBXCgWqP34NjtGDsOjD2/XxDkqAhggytD6vz+vnrGqtwfWbC3z59DARYfPxzBLnxgaIqXD34SJaOMzK9j43ZmY5N9Hjb3Y6fiC3JlRGu2L0RMMsb5Ux0i1MjPRRrVfY2q1w+94C1z+apS8ZYe3xGk3T5pcvTVEtmSTUMM+Pd1EqN8i2ZkCBT+ZW6Wlvo7stwl+8e5NMLMbXnhpFaKDqamBp8B+3dBz+4p0ZLp0Y5+xgD99/6yNGR8YYmhrjrbllXn3hIpPjfTxcXGasO8VOsclBxeR4dyub2wWEomCogrduPyFl6Iy2xdGCN2tKELTe3xrmeGcLK8v75EzJwEg/pabJxGAHva1R3r4xy0axjAeYNZux4Xb+27/3JRSrwp07D/nCZC9Ztcq7V25wfDBDX9LgjXevMTHcQ4vW4Efv3cYRGo1GnT/56Q2k1eRnH87yw3dnON7fx1hPGwu7eaYne9Fcj3zDZmq4lYG2Doq2SmssBg0HQ9XpaotxcaCD2w+esFssc3FqnLmFZd6+84j/6u9+hVdffpqV/RxTo4O0tmdZyeVpTST5eGaBR8s7jA538uwLFzEyaTb365wa7GBqsIt3btxH9RzefPcOd5+sko4aJKNxulpTfOmlE/zqq5dpzySIRMJ44ShaNEWx2sB0HcyQxtxOnt62FCkVWjWdpiuYe7zK0uYmqZhBJhvlmZfOke3roD2bwlYMSrU6uhFB8TT2VtaJYbOTr+MoHpFIjINClURY5YVzJzg10MvmbhnFbjDRkSZfanJ3bp63377NH/yrv+Dt9x7wpz+9zrX7CyxubrNfqrO2mcOp5gi7TUK6JJZMMD3ci9WExeUtrtxbJt9wGWpvp7pT4EsXJhgb7ObR/Cb5/CrdWY10LMzadoWV7W0yOiRDKo60+e2vnufUyDDZVNi/5gkP23KxrSYXT/bw1VdOsluxiYbTXL09h1Wpkc+VmV9YwaoWWFsrsLq+wvGxQU4fH6Zaa3D/wQr355Yplss0bZdoPMVUZ5LpkSFSCZULJ6f46nNPka9rxDIO3/7Gy0wem+Da7f9wrh38gihPAvxNO+niSRe7aQVwSIdQKBREr3gI6TOVNFULWEiHIzL3yFx+6IvyfVQ6kXAcx/PDAjVNPzJ/W6ZFyNB9vIGUVMwmeB6RSORIrTgih7tOkAZtgeLDNjVNRxLALVUNRdORgQEa6QM7QeLYJgHzk8NR0qF65jucXBzpm7z9JtAL1I8gw862fUN5ANV0XD+cV9MNhOZHywgJ3zw5SlezjFnZR3VdlJCK6fnjSeHJYAQmUKVCA9hwFeIaZD0zyLLzDe2+CnYY4qviCUirDprzqdHbjznxzUbCw29QZBC0G3CoDn9nKSUaAk34qpjpQgSPiudT1vXg2IiqYKsSz1Uo5fdJtXfjeQ6e5/g+JykR0icSH4Y9a3+pCQKOmi3gaKlAHgpifkiizwKTEsuygv8zKopQUXXNv01V+7x3+rz+RqVqKl9+4Ti351a5Nb/Drzx/hrWtXa7tlDjW3c71JxvUGjbPn5miYlq+NUHBj4MyDKbGj3HzzkNsReNYW5wH84ucPTNNWzTOrQezjPb3AS5X5zY4N9FLpW4TjSc4e2yIG7MLbOTrPHdymJn5ZZr1Gm4zxuNcmcWDKomWOFdmViiqA8EbzoBb5/rnRsiAnb0cq7sl4qk4dinHz+7scWywDbuZ50fvbfLFl56lt7+bd67d4qsvnCdlGLx9d5YvX5zGUARvfnCdC6cmeZBzcBTNDzzH5+1NDnTSlvT4o9ev09o/QL7coFytUY+FmF/fYrdQ5MSxQQrNBn969S5feXaChw/XyBeafOtLF/hk7YAYLj1DnWTasnz/g7tkM3E2SxW2c5Ke7jRJxWJ5wyEZVshvFamaDkKTNJ0af/zmQ9Z29xnuzbKWL3N/fo1zJwb4tz/+kKIU/PYXL2LVG3x4/Rqnp0eo15p4jselsW6u353nzvwWx0c62F/f4NFqjv6uDM1GmSdLRQpVE/PAJBGLsLZ7QFdPGx/ffIQIRWhvTbA0t4ZpW3Rmowx1dNPe4fCjaw+5dH4at+Hwww9u8Y3LLRQ3t4irgkereyi2g90UlOsW5XKDTCxGpekyPtjOUycnuP94g+S6y9nxUUKaQdnR0eM69z55guVIJob7qNsaZs0mnYjQ2ZXBdsLEopL2RoW5tRIr6wdkUiHKDZurH9+jZjsMd6XYLCncn79PMmaQq5XJZg2eGTvB1ZkVTNXipUsnKFVc3ro1yyvP9/HVp17h+idL/OT2xzQqHqm0waolmRjpwPAU1rZ32T+ooMe7+D++9z6JZJyhthgTfR10xmOo/e3UXIeSGaNcr3L55DhjE+1EjDTtPTrpjEFrVzuerRE2NkCWka5GqWTy4pkJ6pZJZzKMGtcwbZVzxwYo5aqcHunEUl0+vLPEcDbM8YEuHMdFD7t0KlEWNnd5s/EQVROsr+zQ29vGB3dn6UkkEK6HbSn825/eIRFWSCain3ne/2IoT/i+H8syjzbt/NGLjwc4zK/zPNf3AakajudhWTb1RuOoyTncrNI03+Ttu138C72u+eRxGagdivCDdm3bDGjdvvRjWZbvnQkM4oejN8dxAqySjw2wLBPHNrHMBvV6Bce1cRwbq9nAbNYRin+cCCi8iuKrH6qi+Hltwgty7bQgdiUYFwXoBYGvkEQiUXRDCzhXh+OkvzRaUjTiuk5byINwhGa2jaamoFkW4CtIUui4aP4RQlBXNFTVwJWe3wgF3i5ViKOwXB+nENyNFHiqQEjhE5GDxyA91zdsH0Iw4dPnQvqjQjVQviL4nigPia2ofrwMkhqSHQmrTZdHNQdLOiy/9yauVcV1fI6XdF0UITHCBpruK5PhcPhoPCoDbISm6QEgVENV9IBnox49h4fw1cPGKxKOEjI+vR0fj/H5yO7z+ptVWFfY29ihaTv8xstTrO9sU645XL5wnDurOU6fGOd//J1vEjdcVrd38cOplUBllvybH16l4kU5Pz2OKRS++MKzWNUqs0vrfPHcKYrFA9ZyNX795fNUKgU2qzYD/e38z9/9CYuFOi9cHOf27BNyVY+Ovh4WSlUebOZ44fJJWtrTaKkM8WgETwo8qePg2x4MRfLC9ACu6zK/uEw2laJhS1LJBC+cnMSIpogmE+zubPNH//5d4rrOzuYeb3x8n2MDneT3trly6yGvvnIJEQvzYGUT1dNAUbBd//x/sp7jj9+c4fSpcS5M9bG7f8BTY710RnWqlTojXVniokqbVeDF6U5aE2nWCwXqaoR0potTI93slKpkIjq76zt0ZRN87bnLTAz001Dgb331Jc6O9tJs7vPrr5zn2QvHyZUb9LV3UK15VPH4z7/1PNMDffzo6kMS8Rhziznm9yucOdZB9SDPtfvLDB/rY2piFFsPk3dtbN2gpaOVSCrJUG8vmWQ7Fdehpz3LF8aGOTUxxPz6Hjsbm+we5DHCgpGOLM9P91Gv5Dl1/BhTkyMYiRglUyPRlqZcqJGJR7j+YJnbK7sMdSbQdZ14PImUkEnHqDYhkohjGDqlhsPqRhFXOuzVJe/cmmd3p0i17FKVJm7SYHNnj6ju0tvbTVs6w/V7SwhRZ/hYN6aqcfX+Co1mEdessr1TJJzQibe2UyeMpnm0tKboaG9lv2hhWgX6Brow1QiZeIzejl4O9sp0t8QZ6GqhUJGkNY2T48PUy/A//eHrXL//kJBiULIb7NXrJGMhchvb7O3lcF3J3TtrPFlc4Bu/dJHzJ4expcKTjSINXaVWc7lxe4HF1Sc0VMHNhVX29gqU7DL75To/+fAx33n9A+49vs9e/oDZ+S0c2aSjNUahXGfvYItL50d54ekzbBYlP7l2n1ur23xw5wnff/cmJ8dbePr8cfq7WolELb52eoLXTo1xrK+DkNZktDPO8bE+9vJFMtkkdTUEWojHS/v0d6o8O9ZLIvrZY7tfCOUJfNXCB7cFm2+qr/z83wN//SYpSO3Gv7AS+IwO1ScngEiqqr/KLjUVXTfAtrEsC08InwBumUcXXU0P0WzUOPQhHd7fYf6dbdtoesTfeAvUoMNwYlXXURQVW5ogXaKRCJbtYDsuioIPd/Q+BVwKBSzLRNf9pqPRqKGoiq8Oeb5hXFGVQMTx0DXD39qTLoYRClQdD4UgsFcT2AtLHGRa0I0YStsA9UaKSL2MW6kirSaq9MBTcYSN6kFIuMQdiVQDVIJQ/FRv1/f/qKpKCIGDQHgiGIn6jadQ/C06qfjbjUL48Sa+akWgPAk0RcH1/CZMc33CVUiFpusRQVDzYN/z/WlhXUCAjHBKxUBh09BUHVVR/Gb0sAmSHDXWnypM/uOWnu1znTTtU2RBsHF3SH8/bKYU1VebONzYC0Z3n9fn9Tcpz/O4em+FE8O9LM1vI4woJ4daKe/tMtqZZDymcm92jpHBLoxwmFvzOTwJrutjT1o7O+hqi/HDH3/A8GAPD+fXUKVFbybBzOMlHm4XGBvo5E9+ehVU6GjJsrC8TyQV44XJXjbWt9GNMK9NtPOT6w/oGhziv3n1aW7N3Gd1q0imo4VizUIRBsJTcYJz2HUtZhb2SadS/INff5X3b9wlX3f52qVJ7s7MUnMVTg4OsNVoMjKa4sxoL5v5GnumRzqaYG13n4Lr8NZHT2jWqyhqGEcB1fHfHDqepOYIhoe6SCbizMwukUymOLB1Vld3iUQUrt5bZzlX4eJUP8d74e7d98kO9fLc6W4eLa7xwZ01Rvsy5It+mPlz073Uc5v86O4Sz106zp3ZJ+ztHzA52knJbjIzu8OJ08M8MzXG29dn8ewmZrnCVtVmaqyLX3n6DMVKDdd7wGgyQ0hTmF3d4qmnxmjKJlcePuKLXzjO6eMjfPcHt1F0yKaiPFja4P7iNopm8EjNMbO4Tc9AJyOjw3zn9SucHsrSpkuu3Zpje/eAZDzMwqpDpVSBcISrdx5RLjeQtkm8Ick1PCo0iUR0wokoa3tF4m0xXrowzQ/euUdHexLHcjClS2syzt7OAbbtkkyESbSnKNRVTLtMJpWiVLX58JMZqg2HjpYYM8sVrty5RipmkDAEB4UmmWgU1QhRLJYZ71dZbzZ4XCjT3t5KOBrl8UaOCyOtnOvs52A7T65eZ3V7Cz2WolZz2VvNYToKekuc/G6BpUaRC8dHwVO5ubBJSBcsbR5gKAoVy6S7v53zwyNkOjqQisP7N+boakmBGsGIRvjkcR67UeX0RB+dvQNYlRrpyTHKZpHHa01UJ0c8rHL6ZDfH+ifRZYObc6ts7OeIRkv4jmcFyzUo7Jd5amqYmQePKdb3UBomCdXFaUg+vnKHqmMTSyX59+88xGqWCBkaU5PtlKsxXLdGPJrkZx8+QBUujqsQjanUqx7fe3AHqXy2vvRzK09CCFUIcUcI8Xrw9ZAQ4oYQYkEI8e+EEEbw/VDw9ULw88Gf8/ZRVd2/wCnKUYjuoZJxeMHzgk0zVVFJZ7JEojEMI+R7WhA4ln2UY+d6vgk7ZITwAkK3UP2fIYLsuABy6dhNf1wlBJ7rb6n5cS8IJ9LjAAAgAElEQVQumipQNQXHdf4Sg8qPY7FdB8/xSeR2s+7DMAPy9+HoyjSbWFYTx7XxcH0FTahYlo1tm/6oKLg/gQDhIl0Ts16mWj7AbNb8+/b8TDspfVo6Cni4DKeS6G6dlrUFWgvrhN0mXiRBPZrBbu1BdA4gsr2IRAsy2kokmqItFkFR8EOC0fBQsISCq6koukEdjaYnEZ6N61ko0o9UUYUWZO/5DZN62IwoPuhSSoEilUPBCghM7or/l9GFIKKroIfRwmHaoxE6wiESIYMkEjwbXQFFekSiEd+/ZAgUTWAYOoZhoGgqQvWDpA+bZt3QCYUMQpEwRjh01Phquoaqaz48U9NAEUfHC9UDxUPVFTRNPTrm8/r/X/2nfP0yLY8Xnz7Fo50CyY5uXj7Zx8z8EiVH4VdeeYZIOkbV8lhZ22dp2wfvuQFDTtMEwqoTCxn87a8+x1hnis39A8aOTaBFI9xbWOeVU+NM9XdxfnKAX3vpMh1xuL+0xu/92ouEEzoLWwXKTZcffDSPGonQoll8/80b2HWHTDRMMV+jbru+Z1EEb0g9x0ejhA1Cis33fvYRy2t79CVCLG8X8DSNL52fZG1vm/uPntAS1bh6Z5bdvX0unxjhvTuzmK7kN774PDFDYaSnk6eP9SI9icAG6eHZFv2dKU71ZrBrdSpS5duvnGO8r4VwOsV/8euv8Y9+71uk21qYHBtgbHCImu1SLdd448PHVCyNkb4Mg91dZFtjFBt1SlYYV4/RnU2gupJQIstOySZipClVdeY2dqkWK/y7H33Azz55wpcvn+RYfw+LO/uk42E+mV3mjY/nGBroxo1Hub24QViVWIUSD2ZX0UIhZufzfP/1W7SlwnSn09yeW8VTNQxNwRGwslOiYtcZbm+hnisz2d1G0zOYWdxB0UM0TJvdjX2wmhiJELFElK6ODIW6xdRkD7/19edJJSJIT3Dt3go/u/mQWDxESzzJ/OwyQ51pUskor734FF9+bhrV80jGFKZGOihaDsW9fboSGjFV4aBU5qBsMru4y+JGHssyiSsWz4x30BIxKFcbvHhqiPPDnbQmIrx06SypSJbLUyOcPzlMJtVDezLF5dNT9A8Os7VdZrAzi5QGQk+yc3BAybYQwmW8v4f9kk1XOkpHawuFgwpRIemMR7Fdi662BOGogfQUKoUca0vzzK9usbG9w+VTI2QSrYQAs17jYG+LejHHg7llZu7fIxRW2c2XuXF3iWJ+kdGBDAhBtdzk++9c5e2bD3m8sE4qIulub+O1Z06BarA4O8d+KU+1VKNmWzx36Ri/8+3XGBgc4wcfzLBRrbCwW+VP37jFneUFnLDC/EGV19+fI1fb4cUL46QMhQuT7VycHGK8q4Whjgz729uMD6fpjH/29UAcqjo/x4vPPwTOA0kp5VeFEH8CfE9K+V0hxD8HZqSUfyCE+AfASSnl7wohvg18U0r5G/+x206mW+TFL7wcbMr5FzCfoO0gJUcr52pA1m7U6352HRJN0z8NCZYepmkSjSV8JcixjtQqTdNoNhq+OoGPNpCe6wf6Sp8LpQr1SKVQVA0vCJ01DD3gLQm8gD10OCo6VKpc1/EbIFXxc6sgQC44CHzlKhqNoOthGo0aeA6eJwlFoqiqTrNZw9B8RINjWQjp85MOm0dF+JiGw7GSruloIZWQqvC7xzpw1ueRe7sYVpWw6xI2wni6jqcaWJ4AdGzbRCoKEQV2Dop4WphMWEHaJmHhR9Y4rodl29SEzk5un7TioQvfCyU9j5oUxPAN+Kqi+j41wPYZmzgS/0VaguMJQMXBw0LBRNJwBbYQ2MKl4gp/lOBagbIGRQy0kEHq/NNc+o2/5wcHOw6K6quSnuf7nlzPDfAU9tEY7q/8X5bSp6AH6pP/LXmkZvpbkYej1SPNjP29Xf7JP/7vsazPzjT6vP5mJaX8/9xF9p/y9aurJSl/7fmTTE2NIy2T9z96wJnRbka7MnyysE0im2ZiqIf3bs2ysVPm/kYRx7aIJTKkMimeGTKY6tJ5uFBmZKCTY90tvPPJE0LRKGOjPexv71M1PTLRMIsrW6ixKIOdSR48WqG7Nc2z586wtbPBnYV1ook0WFWy8Qzj/W189GiJsimoxkYoOkHmpSOx8QhR58uTSfrSEX585S4vX5jm4ZM51rYOeOb4MIVSnZWDIi994RSb20WWVrboaImxX2hSl4KBzgSbW0V2ClUujPdyd73Jw7xAVz00XUWJxPj6qXaeHY7x3rUZOtuSLG9VWSs0MKK+wXy7aBNLhnl+spcfv3MTEU/y6plxrtydZbPq8luvnuWND+8xu7bL3//m00R0jb949zZfef4sGU3lO+/d5euvPUVKUfmX33+PiWPdDGbTvHNrnsXdA165MEZhfY99T2Gob5CQ2+DNG/c4Nt5HtdigXLOolQ7obM1w69Euo8c7+dWXn8VxBX/2w3cYaouSTce4cn+b0Yk+zo4PUy0XKZVLDLR0EQqpvP7xDH/nGy+RjRr80z98nenBTsKhEJWaiRNV+eUXnmJxYZf/8wfvMDXcibQ9sokoZcumpzVBXyrJv3n7Fl+4MEIqEuGtm084PtFFXzrFo8Ud1vJFOlviNJo2uarJdF8Gu25Ra9psVFyy7RFeu3yKxytFfnzlIyb62hDSpZhv0tnbSkskiXTqLO8ViKeivHr6OPcXNnh/5glTk30kFbizvM/F8S7G+7p45+4SqmjQnU3T0tFNLl9iL1fGUF0yqVbKpSp35pf52svHUbwEmzs5Vje3OajWuHTiGGtrOY6NdXN2pB90jQ/vz1KrNmiLhvlobpOIplAo1emIq+yV6px7aoL1nRqVSoWQcOltS1MXIZrVOtmEoLu/k2Zd0mh4NN06HipxXcWyGowf6+GjW2sonoWLZLivC6deZ3G3Rq1R4OXzI+CqPNos0ZoVXBwdR1VD/NmHt/jSs2cwPIXV3SJX785Rd2GgJ838ygEDbQLFDZEv1fjff/rxbSnl/wP49HON7YQQvcAvAf8E+IfCv9q8BPxm8E/+EPgfgD8Afjn4HODPgN8XQgj5H+nSfOFCIKUaqDUyMH/7YypV8QGRjmPjOA66oSNdF8e28VwvCM/1w21D4QihkIFp+gTuw9Bb27SC8ZmHI91AUfIzzerNGo5jgeeP/eLxOJpuYJlNXNcfvzmO30Ag/i/23itI0iw9z3vO+U16V97b9r6np3t2vMF6LnaxFCBQJIIQyRAkhajQjYIMXImKAG8UDIUYkkgKIIKwArDAYmcXizG742e6e6a9q+6uqi5vsyqzKn3m787RxZ9Vs4jYhZGwjOWqv+iOLpOVVV2V+Z+3vu/9nleHHTLa+XEqAK0wTQlIVKCw7bZ5PPCJ2HbbU6URMuxGGYaB0hCN2wS+H47y2lwqU0q0kARBaHAPtMZ33XBLzA7ZMEEQYJqCzozNhaE4yeIaIp3FVZqgIPAbZdxmFV1VCGlgmSYCSVMYNISFIwwiUZua77ETxMn5kq0AdoVJXSlimMQME1da2KkkUooQFaACMtJCBs6+8PCDAL8tUrTWiEDj6AApDFwdUA80wndRvk9DwJLn4yFp+oq60vQJRZIQX+AJE8sAE5/q9BRuvYZMxEIzPSGVfY/1FDJRw5Gl1MZ+xM7eY0dIgfZDxAOwL6z2Rn0/+G+Yifgp0f5x/XTVj/v65bgefZ3dDCciXF1c5fihYcZ6sjxcW+fMySO4rSpvfjLFs+cPk36U595SCattB0jEI3z1M0epFotsdoHSkjtLW/iGRScBH1ycwlMBI319bO7ukEvaREzBer6MMg3Wtsr8+2+8RjSTJBVNML24xoWDo3TnInzj3Wtkcmn6e1LcrXoEWFjKxBFhXBTCYGl2jj9fKfLykwe4M/WAZuDz9Z/5DM1WwB9enOLp0we5NbXC6vYOz56YZLQ3wzs3Z0ml0zhCsVppkMlm0bEUJbeCq6MYQuD5AktrdnZ3+L9fe8iRo5OcP3uYnXc/RO/ucLS7k0bLY7NY4GzPKK9ffkgpMEhrn//w5sc0Gw6B0Hzz+9eYXtlguCPCG+9fpeVbVF2Hf/OnH3G4O03EhCvXpnFqPrmIiXA171+ZYb1U55VnT5OJx5ldKhONQW+XxfvXlugb6uXk5DBLa9ss3V/gmTPHGOjugGgKoVw++Og6K7sOY/0Zhvo6uP9glYbvMz7cjUnA9allujqTuGKHOzMrnD3YxdLDOa6WGjiuTyqbZDSX4vffvsPQcC9vvneDaqXFcG+W48cPENWS33r1A5LZCKYhuXZrEaUFfsNncb2I40MyGmOobwDDSlC8fYuf/9LTJIXNv/nOx6xs5Dk22EXUlDzIbzNo9XH59hIKg6eODTHUmWNrq4wRQL5QZehIB9vlKE1fcTjXwdbGNj2ZKJNDnTh1h42WT9YU1HzJ3GqeRNRiM18mHWuiVlcp1QI2C7tMjnTwwc1p7IhNLB7nxoNdKrVV0rEYGCZPHBkgm0xQz1VYWt8gmZQsrDVw3BKnJkboS2XpyPVxZ+4e/+irL9GXTvN/vX6Tdz55yM9/7iTdmUm+/d4dKq0mh8cypIe6+O61exSbMN6TolF2WNra5Jf/i5ewRZLrD5a4dWuap8e66UnEeXd6FVM0OXv2BJ35Klfv3ubhcpVKo4XveigV49v5KTpsgW3YvPrWZXoycap1j1wuQo9hE7iSJ04cYqe4TldXnM7uLHD1hz7v/7qep/8N+GfAnnuqEyhprf3266vAYPvlQWAFQGvtCyHK7dsXfvAOhRC/AvwKhKylSCQWZrm1uy2e52EYZpu95IVQQxEmiwsRhgeH8Rwy3JhqU1ZtO9rmAYWelkCFb4/H4ni+hzYENlb74yWu42C3c9J8x8Owwo7VXrcK+IHA39DZs4c6CIN1ASnbkS2Egb9tInoQ+GgUkUgUoU0CFRCNRtE6wNMBgdsIOUVAoLzQZK1FuGWGxnPd/Ww9IU2UcsPOnND0ZuCVs0kOZk1K80X6klnsVBI/YiFbWZrlMn61gvA8Aq+F5UOgNZYZJRJ4BIFPArDdKg4ST9hE/DrRQNASIKSNkUhwt9ZCmiaqHbOSES1sCUHLI2aaBJ6LUhpfKJQKMDERvkNNC8quhyE0hhIYyqOuJXGtEdqjRwh82bbJC7BEOGJrKElUQLHl4uuApLQRpgrHhMaeTV6yp3EMabVBo2pfAO0tD4QCS6Lacb97UT9h13L/cQiwH/uz99h5XD9V9WO9fmWSMcq1Ov/2Wx/yS199lpZX4c1P7nPhxAR3p2colhukM2lmZla4M7eJFgrTDJdIkJJvvnOHC6fG+eIzp7lzd4rlSsAvPHeWwuYqTiTGQG+a19++hkx08PSJcbY2N0jEk3zpwnFuz8zzcGmTw6NdlKouPZleUrEo+WqdZCrCWH8X1XoVt6UxLA1St/lvYU7nzYUNJicHycQzqJTD0YFOmo0m//71Kxw/Mk40kWJuaY2jk6OoZp3ffvUmw6MDxIVmZm6DoyODjI318calW9SbIJSF0iboAOFpCvWAfL7AsfEe3nj9HXY9n3/y5Wcpluv8r7/9JlY6ya1HBVqlbXr7O/EwyaQS9CUNEpZFoVpnpDtN1IrQk4uz0/CZmJwgk47w8P4cBwaG6UmleH3mCsIyKLYKzG+WyGUjDEYNpmaXuDu/xmfPHmT2UZGkFWGw02ZhaoEb62XOHBpioCPJH79zBVdHODXeTWc2ynphjUpFsagNBge7kbkkm6u7uLmAZMRgt1RlZrlIMhUllekllYgRyBhdOyUapRZbDox0xxgf6+fEUC+vvn+DppIsLmxQrnoMDeTo6uyhK2FS71UMxwzOjQ3hCMmN76yzsblDyra4fHcVLQWXrs3iuQGmctEiymrZZ2OriucpkgmX50+f4tbMBtfvzqMRJDJpbt5epS8bYTQXJ2j6PKzX6e1JcHq4nw8+eUA6afCVF55C+ZLf+s73GeqJ0dE1QrbcZCNf4rX37hOzTCZG+zlxbBghJC9/ZpD8VpGG2yQelfRk+0gGDtPbiqXNBp6bJxKNMnpojJwdo+f4MG9//DF3ZleYS2zRaEEsEuX2/Baf1GYxUJyc6KdUt7k9PcP4WB8D2QitsoeM1xlMJFkv7LC9tkU6ZmHYEa5cX+TMQBeGF5CM2FRaJitrm3QnI5g6wrffv0nT8wg8xeSJIeaWttkqlmj4db7w1FkivuLKzBYdGcFgJvS9vfcgT6la5GBfjtLWBrVajcDXJPWPjun6K8WTEOIrwJbW+roQ4qW/3rXqry6t9a8Dvw6Q7ejSe2LFtuy/wEnyvHB8smfcVioMy8Vg3zze/kL3RdfeyMU0zVDgtLtAe10opNi/jed5RBMJPM/Hbufk7W39GYa5PzLcY0/5fmhIDvZz6sJRovaD0APl+VimiVI+hsk+r0i1hWGzWW1TwIEfGBNGIgZ+oDC0xFPh/zNQ4YEupbUfUxONS44NJHjuqElfTqHxqMY9zKVZOvuHiRoCPxpHSxuR6WQ91Y21tYZV2SbacvCCMFHObpvOA8+lIS1aXo0uHAJtkjYFBUeR8VpIQ2OqgLR2UdpDqjAKpYnGcRVCheLObEMud1ULU2nqniZtSgwtUNolEAICRZcMu0xaSpSQuIQbfuEA1KNDiLBb1dOHYUXwXIc9OOo+d2uPP9AWqe0HQPhnr3ukQakA3/c/RTC0Nyr3BNbefYV/FZ63F8D8uH5a6j/G9Wu4K63XS2W++MoxLl2/x/ZuiQPDncwtrnNwYpjTJztY3d7BqTY4OdHP7YWdkM5vRggCiEYttjcKrK1usNtoMtrbyZ+8dYlMLkU2Gefh/SU60llOHejg4u17PDU5TE/S5Pdfv0g6l+Wlp07ycLXIyGAHvakI79ycJZdN8/ITx7g/t0KxoUgkbSpuiDsJFz80ptT80tefxzTg9fdu8ezJcXbWi8wXKnzlhbOMD/Xx3ic3qVTKLGzYdGeilFuKbM1FC5feTJSDvTEuXbpFeafG8UOTvPvIQWs/nAjogEdrZf7h33kKOzC4PbvO6YleNlbWef3uGtIKN8pKj1aY7I6SsqBQa1Co+vzKV86zsZ7nxjs3OH/2ALVGk1c/esiXnj9K1ivw6ncfMTzYTzymub0wz5mTk/T2pFnf2Ob+8gYnR0aYXimRr7X40nOn6eru4ObtB3x0bZqnDg8hLZt6rYxT66IYcUlbEVxDIXSdD6+vkMnF+fv/4HPsFKr8L7/xGr/4hXOcGBvlm+9eJxo1+dz549RKFf7g3esYxwYJtObS/VkG+jp58uQIlapDYX6Rod0i35tdYnp1h/GBNAcGO3jr8gxNXefpkUMoz+Pe5XWePTVENKr56Pocg8NprFw3FUcyOd5PNCrYrbi0WgElX3Lq6DiGFcPoqJLY2UKoBA/vz5Gv+HR3duAHmpbn88TxMfq6k6SicU5NpCjUaywtFqgXqxQ8RUtH+N4n0yQsTS6Z5sbdNXIdJXYrPkvFXYYmBzkx0MNsvsa9+TyB47GUL/PcmXFEAJXyLi+e7qUrMYyc2WB+Z5EL545x49p95h4uMtCfY6fi0tcVJ5VOc/t+nlK5RCZtcO7sBIO9x1jPV3j34jWWl+bJmJrtlTqrK5qRvhSmSJCMuXzuyDBE+yjVHIo7eYb60mgrTl/OZGV9k0JplaG+Lq7P7ZBNVBgeH2NjvUQ6Z7NbKnDuzASb23XuPpji4t0VpO8StDy2N6vkTiSIxbJkbYNYLs7c6i7RiE2gIHBK/Owrz/M//cG7P/Qa8NfpPD0LfFUI8WUgCqSBfw1khRBm+7e3IWCtffs1YBhYFUKYQAYo/mWfYG+EorWm2WqG6+RBgGhvP4VcHo8g8IjYdhhBqxSGYeE5bhjaq0JOkeO09g9QrUQblhhutSilEO2Il/ACGCILXKfV7lCEKzBhB2Ivoy6C1iHhSEpjH6YopSTwQ2+T1rrNdaJNNQ89WIGv2p0mRbPVIhq1sUwT12vTwk3ZHllqjh45FpoR5x/hlprYtkkQhF+7bdvhODEieO54lCcPxIhGTAK3isCn/8kB7i9sU5mepisRC+GhkRiRaIKWVOS0wo53Ykd9tK+QbZaUDjwankIEDp2mAhFFeB6uBlta1Lw6Sgic9v/f0AqhQzEaVQJLKBQBWkt8aeBrSKEwbEFLtcWt0CCiSCkYsqCkwEYgdEALhaFBKY1Smiaahg4oWwnOfPlrCMNGKx9fh124wPt083LvcbPXOQraUTjGPr5gj04uUEEoqkUbxfCDH7f3M/N8t/1zajyGFfx01Y/9+hUEiucnerEQDHZmOTY5gufWsNKahNvk/Ut3UNLi3LFhrl5/FF5DhEE0HuHC+Sf4+qTFW+9fZKFhkhGKuaJL9sAxfuZYH9Mzj6grg+fPjnH3/gzPH+knZhksb5XA9IjHbGbXCkS9FktrdaaqDQwTcjGDq/cW2K7WeeHcId5b1+1cSQXaC5c6tOa9azNYuJw8PMbIwACbVp7ozjY55XH12hSBCnji0BANT/HJwxX+h59/ia3CNnc2Gvzi51/Ab7Z4/eosLzwxQTWIoLQTxktZEUREcqq/iz47hifCX2YCYbLShHsPFvAx6e2LI3Z3GIxa0Gxx9c4KzzwxyUeXb1H1FYcmBml54Lg+B0d6SVlRtqoNEpk0588dxq9XyW+X6UtEqS5ssFqscPzQCCPDPTycWeXe9Aqj3UkWp3dQaP7Zf/M1Asfn0s0H/NzPXGCgI8316TUK5QYj/Vkc12Agm6QJ/NYfXySbjjHQmebOg1Uu3VtFNJukEyYfXrrJRs3jxMEhphd22ErbEEBxt8ofvnOLcsNlpK+DpIgy75Uplst8/blDOJU6tUaNI4eGWF5aodkIGBxIMTgywtymQ0d3B9dubDLU3UR5gks3FhgcyvD3Pv8UyoVf+80/58LpTiYHsjxaDM3xse5uDg/0UXOKvPtwliePD+K3XG7Pb5KN99ORGWZ6oUilvMPhsycYSKaoLm7jVAsMjA5holjYXWJsPMPkYB/NZgBeE6I2pYaL51TIZnqx4jDam6NaU0RlQMkxmZorkjLzpAwbw5e88eE9hrM2UUPQ8E0UAZslh/m1PI1mDQF8dHeNg4fGuHpvjSDQGJbJ3FyVuBnQqnvkuuK4fhdL9SbbOx7VoEy5WeDgYBf5fIVGtYFh2ShPs5IvcmS4C79S5VB/mmKrTH5lnYFcio/urHD0ZD/T710jEzFJJ1NkczEezDYJgEbTZ60uePv6HQSalutzdCLH+ePHuXZnCW02eePiwx/5vP8rxZPW+leBXwVo/+b2P2qt/4EQ4o+Bnwf+EPhl4NvtD/lO+/XL7fe/85f5BdqfA8919/lBqg11BNr5bmGHxm8Ts0UbYKlFSBnXym+P5zSWZYebeoS+F9XeUjOkiWGYeO3OkVbg+QG2GQov3R4D+YGPZYZbY57n7m/sJVNpAi/AECae4yBkaK42THN/uw5oj+E0lm2iAtlmU5ntsaSH7zbQgQrJ2m6bQm4IVtcWGBgcoiOXpbyzg2WZYWtfCDAluYjP2QNpnpiMEBEevttEEHaqkimDbEcXc9U8G4UKPSKg1xSUuwfIlRu4rSZEJGnLRgmFNCNoKfBciYmmw4piEK4WN+yAlGGQQiEdB9O2QWjMIMDQKoxVAbTQxLSB0iGkM9DQarUwpUXEErgi7Bg1Ap8Imh0FTS2Q+PgiFEtFz2MrgLgWmAIcYbKpBSKbpGNoGKfZCPENQoUdPNE27QcqpM3bFoYIcQMqUGhUOB4NVLsjFX4ez3dRKsC2bdChLy0U0qEZ33HcNp7BbIcG/1XPisf1n0r9x7h+5VIJbFtQdgSpbIL3r97l5547x1hngvur63i2zZefOU2tXMatOBhC4yvNseNHmJ2Z4wNzBN0zxj++cIqWpyiUagx2pHj11T9F64AUgnvzW5x/9jxDyRjf++gq2o7zi197he3dCturOwwPjzAzv0A0HWNkbJT89jZ3lws8f3qMzd06bhAnUH64IStNDNNEBS0Kuy7dMZOa6/K/f+Mthns7eOXCeZT2WZteoiOTIF8sU2u4HBnsZWphm/XdKsP9HVy/O8vcch5TQLnS4FGxiaE1td0iRjJDR2cPqZji/sw0KyWXv/vSOUr1Kv/mTz7kyLERXE+zvFrgs8+cpm+wn4sfXOHMyUO88tQJHkw/4s6DVV4+d4T13TpTi+E1cbsRcOn6LJvlFo3WFQY603Rm0gx0dWKYmt+9/JCzJ0d588p9lua3efFED6N9OS7dX6PluSwsF5hfK9Bs+jxa32V1s8S9lSIXzo5x/OgBHq1sUSxUefnscTozcb75xvs8c3yIU+PDLJQavPfJFBNjQ3RnYhTvztPXlaG3I85bl2fBloxkEiRtwdT8BofGBxjryHF7ZYsTE/1Uyx6mbTE2kKG/K8GFM8fZzO/yR69dpF4oMNLfweWr83RmU8yvlOmKCwayEcaGhvn+1WWEDvjCC8dZXndYX31IMmGjW3HW1ldZ3tjA8wUjAx3UWhYSh8nBbpYKLX73jescG+kmlUziVqsk03Ea5SLb9RbdO9v0J2K0HI/78wVGR7pYXMuDdhnIJhkf6KVV66JZbmImUjxYXuPM4TFiwuQbH9wml23w3NPP0CxVmCu7iJiPiKWobOXZrRdJpeKsF8scH+1iaGCSRq1OJBYjHbE5eXaSTCTKn7x7hQtnxkhGbSo1j7WNTQ5MdJO0M+yWWnx86zq9fQPki016u3McHE4jrSyFwg4aSWAHfPG5z1CruLx+9wGlhsPs5g6JhMXS8jr/3S99FVNaXLy1wM3ph0yMjGBJk9W8oLC7y5OnDtFo+hQKW0gjzjvXpvFaDjOreT7/3JEf+bz//8J5+ufAHwohfg24Cfxm++2/CfyuEOIRsAP8vb/qjrRSeG4LaUgQITsp0CGLBF8TEG6mSSlwXQdDGkTs6P5h5wcBpmnheU0MQ7TNzLrdhQrHMo7b2pC7tTUAACAASURBVPe87GWemaZFoBTSNEMekQ69Tc1mE9uOtn1LAaZlIdBo5eN43j7RXKPb1OxWO8LFa2/eeTRr7c+Hhna3ShCCOff8OBBu5wkBW/kC+c0CAkng+gTSQ5oGlm1xrA9eOBOnOxOFwEFoFwMPgQnCR2DQaQiMVJydimKq6fOo1sKszRNDk5WSqGVS0wHSjoA0sS2LprBJ2mYYgqw1CdMmYkqkULTqdXKpBIa2cITGJMASGtOIUGk5aAFxE+q+j/R8XLdG0pa42qGsQJpQcT0CrTF0gB1oHKGxA0UzgIav8RS0AqigabSjX+KGT8KU+x6mEI8V7hiqAKQAy7L2ty0RYQcwUGq/62QYIvSIaY2hQ2ZWaLI394V3uKUXIE2DeCwexkM4DqZpPSaM//+j/tauX4VyjWpT4wU1Tnzh5zly5hlW7t/kw23NyfOv8HLPfXb8OJPjvXzhBYOFb1/G91yuXrlBKpWi46lDHDh8im/+3u8ydvgsI6fPcPfRInGtKFVbbLs+zzwxxMqjJa6WK3RlsiSTMb777i0m+jrozkV5++o9VosVBge6mPrkLoEw+eoLp9jdLfH9j2foONyNCkAYGql8/EChfUU2UHQmk7i1Ft0RybmBOIv3H/D+9AYTQ50c7kzw/tQSdizOeFeSua0S9+fCjoGwIizmdzlzdJhWs0GhWMQ3ejDjSSLRaHjN1B7VZpNjo91cvPmAu4vbJGzJ4FAP62sl+keHkJE41+8vksx1IuMxfv97l8nFYxwe7+fe3Bq359ZRwuTYgQ6mHszTkYpzaKSL9Z0KK+t5DvQd5HtX7zCXr/DkmUlefuoMK+tFPrnxZyyVu9i+u8HseonDQxkqLYdUJk213qK/q4tkLMK9+U0wTFaXt/GUwDYC3Pwiv/fWKqYOiLlRrt2f5+PZDUYHOxiIR3njxiID/WkiZoT8Vp10MoHj14nGDK7fX6bUCJhf36SwtkWxXOXw4X5ePn2A165OM5cv4yjB3KMFtIriaIXrt3i4tEzONvCbLsdPTNLfEeOja7PUmzXGBgbYzu/y9sXb/MKXP4PwBXfuz5FMWdhGmkKlSbVRJZOJcHy8CzB485MZJgeTPHX8GL7roisV3EiKh/ldxkf7SVeKnJgYxwh8jg3USPb0sLDeIhozmZgcIWVZ3Li3wEAmw0a+AFYZE7h+8x6lmoPnKAw/ye3bd4i0HLaLBUTcZLS/k8GDE1y+O4fjKrriMXZrCmduHcvUpOI2kViaK3cWiOoWnZk41+8+Ih6RpGNpppZ3qHn3OdAbxw8iuC1NoKr87LNn+GQmz8dTywykSqQjkvxWmQE7xmtX7tFp22hP0xGHl194EqepufJgllffuoXwmrQ8RTKW4ObDDeKR0HvbnYkRNCoc6shx536Fpt/gSy9cIC1s/o8/fZfC6taPfN7/jcST1vo94L32y/PAhR9ymxbwC3+j+wXCTbXw0PUDBx0E+3RuCHPLHDc88FQ7UiNQCtu2aTkOpmHsm8rDkYwmFovjuk7b6xK+XQUBbtBCSA1aYkiJ8sOOBlKiNe2DFUxTYpgWaEmlVG77bjws08a2I6G4auMDBBLLCrtLUpp4gds2vRuYMoxZCbwAjcI0jP31eaX0Pjtqj5CuBHieSyaaYLzX4unDHj0ZG5Mywojg+x6h1IjheD6tlqbUCsgKSSYm6Ysk0E6UiuOy2/JZdBxktYVE06KFQhCXAtMwiEpNzpJIYWBbBlEdgFJhEHIkgudrohET3/Xw2uJSKB8ZCJoRzVZLYRsCw9dUtabseDS1xPY9PMAPBE0d0FQKN9CsKE0t0BSVxFUSITUJYZA2fWLCwDcMAhliIoSUBKqdMRiEI1chBIHa6yxKEAql1T5ywve9MCDZkPuEeClNrPZmHWoPM/EXgZhSCqLRKM1G/W/y0H1c/wnVj+v6lUjEGRroZXUjT6u8TXV3k4VCg3guxcTBwyyUFsn1H8FvFEkffJLDh4vcvnWLw+NjPH3+NGcmuqnWqrx8apD4xCAzm2UGO1L0jXXzwcNlRgcGGejtZHPNx3MV6XSCrcIOhgLtBDwql1nfqdHCBCuOMlqkYxZzq1tMza6TisfCMGIVXleUclFRk4Qh+NpLR/Gqdf7ttz/m/LFJdl2Dmu8xOdRBdzbKe1NrxNIdTPR3cnN2jboK+NyzR1nLl/jozhL/8ItPUtot8uGdBY5PHuL9VbDjMSJRGyHh8v01vnKsm0PDk7TUMuMiwtkjA7z+wQ0+mdlgeLCfpUKcwPPIxiMEtk1XPEaluMVIeohNP8At1zh2dJRGtULddRCuS3dHAkNanDraxWqxQqnp06i7PJpepry1S6ml+LX/6gsMx01+470H9HdEeen0YarNgN/48/f5J1/5DGfHBvmtN66S7Exx4exJyuU6H3//Iy6cOIgnIxwY7OG1926SNSWdPR30dnVimXFmiy7Hx/vp6k3y0rNPsDi7xK25i4z2d7G+XScWT9DXZ5BJpokaJkayhOsJPrk/z67jcWK8h4SAmGGyslElFYty4NhxhlIRPrw6TXmrALUKF2cWmFrb4Yhps1u4T7npMjHSx6WpdbLuDuWqx8aSx0BvgsH+Hm482uCJriR37y5gWhbpWIiOuXJzmu3iDqV6nVzMpL9/gOsPV9mqldlp3CFtS1a3qgS7Bl/77CnGug7wW3/0ITP5Ij09PYjAob+3A0vDndVNzj81wYkjx/jokzma5TUODA1S3SpwdizChl8nYWeZWVokEokRly06kylmN7f4/CtnGOjs5trsFh/ffMiTEx0ko2nm14ucnuygq3eEpquQsQh9cY/jk6N0x7NcebRIyRd886M7RCMxUpbFxYdLpCIGuVicYqHCWG8WM55E7dZIRqJcvrOCW6/QaLr05EwynV3sVBq8eWOe4wd76evsxXEc6k6VoZ4+6uVdnj04wFK9yNJqEaNVZ7K/i7jV+pHP+58YwrhphoZw05AoP4wvMEyrzenxCQWUjZTswy79wEd4obDyg5A3pNtdCHSAadr4fhButQgVknXR7VFZm1YeqHBDTkiarRrQHhUaAqVlaARXXkj+1gqEpF6voHUcIcIVecOw9mGYWvsh+0gpTNPGkOEB7fs+yWSKRqsRwiO1IPB9fN9FKT8UVL5GmSCNECQ51lnilQMmfRmN4e9iCE2gFSgPhKBVX0EQ4DVjlJtVOgWgJQkU2oKkESWVhEjDxPccdjTsOgE1z6OkBTstTdELSJiShFZoAfVAYyjJcAx6601q2iOnBKIdweKikUriaHBQaC2pK01DCaqBoiZNZOBgA67WNDxNU4MPmCIEbUalpsfU2FJhCwnaRUsTBxGa0aURYglU6EFCE2YBGkbbdxZ+T13HwbBMLMsKf45aAxKjjW3ai7MRfOpx2g+SaUfIKB2KWa3D8GkV/Ojtisf1uH5Ylat1ZuZXyGYjOGaU2R1NtivHwOgIN24+YHd+m1ywztrCHEVXE+gADJPPPHOBVCLOclMhnYBg6CnyFY+k5bJVb3D59iJHRno5PdHJGx9dIZvLcOpALx/eeshAfz/PnDnC7PomH82s8d/+4y8TES7/5++8y9PHxnn+8BCvXbpFJB7lueOj3KyDoQy0tkMhpcPopEdTi9zf2OHlF57k3KEhXn33GoXdOuePjiFtA+Fv0GVb5Es1yi2HE5NDLC9sMr1Z5sVTEwhHYwSaLz05Qd23UfhoTPxAgoCubILO3m4uTk1za3oZGYsw89YGxVKTX/7Zp/GdOm9cfMAXPvcM/R1R/vzd27zwxBGe+OozvPXRHe7Mb/DLX/8MuajF6zfmOHdknIGeFHfnN3n23BGeP3OYuuvyL/71N3C8cBvZ05pM3OD2whafOA5RqXn2+BBrhQJvX5vnifE+/EbAty49YKtUJ9eR4OadWe4vrNOfiZFOavLbRS7fX+Gf/uevMNzVwbcu3uXB3CIH+jI0hA0Chls9LK69y+hIP52dWbqTMc6PD/A7b1wjYsd44mAvyysl1teLPH1sksnuDHdX7zO7ssZLT53g6cMTFC7dRtZaXL55n1zEZDlf4dBoJ6lEJ8/09VNo3OSF02MM9w+ytLnLxRu36ErCMwdOsrpW4Pv3ljjQn8UWcP7oCAPdEYb7RolbEX77ux8RjbocHR3i4MQgd2dnGRqeZGtzi4P9GWrLDQ6M9qPrHr622arkeThf4+F0ge6eTsxIjJm1XVod2dAr7AQkcl3Uqybf+vYldss10mmbj+4sMreyTMoWXDg9weUrd+jIGURFBCkknucy3JliZnaVrbUSK+WAVqPBbN6mUt2mryNNs2Vw7cEMB/o62Mjv4qUk8xv3qTZaNJsBJw938vWXnsBt+PzZ5TuMDKT4u88+QcpI8MHUfaq1APwKUWlSrde5cHKY8c6jXJ9a5KP700wOWJwcHiZfcsIzwPewgU8e7RLoOT57/hRys8T01g6L+XWeOnwQaVa492jxRz7vfzLEU/vgCg8wh0CFKddCalrNVuhVYc84rrBsCxWEHQkDkELjen47asXEcz0Q0Gw223ev21Rx2n4qiZQmzXod07axo1HclhNuzbW/Ft9XRKMRPM8hcFtIEXaoDDM8rKPRGGC2QZ4ax2mG4s+0Cc/sEJEgpIkONKYRQj+FCDdeTMvCtixcV+D7YW4f2sGQcXLpKC8ehmeOxbFtEyVsAhQKDyl0mI+nIJapY2hoCIGUNXTgt4OHwZQBaJeMLxAiQJkaiUHGNNCYOFqwrEy6lGRAKuzAoeEp7psxVgKoegFL1RIIiaM1zSAUIagAu23oNyXYwm9v1IGPphEo4kISFwFJQ9AnRRg900ZGGKEzCU+DrzU+AQ4mNSVQUmEJ0f7+STSCaCQGQuxn1O3xpZRSiB+IYdHofW5TuAUpEO0NvaCdiWgYBoHWYbyMCEe4Qouwg9WOpBGPOU+P629YiaiNhc93Ly3yj06+zJiV5+3L0ywV6hztS7FaVXz46rc4d2iI5aUiUzOb+IHiW99+k8nhHM/0KYaTUR4VWqQ7Ohgf6+X1T67ScDyq1Tr3FhRx26I3GuPGzBqeB0npc/n6PSxDcnask835DdLZBJ85PsloOsLvf/8aq3PrnD4yiAh8HNcnQGMbZugT1QpDwHpLYyXi2EGTf/fND9hteXzx6RMYXoV3bzzi62cnqNaqvHV9mRefPUNnV46puVUqzSbZnizXFtbZ3a3w/Lnj7JY9TFFBK40lQfjQnUvx8Z1HNOoNzh0YYHZli41KneMH+lheWsEJJC+dO4BslXjtrXUsYVDZKXPlrma+0OSzL57h2bOnWdhYY7C7g2NnJgk8n/TKKk+eHmB7Z4s/e+8+T54eZ6Q3y8PFNRYXChw7epgDE+NcujlN1QvYqMPoYA+HJ+sc6O+nM5nEt2PMb+RJW2Fe6kBXnGwizvZui0BJejMJ1usO95bv82A1z6HeJBMjXcytlakEmqHuHNI0efWNy0jt8sBXbJRanD3cz/DQIHMLJZqtJtFolKnZOXY24uR3Srz09AmUb/PdK1O07BhOs8SHj9bJpRNU6k2SMQOz32BmvU6gNVcebPDg4RK1hk+1VqfVivFHGw9RDQelNT393Zw/dIDXLj1gfWObxdUpVOBhBR7lnV3keC9bGyVmV3ZJJWfo7Ojk4fwmdd1ieTXPUCZNfnuHQtPFf/CQkxPDPNrYxbZNulM2jtcgbsYplXYZHujGq9foTkaIRTXjI+PsrO+QPDBMMitJZIcYGRY4Tp1sVwc2BgvL60TTNolMJ77Q2DFJZy6BDnyy8RiLm2USVosnjx7BUz7PnOtleXmefD6PEbMwIxb9A4O8eeURvlMnHY8SMaN8cGUa3aihIyZnj47Q1zOAoSXXZxa5+XCNfEeJWq3JwaFOhnv72d7eYaI/w3atie37bO/UiBqCge4USyvblPIb7awxi4+nHpEQqo1A+uH1kyGehGhvQ4XbbX7gY1kR3CDAkDamEW3jA1w8LwD2YJMmjtsCZOiNUT5Wu1Mlpbkf3aGUIvC9MB7E/FR4WZbVzjSzsKwwGsQ0TRzHJVDBfidKtbOgwphhRSQSxzDMdohwWxCJkIQupUBKi4hh4wcehhHiFDzPRwXefj6bFu0MP9NGGlbIcorGmOyzeOmYz+GxHBob/GoYKSMMtAqjZNA6DBJWJgtbLu9PJTiiLFo6QAJePEaq4iGDAKklbhtAaguNrQSBF4aCjkqDmAFDBrieQZ/wSSufo6akJBUd0sI2wvFaUytcFZDUNkL5RIREKkEbBIEQAjfQNAjheIYSIMFR0ERjAn7bWB/o8OMMKfC1pqolviLsFhphVzGWiAMyhIcqtQ9PhRBjobTGMEMuk2F8Gq3i+/4PEMTlX4Be7uUk7lPk2+/fu9896vhjy9Pj+ptUwjYxpeDw2ACZiGK17KCEYHd1gTdnHD5zbJT/+uvP8N0Pb3Pj4Tqu62PaJr7jErgOi8sFbpXrHD44SMas8+t/+B2OHzrEV198kncvX+fDqQ1+4bPniNLig7uzvHL+BD1dHbx+8QrpXI6nTx5ie3ud9966z+jQIEteuKTy9S8+xfzKBm/emCN+oA8pJJYBMghooWnWajS3NpgY6WZzp4KnfT7/5EHyq2u4ToPPnTnI7HIBB8Xf/8++SE9ngm9+/xKHJsf5xZcz/MFb11gqtfgv/87T1MplPr67iTC7saMQjUdQpoFhRQk8l5HBXjLZKI2lLRo+uD4MdXcjpMn4yCie8qhfnWWoO4klHf78nY8xDJPObIbf++AWGxvrnD0xRlCt8WB1h4nDkzSdKMl0nGKlTjqeZadQxZBxMt0dFEs7/OZ3VrBQvHhuggMDnXxw5T75YhHbAsxe3r76kK++fJKzfb38zvc+oVBu8sq5ExRLdb7xTphrN7++Sa0pqNabnHzmLK2Wy8zqMi+c6GHEanJpeoOIpTl79Cgd2QzL+R0ezM4zNZsnGPIp1hyU57Fb1aysbxIEAY1ai2MjPaieLK9+eJNSqcLnzwxRqHms7wRMjvazs1lga6dMELj0ZCP0pTrJZdK8e/0upw72YGuD9e1d1qotloqCj/7obTKJJMNDGaxIhlq9iQrWGRnqYLPkM9jbw9BOhc2SS7Wxg4cgZqaZz1ep71bpzGRY3a3hGh4f3HrE4YPjROw4Szvz9HenqZabaC9gc3uDg+OHcOoVltaKzBVmyEZMtre2yXalGRdF3MBkbmWXTLWFMiyEEqwv7aBaHs+cOMxOqcDado31zSLdnTG2iw6ZuE2+/oCD3VnWijX6+1J85twEJ/p6+e7H0zycW+CXf+6LxE2D//CdiwRumYxtkkzneP/2EoEpGCzUiFkm9xa2OHF6nJoXwUxYVGswN7dEd1eOzZ0mC5ubTIzlOHL+IMsf3qRU2OXIqR6Od07yrSszxKIOX/6ZF9ncLvPOx9M/8nn/145n+XFWOtuhLzz7chjQqlW71edhWOZ+flrLcWj7wInG4/iBj21FqdfL2JE4kVgMx3HwPRdDCmw7huM1kJj7eXmfMn0gEo3SajXCFrYwkIaBClQIy/RctPj0QKV94ErDQAKGGZLKbVPiuK1POx2E8SFKa0xDYhoSVIDzA5uEYcSLBhVgmBaWFUGgScSjPHk4yYVJ6EhJDGkT+BWEaqGF0Q4BtkJjOj5ae+SrSd6+rVgreXy5OEeuVSVmCLTvYzfrGMrFCwRCK4TyKLseu04ovCKGQcIOvze2CmgpgYXG14ogEPiWgeu4RIXAUAGehpCMFTKRhNYYaAI0WgtcBa7S+Dr0jUkp0IHCa29PaiFohAoXX4OrBY7WlLSkJEysdlKqHYniDE7w/H//q6GoaQf6qjb7ao+7FfgBe+GBphmKJtpCeX/0JiDwPRAS0/g0KHivflA07XUcS7u7/Kt/+S/wHsez/K3VT0I8y4+zOpIx/TPnj3D62AiLyxssru4y1peiXGrQcnyOTY7haI9Lt+dxhEW+1MKyTKLxJIdGOjnaY3LrxjTjY31YIsBxffp6e1jcKOJozYG+Lu5OL1NstHju3GFM7TM1t87oYC8Robj5aIvB3hSnR/rZ3inwwZ1lHASDuTTb1SYvPnWSm+vQCjRCqzBiSmvwHU7mfKIRmFosMjk5TMKSuPUaTd9nYmSYQmGH7c08SAszHqdaq3N0sIdASm7PLDExOoCQmplH6yzsOsh0L5Ypsawoph2lWVwjZ9bpykSZWd4lnU3z3BOHMFTAux/f5dBkL8oXLG6WGO9P0aw3ub1QIFCKid4sO00XP5AcOTjMyxeOUShs8+3vfcIXXjjO2kaZKw9WGe9OcnS0l1oj4J37C5wYG2B3t07VCwVLKmbSlcuSiAhcz8WKRSnuNhnpzWEDnekkHoLp5U0MGRCz48TjgnNHDtCfTPD27VkqjQrPnT1JFMGfXrzJS6fGcatNmkLwaL1ILpcmFYswtbDNynaBrz13kpRl852Lt8ik4jxxdISINPjupSnSSZuopQjcACuWQCJwvRZaSWw7wuRINxeOjLG2XeX33/qY0f4+RnMWq9s1dhoN0rEExeIOPbkUZcdjaKiD84cmmFspMrNewPNaJG0TpQRNt8Ezpw/QqCnuzi1w9vgII529bG5Xef3aAwa7ozxzbIx6ucUnj1YZ7EuTy2ZY2tjh0Pggc4sbJBKakcFRUJJ7D6cZHenDdDU7LZeZxS2Wt4u4jsf4YJaeXBd35tYwpOL5U8M4TYNqeZdYNo2FRXl7h56eLBXlY1vQlesgcD0eLK1zeLSLnkwH5aoiX8lzaHSU/kSMxUKV+e1NonYG7VRIpRLEDIeYtKjVGtRbHl1DHSSsDJb22Km5vHVrjoityMTi+IFHfyrF/Eqe7phJpCPG4eOHqFebbBVaJG1FyzHYWF7GtG2yfTnyu02EX6fagivTSz80nuUnQzxlcvqpFz8XHnQ67AR5nkssnmjDLX18z0MKgTDC+BLbMjGESa1ZwbZjoAXhWRuutUfsGI5bxzBsLGtv5OeGQkmIcFVXB/vCyLLssCviBwSBC2jsSBSQNBs1orEopmXviy8pBJZp4Hle2NVSP7DNBezZ4C3LDA3oQRjqKxBIy8RzmpiWRAqTbDrKy8cinJ/0sWM5tNRIFSCEHwpGIoigRSAsAiVQQlJpBCzuxnn96i6DIxO8uD5FdH2eQLv4rkfKa4WCRCt0EOC4DiXXo6wNTMLvU9TQdJihIPRo6xRf40pBFYHlayztIXWAFgZKteGUWhOgcHxNydd4OoRc2lIgRRgxoaDdMRK0VBjh4hMKUVeH3ShXS7aUgRYGVhBmAGrLpjUwyfP/9J+3QZahENvjZ1mW1e4mfpovqNsesz2WU/h1sp+BJ8UPhjuKtoAKbxPywtrcrkCxU9zmX/3L//mxePpbrJ928ST2zHWP63E9rp/G+n+fbfdjLwHSsDClbGMAJEJY7SgWQAgMy0IFbns0FhrENQKhwwwzKxIJN+X8AHRIAtda4Lle23De9hPrAGEYOK0WQkqUH2CaklqlQjRiIwhHY5rQF6WUxrbtsANmGIDEbTVQOqDRUm1/VBjnYsgYru+Fnq1IlFgkCjoknXtaYZvhIa20xk4kUEox2BXhCyc0h4YdhN0F2kSoRjt02EAELlpUaKkEi7sdFKs+CBON5MFynsEDxzl7+kms12exDIklJQF2mPuHTyxMYyAINI6QxISgJSSmMFD4tLQm2haUvlJ4QqMV+HaCda/KiDSIqnaorhBoQvDltqvYbQUEIhzB2RLiShOXAqkDXA1CChw/TI9XQqIDQEp8HRr3fQ2BlMRU6EMyFOFGn1Jtk7eBYYSjNaWC8GcRie4T6NGhD8v3w7Dg8HaqPUYNERBhkPCnAcsg98GpoPYjeIQwCEGo5uOx3eN6XI/rcT2uv7R+MsQTArTC98KOT0itBqV8tA6QhkkimcT3bbQKN85MYWJZETBCTpRue2Nc1wmDeqMxDGkiLRPfDfPZBG1wIhohBa7jtn1UYFsWvu9hWta+QAsCH8u28f1wM6vVDDe/dBB2OGQ7WFgYAtOQeL5PNBoFEcbBqL3tLSkwpAwjbbXGkP8Pe28WZFl2ned9aw/nnDvkUFNXVQ/oGd2Y0ZiIBkGAICVqClsPVshyhBy2w2G92M+2nv3EVz/RUoTDpiVzsmxSFIODSYqkRIgwwAlzg8TUABqo7pqyMvPeM+y91/LDPpkNKMgGGBYYReD+ERmZdevmzZv33Dpn1Vr/+n5jb7XgiWstf+3NiSsHgvh9sIRI9eXYmV9KQCTSRM/1/Q3oKV+7fYVP3uh54PqbefbZt9KII29PKCJEEXIAbTo0bcni0JxRgwhkgeCFYODFM6jVXpkaapW+3YTIhbIlYgRTTswIziOqJDPuTIU7Y8GJoxHFS4Vc+hkJEQOUfEZ0FyiGF0eWQlJjUHDiSeIIQBTICipCob5O4t25efuMFN40bTXE21xczXgCcQLmifHV+4vUIrjiCZQahifz6K7MOXh+9qBVqOaZR26nnXbaaaedXkv3RfEkQJp60jSy7JaMKZ8H/uacKTnT9wNd13K8OcH7hiFvadW4dOUqd26/DMycJAk0TcC7AFK3sELTAEb0DWX2zmie2F+vGaZQDeRUCGftfDGbkTMlQYieXBIxtORpOOcDxRgZp1RX5+cLdh0n1Yv7NI0AOJshmQJt8CyWwvvesOCdTzSsmgLSoparvwmwMlXPkNatGLOGTYG728y2D3zm67e4dP1Znn76DXjva9EhniQQSiFlreZ5NTYl4ydji8MHIfiOU1O85UpnFWG0TDQlCDSAjyDbic4bg/k5RsVIppjBdio4jM5BEIcHwhyJc+b5quNTODP3qykqQjbmz8YINePOMk5s9lwZdnYctI4Xz7YgRahhyXMXKoR5u05tBpIqOZe5EKoFVwgRzRV1cVY4mdboH/Fnm3t2XqznnHaA8Z122mmnnV5T90XxVDsthg+RIdViqWkCZjJ7P4G6FQAAIABJREFUUQwtyjD0xBhwzlivr1CKcu/oFsEFBKOJAbSupuOqXyZGz2Kx5uTkhGmaUK2RLqUktpsTxAdKHmm6Ze1ImUMsUXKpWUxWx4NOYBy2FXntKgvqrMt1xh5yoa7Jq9VORtt2jOM4hwgry0XL5cMFH3xD5pkHT3HhEHN7oBNiI2JlzvQDcGAOMc9Jabh9GnjlaOTffeIVHnzjh3js0WcqYd1q1AslV5xCyZAV01rgIJ4UlJOsXBDHpoy0rqETIVE9ZKEoDYoD8JHTSXF4RAungAsdqglF6EtGMaLUgPaKrKrjPMEI4ggogwijCENRdOYsDaWQzooYqbiCoIafzecem1lWxvb05NxjNg79eUdIVWuECmcZz/Oo17/adTozhp+N7hw1MqeUTC559qw5gpU57LnMvwjnwNKddtppp512+vN0XxRPQAVNCpUf1DQ1skUzU5pomxbnHIvlPvfuvkwTl4zjab2IisMJCMZytQIcOStOjKKJaZgYxwEtVkOFxXDesVisACHniSDgtMawtN2S7eYYgBgCVuo4sY6G6rZcbLq521Shi9V0/CoWoQYLG6bKYrmk5Ey36HjsgYb3vz7zxJWMyhLRLTJvjVUEQankcypHqbjArXSJl9Lb+MgffZiXb9ziLe/9MZ547Om6Uj+vH4oqZXOKV6UUg5TwLqAFwGgELvuAinHoPEUKQWth6qjgTz9vyWVVzDm8GRkhUKr3DEeHcDK/tlEcwQleBGdCEKPxDlOjc8Kono1VD9NgRjNv5dm8ISdm4KrXyqymvKcZOaFWsw3Pthi/danBzo3+zP6rXFINPD5DOlgNgjbOCqXqkcrzuBWrHa88pldN6SKoKbmkXbbdTjvttNNOr6n7ongys1pAaDULN8sF4zSxXLR0tmQaR7BCLspiscS5hpxraK/zUjtSITKMI+IcMcI09XgfURyhiWy32xmQ6EjTNBuyX823K2XCR49aqUgCqwTrJsbzDDuZQY0lJ/BK2y7IpgybYd60M7yHYZjQnBnSXbrFgr31mnc/FXj+6Z71ApysMOtxFETrNlw1zQcQh5qQLHK88dwZHb//wu9z4/bEO9//t7h+/TpQk9wtl+qlEkO6Bh2PQWsMg83hxw4lqFKoWXKIEp3QBFdHbVY/JNctvlMxrq7X3M63mZLRnBUfVmNQEKEToZnHdWe074jhAbyvnTMzSpkqSFPrmI6zQsmdxcfVzT2dI3hkBmea1ABo7zxilRfFzHkygFKLWJkLHsTOTeKVKF9jd2wmiBethVMp5ZvYT/ZN5vLqaZN59LhzjO+000477fRaui+KJ+Cc4VPMse23iK8YgJwzYkoqGdf0dN2CYaiI9b31Himn2sUwI6dq+AZwLpDziBOhlMpgqsG8ibZpmKaEmzsl4t2rnaOS0TShCCG2uBiQnBCYL76+di1yIQSloOzt7REQSqljQR8cSRMuLNhfLXnv6yMffPpluvUljAWiJ3gmQKtpeR77iRNwnqLCUerY5BV/9MJNXvr6yA/84F/n8NJhfQ6i574r7xxiBfoBb0JvhhdPKpkghpTa0fLztpxIjUkxUyggnuoNczDlhJnna5stLhUyUqNOnENnVASzqdzEKNTizFG7SDLXOWZKEMNpLYQySga8Ga3AYDAVMD9jR0v1THkM8Z683ULOEGunUO1VJtNZ/p+bvU5q4CTUIimfdaqUrHnuTL76HgshnG/knYczz3Tys2X6kvOu87TTTjvttNNr6r4pnqpRW+ZNNo8VnQGMtRvlfGAaRkQdzjtKnhjHcS66qm/FKTUXzwVC0yFJiNGjRVA3oXnEh0DKYyWD4ylW5tFRpUufbf2F2aRcOxyOcRxZLhakXLlBBuQ0+5OkoFK7QSmPqGXWXcvj1y7zrmcLb75mxMXjmI/IdISQ8Q5wHiPiXN2oU5Rc4MSusLU1H/7kl7mRVnzob/5HLFcdbt4w8y5QDdB1y3CYRmKIlNHwRXEl0Qh4VTjzB80fdSsODKGIogRa6qai946gjk9lzxulAcu1GMQILlAoFJM5OKX6wLwZwVW2lYhDTHEG3oQiDlWpz1uqF0lwBLOKLjBHphZczObyoplpHNhuT1m2kbOyt8zgS8PwMygTkfMi0jLYzDtnzq9TFGbMwhlp/CzXjrmbWEplRNnc2SqlsKuedtppp512ei3dN8WTm9fOS86E6PHBI9U5jfNnMRwOLQlROUcJYIZzEH29eLdtyzRNdaQV6oU15bF+LWeemAJeqsHcRaaUzsd0fd9XD5U0ODHS2ONEWK1W9Zoq9eI6TTULr/UNeZoYhhOcONo2cvHKdZ6+tubdT93lscv7FVGPQ2zEdCLnghchRsOHOYPNBrIcMMoF+kH41x/+BK/og3zwh/82cYZv+hDOcQd1rd4xjT0lTaQx1Xw8andHqyFrLj6N4itXyWNMxbAQSTiCjyRxjDKxmBSvnicaCJrZ5upVCiJky0jx3MPYjIEHYiZ6xyRyXlC5OS8LA2dGkVo0Bav+JXNSDfEieDFGM9qZuF6LKKH1nvXFy6wPLiASvuV3Pes+nTGbZIZnnnnOzorJEGKlkhet7xEtFFViCJSz0Z+4utlI9cBNqUJM7wNm7E477bTTTve57pviyax2dPb2L3Dv5Aiy0MSI+Mricc7V4FupG2SGo2kaHEIatzgHbRuJ0aEFclG8BMwKMTqij6Q8AkYMDRIbdO42+HkrC+dZLsO3ABebpgFXk6FLSuebXGqFlAwrmTT1GMrequPxhxoeupR47smeh65cYsTjdUDSCTjFixGbpgI9LZAnT/RC1gqUPN70/NSv/THThbfyoz/yN3GhqWNJZp4VzMb02jEpRXEhkhcNsi14rUWT846C1h02J1gZETkDQjqsFII0vDIWfvtWz+uW8AONklzhim/4NAuSUx7VkVEzAeFzg/ETLxd6hWc6+M8u1U02NQizLwlqCE32cDo5VlpQB74IJiCuHk8pdbPOafUcOTMcQjCl8Z4QQz3O8/YccM5h+vdjVr45x+7MxwSCC34OSi6Ilvk9pCD1NQzB18xBVZqmPq9pejV/cKeddtppp53+LN0XxZOI4H2NXNlOIyFEum6NiRGCMA5bYtOBq7DIOpIxNI2YeELTEua4lZTznI9nlFzp4sHXWJDow7kxuGiZw30TgtB2LZW4afTDlpQSTawxMXYe6VE7OWmaWHYLhn7DMA6IKA9fbXn20ZY3P7bidVeWrPb28CFg/W1UeyS4ujIvESzjnVBU8LSUktikhi994Uv8wkdvcfGpv8Hz734eF1vEgWhFI6DV83M2dgKrUE88YX0BvXuz0sRNoVRWUpkLz1gcDUqQSjh3wVNU+cxx5qG9wK3TzP98p/CfXGn4vE2c9sqeH2rB5R1H2fFTtyfe3EWeP1D+xc3CNybPI50RQ0UVZOoWnXcen42blnHREbVUX5XV4uk4K41BC5gY3l4d6zmscpjE4Wf6dylnQb61qKl+szCb98vsA3Mz4qEWmUXTvK03m899fawQvqmDhcxGfY87Kyx3bvGddtppp52+jdy3v8tfjpzVCI4QHO2iI7aO4D3jOBKCxzThvJDUGMcR5jEWVkALlhOCzd6l+pHLiMxbVdPUYzjEzRltBiUlNFWSt8yG75xHmq5hb38f41UPjM3eqq5tsZIZtids+1PaKLz+iQd56zNP8P43XOUNDxYO1gHvwKYjkIQPixrIWQbUTjHrGYc7DClxvDnmpFzn81855tc++g2uPvmjvPvd7yM2DeIqiTs2HSE0hBgJMdK0DT4EQmzwwaNeKHHJqRaGeVRmWmrnRRTLaSawG6kIpiAZAsq9DG/Zi/yNi7B2nv/+SwMfvdWztoH/46XMr5wkhhz52VuZBzr40UOlQ3jb0vG7fQEKmiEVRcyhEihaQ3+vCWyCQXQ1NBmYirJCZ8K3UKRGJXurkEyHkKeRnDI5166QWWEulyu5XTOGktJETomcEmmaSFOipHwOvaxHtb6Pgve1qJo9TjB38qob/TyzcDe222mnnXba6dvpvuk84SPbflPz5XwgzyG+wQXaGBjTREq5br1ppmVFOeP2YExpxBI03ZopZTDFz10W1YKYYVPlNXmkdqRiIHhffThxppGHgI+hhtC2Le2io5Q59kWNnBM+BtK04cph4B1vvI65luWF67SHBe+OZyPyUM3KBEwzhkfcXt2Mw2i6FVn3aBcP8/Ev3+XH/8nvkN0er9fPUfLEau+A9d4+i/UezgViCHhxc7jxGQA04pwQY8tKlV6NpQuEM2YRgM4MJTWaEMkCyWDtaufqaJroimM7CatYvUdf2Rhv8fC+A88XtvBhS/zexvhvLnlaV5CivK4zPnqndgGd1GLIm9aRJx4z5cDDkRpkpRhgRsAoUo/JZA4vgawFw4jOKBjFuepDm/1MtXCaKeJWKeKllLkgqo24osyU8FoYifM1t24ezZ6N89JcSDrn4N+7v/P+W8aBO+2000477fRn6b4ons5CZytNPKMSEMsEr3OYrxBjg1qh5EKMLWoTTXSYNYxpQnHEpsX7QIwNOY2YKk2MFKtMpKbryDlVk7n35JRxIWJaKrBx7jTZZETnq8+JOtZZtgvAOL53h3445dqFJY89/hgnacGDl5RH929hY4S9QwwFF8F3+PGoRpV4ENfipP4eJ31mkIf4V//2E/zmb32Gl29vedu738rhlQcZi3By8zbN8Qlt24Ip/bafi7gJVSXG6s0qJdM2kedvfIXXOYfkTC5GpGBazeh5jo4ZSmERhABYKXipW3FBPL90lPjoiRKCozfh144L153y6cHxb44nnll5thi3knExeC5QcFZQamago8auNOboQ+BElSFlDiiE4irnqR5KsArX1IprqmNbE4oaowhZPMvVijL7lLQUgHlJoFDZ6DU0ukJFmbcF/XmsjzjBdMYW5Hyek8cZJPPszTfzpFKppvK0QxXstNNOO+30bXSfFE/KNG1pmoiTSrpWq2vr3kVUDQke00wTl6hOlKw4b3ivBOdIRdE0UoBpmqoZ2UllRA1D9byYUBRKnlh0HQaM00BwjnHo62YaENqWojVEWARKLozllOA8w/Yub3j8Cs8++TquX/Y0buR1VyOHXSD6DDaHAUst0nCKo0EsoZbIpXA8dZze2/DFL/0CP/0zX8CafX7oQz/G1evXEO+roRwIM8Xch0hsFZdK9Ss5IfpALkrTLFCUoVkh/S3SjAEICs60gjudo+QK/8TAiSEugGWuto6A8Q+uGhdjy/91c+IfXAs8s2j52TuJtzdwUeGrOfLh44kfXMJlSbQ+0HnjTi6soidSYZQheNZ5mqGYSleEUQzvBDVqZ2mej2kFPb36nAzGUgvCGy+9CAhTmogx0jSxIiz0DGZZu1vjNBJ8RJyjL4muW2AGQQLeC5ibY3M8RQtNbCuBPkilip+BMn1dCjBN7KqnnXbaaaedXkv3RfEEgFUvjloihIA5Rwy+dihE0DJSpgkfa9tAZp/KOCneeWIM5JyZhs0cGFtDhfuhZ7VaISJsN8e4EJA5/kOBrl3U+BWx2YR85pky1MVaDOlYN9408aZnH+ctj3b8wFNHHO63uHiRUgacpXlEaNTUFEXOZko+ULIna6CfPJuN8a9++yv8ym9/jsPrb+S5596BawS8Y7W3Yq7h6rgJpUyFafYBOWC1WFLm+JEaseK4t1jjbhccZQZXAlRIpVI7bWWOS8E5ohVM4UqsQb4dnte1hoXA57Xl0AovbCYOvPDHW+XvXTLee0W5PTmGpLRWaMU4Kp5rUSrvyXtEDaUQZmK4974CL8+ITQbFqidKEbamHM6Bw7hXQ6I/+9lPVv9TqciJtmmJoSE2kWHo0VK7b0Pf431AtXa1vK8bem3b4p0jxEhs4pyTaGBC0y5pu/Z8TCdOKLn64r74Jy/sRnc77bTTTju9pu6T4kmIMc5RI0JOiabp6JYrTu/eqeG1bUfb7VPKKc7VzDkFxAk51/s37YK+P2bZLZimjElmubdmGqZqvnYQvcMkYkXxzpFnD5J3kQr4rkWblqGa0a2Qx1PUhOsPPsJzTwrPP9WzWjq0uUZWBVM0j+AqN6qYYtS8uKKKB6bcspmEe5uJn/y53+BXfu8Gb3/P+3n9s28iTSOlKD4EhmFkuVjWAqDrOLp7h2EYZv+OsWwXxBDQlCuV3AvB+cqREqNTxanhZo+RipsRB9WMjTiEWjQEKagIGWGpBUrG1PGp08xL28zbF5F/eNHxlQS/fHfg4SAEq9EmPZ7WG/ve1ebRXKQVEUwdCSGKoy81O0+1UrzVjAnYWvU3yTzCK0A2YTIoWcEqxR3nUIRhGBldppzU4F7nHGNKtdDRNPO7jJPTk1pUDf0cu6NzwQwlj4AjNA0+1O6dd54QIuM0MeXEOGcN7rTTTjvttNOfp/uieBIMnQbUB5q25tFlzfTbLeocXupYzfk6osmmhOgrMdt5sgkhBJIWxAdS1jre8gFVZcwjosZysUBNabuONE2gWj1SbVc7TVNPzhBc9UZtjo4xEsv1VR558DLve2rLmx45JnSXSf4Ql7c49NXiRCdUJxTF+4YiCxTjZFPYDhN3TzI/8dMf5g9euMM73/vDPPHUU+CMbrX4FlbRNCUomaPNpq7VmxIbz2LZ4QokM/aahtNxQOasuUurPZrQwhwlYwjRCZPmOuZSQURxOLKrMMwomaUL3OkTUxF++qbxn190SIAXUuS9zcCxKpe98p9e8vzcrcyXxsJzXaDDM1jieqhvIqcQvUEBEyWIpxchmdGIsLXaMTzr6YgXYjZaV7fcyvx3JjZTxI24WhGdp2g6R0wolZWFKtNU6j6dd6hTxrHiJWrmIUQXMavdOh88JTuc9zUrcYQcfO1YGWSbqe/nocM77bTTTjvt9GfrviieTATxgfV6zb3ju/gQKAW0DDRNg48tY9+jqZqhQ/R1Jb0ULFZ/kM4cpyyOklLl+5iQ84CVQtsuKMUIbWCcpgqJDJ4zXpKq0A9K8I57wynHp7dZ7x1w6eJl3vDImg88+woXlwL+IqYdNt7AiUMp2EymNh/OIm5xCMWUe6eFYdPz2S8f8b/+/B/x4q3E+z74Y1y+dIkQA+IE5+tmWIzxPKT25HhkygktdQTmxPF4DDz6+ufwp3cJJeGWe7xy8xVUt8idl+o40nLNKpkjV85y/1RqkTqoYr4hipE18tY9+OVbymdOB96zF3j/BfDq+YA4cq4+JTEhmPH3Ljp+5o7xu6eZlVd+ZC8Sbc6IOzOAe49XCKb1uYur23UiYDZv4wkxV5/TGSLgbDtwi6BT4npRtIHew7YozhyhaUnTzMgi4+RsO05wOBZtUyn0pqgW+mGYtzFhHHu8r0sAIDXSZ458cc4RSh09lmH4S3//77TTTjvt9FdL90Xx5JxHRdicnuJ9UyNYnCEKmjNT35+PfEKMBFdN5UmVpu1Qg2nswSCESN9vaJpYR1MhEmJTEQe5hsWq1u6Cd46UCpOOeO9plw23b93k5PiIp598lseffpa3PfASb3/4Jk23T5E1wgTl7syUSohUszKaES1IaHE4knSclMtsp5GPfOoP+d/+xf9L7y/wgx/8ENeuX5+9Nq9SsUvKOBH6bc84jdUQXRRvjrhskVLovvFlPtOP7L38Va7eu8vnTkc++YUXufrMk7zn+iWaIAwWEFeQUvAUrCb/Mmkh4gFFtHqiTAoRx6OLwJ+eRv7O5YDPRvEZP4/BPIJXQ8XTovyddeIDraPxDnHKYNBARQKIR9oF2ylxmgfUCZKZGU5QZs+TCGzEMZqn9TWMWQScQVTPpihlHGi9p5ugVYHG09+5zaIktA2oj4Su4+TkhMY7vCltExj6LXHR0cQOvCMIpCnXUa8ZMcocYwPONxQtiNTomlQyUyk7u/hOO+20006vqfuieDJTohdKNjQnXJBzwrSK0XQtOScEj3OBPK+uxzm8N00TAFPOeM3EGEh5AufxvsMsMQ5D7ewwp4hIXW9v2khRTxDl9q0bmAoPP/oU1x5Y8tyDN3nudRtwD5CKIDYAU01iE4+4CIQK8ERxGGqRVDqG0nDz9lf4jX/7af7ZL30Gv9jnR/7aj3Hp0kWcd7VrpeW825RLYrPdorngETbbU8SUi5euILmw/fpXuTvcov34R3DTAJb43a+ecDMpL75gPNw63hwdfWywMtGZA6r3qKiBQILzDtHkDMzhEd64gjd3DaMIfsZBmNQ5WsUBCJQMJiRTggmjKAuEIkKmcpJMgX7AG3g8G1OCFXCzUZyCQxhVMBOiU7JK9WdJ/VlRCnkauPHySxQcR6enPHntMS77iG3ucCm0TGng9tgzPPk0q2VHyXmOYTHabkEMkZwz0dVsw9AwF04RtZp550RIKYNztE3L5CbELRlz3jHGd9ppp512ek3dF8UTc67ZOI2Ic1ihdjKCkYYBC54Q22roFkDcOSm673usFFKaEO8whRAa2mYxd5iq5yXG+OqPmzPrVHUesSm3b98E3/LglUOee7Lhh9+0YX/Vo/4yRTNajonizg3XVhR0wJhDb32kuBXbVDjtE3dvfp6f+sXP8Wsfe5nLDz7Be57/AHsHK8QZOU8sFgu6uCDPcTI51zHk0PfkkvA+sr+3j927hRtPCZL4QvIkv6iZb6psDiOHMfLwQ4/ywANXsOORz5eJR+OKXI6AwCgCmioeQAuTBLYmLIz6epnhxNGhZPNMecDPwMhYEmpKmgOGS03UJXvBFcO84BwVxlmMGOoWX6LQOkcrMM2VSBCYxOFV2NalN4rW0GHnKmF+Tj1GcCybBX3KTFPmF//Nv+bAjDeuIgfBM0qiNyE+8gh+sY9rfIWiOsfx6Sk+eLw4vPeM00hsWpq2nbPrBqIPOOfwTUPXNEzTRNNGYuzY9u1f7nt/p5122mmnv3K6P4onajeglEL0vpLDSWh2czhwgBDIQ09oI6Xo+Tr5OExoTpgpbViQS6rjvinRxJa2jQzDgHNCmdfbz0Z6zgnjeMI09Fy7ep3LFw9552MbnnsyEvzynDHV6D1MdN78qg5jsQyaMYkQIiMd/djQ94mbr2z4Zz//aX7rD2/z0OOv553vfR97e0ucq9DG5XKJqnJ6ekKaElNK5/gFh7Bql0QPjzTANtOslxA9rvH0C4NUkJJ5NiVeOsm8/cmHeGzdMm49RxJYTiOXCOzpRHae4BxTbQ9hEhCpm3pWMsU5shOCVOO7SkANhlRoqc9XqfiFafYrmRk4zzHCyjyTZVpfPUTL2OB1IuV0bhQ3AdNqCt+Y0jkICKM5HIYz4ZbBPkpSY0vhaBrZpombpycU77gzZW5OmVEHnDleUeH0Y3/AU299G3uXHyCXRCqFRddVbpMYe3t79H3AqNmGNf6nLhGIQskJL4blCWnmblWIu227nXbaaaedXlP3RfFkM+THeUcaesQJOkelTGVCtNBgRF/5TTpvRHlxRN9QnENQmhBw3iE+MPQD43gPk/260i+C9zWm46xwyjkhZjx8/XEevlx4/xuPuHYAFpdYOYF0VDPvdAIdMQL4NQXBS83Jwy0pFuhHuHd6xNdefJGf/L8/zu9/YeTpN72VN7/tXVy5fJGURmLbYmZM00Tf94gabdNU0COee/2G/a5DnPLG1ZLp3g1ymrh5+5i95ZoLiyWSFGs9/eaUl0/vocs1Dxws8f0JpShvkJEthjdFxRGLMVmhdYEBj3PCSh1WDBciGUeL4dWgFO7h8CS8W+LshIADTdWIT8H7WoDdzMpxyew5hzqHBscDXceEsd0mGgncLGUepymNq5gEy4VGq3G9mCd4xRmsRNgTODahWOH03hH7h1d482NP8MryJe7du8dpyhyVSkAv3linLTe/8CesveEPLjACi9DULpkq2804BzfXYqhtWkyhW65IU8KsYDi6xZqSE1PKqO0YTzvttNNOO7227oviCYRiGS8CM+yyjQ2x6TBK7X5oQSnENtYYjhjphwHvHZS6WXZycsxytaRMI030jENlIAGVM6SK99CGyDBs6dqGK5eu8eS1Le97unC4imQCUQeCzT/X5q5JMupDpVpAIEBHYo9tgv7kLp974U/45//yBT53M/Dce97PU8+8Hi+eu3fvolbocqHrWkoptG1LyZntdkvOiWwTF9YHmBhXGOhvfgMrAwwDV1YdLjiO7m1wznFpfw/vhcf397myXvMQggueIy3sWSE4COKqOZuCEwje0eAryVtqkSEUEuBUkdjQm9KYgTWUKITSsHUTjTXkkjATtsW4lRJmcMUZhz4z4jgqwp/ePeVK9Fzxgc4lDuftvozQK5yUzOQCk/d8cUhci4A5iij7Wg1W94pSLDOcHBHF07Qtq9gS9/aY0oRYIZxR1JcrVssV6esv0aSCOzykTxOaJ3xcoGJoAXO1SFUzcslsNplxnGrsT9MwjhO5FNI0ojqxI4zvtNNOO+30WvqOiicR+TJwAjPL0OxdInIR+FngMeDLwN83s7tS/5v/PwF/G9gC/6WZ/eFrPb5h5DwC0HYdjSoYFE3E6FH1yEwRLynjQ8SHCAh9v8GHiGilkbuz+6misanbdWK0XYuoI00bhrHn0uUrmAoxfZ3nrkysmj00XITpCFfuoaVHpanBvqYznTqBOkQc6joSS+4dHdP3J3z0Yy/wM7/+ZW5sVrzz+fdz/fpVQhOrAdw53JypNk0TbdsyTRPDMKBTwntPaAMxBkLuOSyZ0TJL8fiDQ9q9K6yWaw721ty8eYP+9k1S33OwWnGohZASsSiLxYI8tGQi3LtNLBkFnGvABRYOHA5nDY2reIbGOVBl7CeGSQk+4hCSeb6ojksqbMxYOQgqLEy54KEDogMvwgURWklcaoSrC08pNUswUDcIoxlqgneQNXOalIMAwTKFWoiaV7ZFuGtC4wKlTKSxZ2+9DxJQHG23xGshYCRT2uWaJkbMEotSyPfuIRcuE2Pla6lmfBvwPtZw5JQJTd3WBCH4s43MQGwhg6MAAAAgAElEQVQaQhCO7mx3tdP3mL7b56+ddtrp+09/kc7Th8zs1jf9+R8Dv2lmPy4i/3j+8/8A/C3g6fnjB4CfmD//uappJop3gpihCs4L3rmZA2SkcYLSghPKOBGCxzlPG2PlJYmj5IBzwnYYaJuGbrlAnMPLHOcidTRz6eIlDtctF/eFN16/xKUHKyPKygmOgkiDBDd7ZyqhW8/yQ3xHDUFp2Qwtd17+Eh//5Av8L7/6Msld5vkP/hAXLl6kW1QSuGsq4DPGSPCBKSf67bYGEJeCYiy7ltg2TP3Ao51xmALEFTEuuPLGd3Dl8CqWEz4XDi49xDf+9FOMRMIyMN28ybRu6FX58PGGDxxc5oHNMT4IZtVAn8xqDl7bYlrIqeBw5yZ8ciEDrQscqbEvwj01RqwCSMVQjQyMeEc1i0steryvRu/LzlVoqRZWKMdmqLq6CGCFLIZXaAz2XaGdwZj1+Ncu2S0tuKZm0jVatyiPTzcsF0sW6xUdZ+HNiTwlpKlYhFubU/b6kf3Di6TVPk3TYJqJ7QIH5JIRVRarRQWkjqn6oKiLBKpKSomS9fz2nb7n9F07f+20007ff/r/M7b7u8APz1//JPDb1JPP3wX+d6tGpo+IyKGIXDezb7zWgzlxCDWo1XlPzmm+sBk55zo7QxHxdF3diOr7LSFERApmBedrpMeibSkl03QdpkYMgaE/Zrnc4+HXPcLDB0d88Knb7K9bQruqYbP5GPIWJ6WiEHzEaUDzKU4K5jrMNzgiQ3EcH0c2x3/K73zss/yfv3mT3F7lXc+/j+sPXUdM8cFRNGMmhFC3445O7hLOYkxU6bqO5XLJ3t4e23GiwXikv8PWAifHW/bsJu3tr3KaAlMT0eMjPv7iy3zxxld50zveyXp1gVNVNkfHLBaR9155kL2mENoI0TFtNtiYyePEUJRGHAerBUkLlFKpT2pMqdBnZaRuwxVXsFx4QJUELBSyFQzBidFI3dBzzlGE2smRegxjCFAmTntlAnqtFHA1yFZDgdVqHEsy0FxoApxYYAzChRAI3hFECF2D80ITPev1RRY4dOxZmLJxW26NW/q+58J6jfeBfHLKtrlJ8+CDLJdLslajePQRK8Z221OSYmaIs3P2k/eebd8TQ6QJ89bfTt/r+g96/tppp52+v/SdFk8G/D8iYsA/MbN/Clz9phPKDeDq/PVDwFe/6Xu/Nt/2LScfEflHwD+COqorpZC0XtjWe/uUVHlNpZR6sUOY0kSUjpwzw9Cfh8CaVUp0miaWXYeK0C6XdbyWMtvtPdp2ycX9Ne96suctDyWCM3xosTzi0hHmCwL4MuBCfQynCXG1mCu+o1hHn4Wbd0ZuvvInfOKTN/nnv36H9eXX8d73/BDr9aLmtCkzgsBIpT6uc7VTlrXUNXnvWSwWlFI4PT1FxHNl3WB3t+yHyEtl5Bup4L72Ffbv3iSasVHjkzc3bIAbX/gCP/L2d7N/eAEnyloKDYofM0bE9i7hFweshgnXb7B+i5bChKfgaQJYSWymiU1fyHhMjVNTnMIAfG1ILJzigsNMEDyI0nkhAeoEjyCzId85UIzNNHGvGJMKBWFUm0OJ6xacieFwtN4xuRrjcuqN4iOdM1oEdaFu9qmSpsRXT0+50u3xSLfgqB+QxT4P3NlA4/GhI5oRInzjxS9z8do1Si5kVYI4zEFoW2TK9NPAYrEgxoD3gc3pBhGhbRtyToxp2o3tvvf0XT1/7bTTTt9/+k6Lp/eb2Usi8gDw6yLywjf/pZnZfGL6jjWfwP4pwHpv33IudU3cO4YpkSkM40gbIjKbyEvOlJKAwP7+IWUmU3vvK4F8KiDVLP2Dz7yOS5f3+YXf/n0O9i5xYeX4oTfe5JmrGfERJ0s0H+PIBEa01K0xkRbVgOmACYiLZLdGpeNIr/KJF+Hf/c7v8olPf5av3io8/PSbeNPb3kn0sFh0DMNAu1jQDz3Be5w4mE3ni27JkIeZV1W9QVPOlJRQhYfbnk4CbYBHL634xNfu8vFidK7FpUIxz4uNo120vOWxp7h29Ro2bNlfLRhPjrmVByxGuk0iCUR1FB9oVvsc+K7Sti0TUmUzacncG0e2LpCK0QIr55ksER0kIguZEEAFTGthGEVwzmFA8L6O75zDeUgpc2vIbNXh5iS76B1SjM4JQiAGw5vQuwaHo8c4cDC4gCEUC6xjR/bCZMrNu3d51jY0631uucBLk0M2d0hlYrNYccE2HDYdN259A/JEf+8ecf+QkhPSLMklk1NGSyZrwvllzdMrhW4+ViWNOBGcu092KHb6D6nv6vnrL/q9O+200199fUdXCjN7af78ioj8PPAe4OWzdraIXAdeme/+EvDIN337w/Ntf64EiCHUkNu2xcXI6UmhbRqmoadpu/NCqaRMExpUCylX7xMFFstFLVQcTKXw0T/+I65cusKlCw/Q5m/wH79beHhvpIQa/6J6ShABK6g4soErkWxbnBecN5QGlQVFGzabzD0N/MZHPstvffizpEl5yzuf5y3veHvNjNv0jONYCy6BrmkQAy0FMDabDd2iw7QQ2raOmXKqv5cTFi5zzUa6ZcM2b7m+blleX3Nr8RBTP5CAOEz8QxyhXbD/2BPs7x3iLxxwcusm625Fvttza5tY+cDm9JgbseMJAdsOaFYO2g6vjuQLYyr0OFYHl8h9wmvhIHiOx5GcBlY+8IVtjzmHl4B3ymRlBmsKqlKLVqoZ3olnSBM3h5E7oQUKC+fO3j9YhCMNeAfBjK1FvKuRLmpw6hwikWLKsghbL+yHlpwKx0VZ+8RD420aEy5vJ26ocjc0HPUjfVTKcIOT/pQgjnx6TDy4TC4jw717dIuGnHpi07FYHtBvtvU1X64Bo2kaptGYxonNZrNrPH2P6bt9/tppp52+//RtiycRWQHOzE7mr38M+B+BXwT+C+DH58//cv6WXwT+OxH5GarR8t639QsIxLah73tajYz9ACWRJhimibZb0Ma2ju2auv02TSPdcllHYABWPTfOCk3X0cY9jovx2KXb/OjTExf2hUkEVwph9kgJUBTwXY0tKVucAzPBNKCuY9IVJ8e3OLnX80ef+gif/sg3cLLPD/zQ8zxw9RrHt+8QnCOEeuF3YR5/nZ5iWi/DMQYkOLbjliZ2pFTIudB1C9Sg6zr2hhMOzfjaZsvFGODkHs8MiScv7/HVsWXIcOdk4MLygMX+Q6yvXMevVziD/UvX+cqn/pDSnxKc0mdDpOVw2LLx1fR+Jyd+/aUX+dCVA9ZNgzpHUUFMWQShpMrWamNDoHbR/GZLbAJL7/Fi4CKnw5YgRigZ5x1oHZlutNDHwLG0NCqsJsXPx8SAYhlyw02BhRgnsgAnRClMImyK57JlGudwAskJRYx11/JM2/CF3vhsGjmwRErwNQ2MWdg/XOCnO6STkxq9o3D0lS8TLz6AGcQm4n0A6uh3GMYa/eM8x8fHeO9xztGGBmthuVztLE/fQ/pLOX/ttNNO33f6TjpPV4Gfn0GDAfgpM/tVEfkY8HMi8l8DLwJ/f77/L1PXfD9PXfX9r77dDxCp4bht25ByJqUJK4X1ugIuVSvVu2lanPc0MZJLZUHlkhmHkRAjsYmMw8gD+wdEZ7z5kS3PP3mKBCHLPpQT1EYqGtFTzNVQX3NgGaMlF8G5gkjHZI6728jp8cCv/tYn+NWP9Gz8Zd77gfdz8dIl1FKNJgkOC6BpopUFMgcYA2y3WxbLJc4r+8tDUkqoGmDkUhDn6IeBvf6YSweOl29sKBf2iRTSNHBw1POW1Zqb3ZoHLzzO2Cxo9y6TQ0CoI0EdRvaW+2za24RpZMoTY8lkdQxAzPCKelYXr3FDB65Nhd579lzDuD3G+YgUxRQa8Uhs8CY82i1YhYjhKc7IKZEKrFZ7LMzIKDZ31lIwDCUa4B2ihqgiKBkwbVlHY4GwkY7sPKME1Ix9zexLITAh5hhEOAwR8x4XI6Xt+HIuSK5bfNbBoSgLjOPNbWTKRA+YY3BG2W7waUTbBWqFNCrL9R5Tql2+4KuXTnOp1XMTGcYBNa25ft/pv56d/irou37+2mmnnb7/9G2LJzP7IvC2P+P228CP/hm3G/Df/kWeROUoOaZpqttRsSWTGKe6TQXGcrkmhBYfAuM0slgs6PstsWlY7a1JQ4+XwuF6iWPgr78j8MTVBZYmnEw4vYdYxqSiC6ZSQAynBdVMUSU6Bz6gfk1W6E8LN77+ZT7yB3/CL/3ehnDhMT703vext7/HMPa1s+EDTowyjZSc2ZQtJiNt156H0aZpYn9/n2maKFrw3gOC85Bz9WkNZUQm5YG2Q7fHvBwahlEQKbTpLnvulK4M5L0HOEkdm7BPOj1luz3l7vFdGj1me7phFR1YwUoiGPicefBgydHXX8HEc5yFhYxsT0742HbiXQdLyjQQY0MpBSeFqDV/bzKjMXA24lVwZqy7jlQKXjxDLjjADBKZbImFCH02NkFZSIRkZDV6yyQfmUyYMJZa2C8ZxNBSGK1gTnCqrLxg4ggFrINGEo8ftmzLCXnKFFHGcSRNmVYcIqDiSDhyVrqQ6YdTlusDxvH/Y+9NnmS7rzu/z/kN994cKqveALyHgSBIcBBnSgrK7pDtDnVHR0e0295445UX/gO9scMdDocVliV3S93qpkiJBMEJgEAAb64hM+/wG87x4leCNxZ6Zz7Z+XnrisqqrHz3xDnfYSGVBZ9azU8tFa2KOOi6iBNHUWW6jbfw3p02T/8f4v+N/79OnDjx/z9eEnWskHMmhFuHFUboIiln+mH9WcWHaoUK6/UaU2Xoe0CoObMa1jgcF9uRf/n9zBvn19S8Qs3hLd0mBCniDaFDZACrlOUG7wXvBfU95gfGFJln48P3f8l/+Pc/43/6S8eDr/6AL3/tGzinLHkh5UTXdfjbk1a/WlMRXIikZabW+lkgZh+7zwYnVWW325FzZp4mcs4Mw0DxK55fPWY1dAzVs3/+lPPVhm7YsowTjoBeXhKuL6nxI/xwn9XFfZzr6c4u+PjRMx7XBUfm3A10FVB4erwhPnvEW9st+8vn5KWQQuXdZyMvVisufWU9GNSMx7HQsSA8vRlRBy+C58I51kC5jRgogGSluogK5JzpXI+rgeIqnWTeCYGbOXPtHLlUzkS4cY7HWdlZizvIFAJCMEEMKsLUte68IU8M2w3FMmsGnpaZpRRkKZR5wariveAMZgFTRyqFnW8BqcvNgfV9MO8JbqCqUcuCGCzLTIgtPNP5gKMJ31WVeV5+mx+EEydOnDjxD4CXYnjyPjAMa3KaEeeopWAotRS6GFmteuZlxnnPZrMFqyRVlnHPZnOHOKxY5pG3Xgn8iz+4x53uExZ3RrCJqAviPIpHxSFFMCvtVCiG784Q2lCj1rZNTy8P/Py9D/j5zz7gTz/Y8dU/+Ee89tprpDKzLAUfHCYwrNZgitaK+IBVRUul5tIGwOCJsdXJLMuC846h70nLQs6ZkguCscwz6gf+9JMn/OO37vP65gyrmfzppxx3a47rDWcOJFeej5XHuvBwmLi+/Jh1jJx1ayQb1nc8ORYubcEMoLCPHdd5ZnzxKYf9gnjQ4nleCnG85jJuIXZsnCc6j7fKx7VgNeM3GzoCszNmbeXAIo6sFe+EYm3jU7xnNqOIcEPgUj13nOfFuePX7BDx/HI/cjld0VXl23kB3wqLBxFMFB+EayuE4kEC1Rkv0kyUDY8//YC0P+BrwVkBFPHQ4SB0HItRUmUbYC2VF9WzipFV78hZwEdC7KjjiGF4Hwnh74YnR0kZNSN4h5wyMk+cOHHixH+El2J4UlOqFmJoCdwpJ0wr3Ap7Eej6gRAipeTPKk98jEjv6djzj39wwTdfT4T8LrFuml5GumZJl4CpIJax2+2MBIfyOktRChvS9BjqJY+eTjz6+BP++E9e8Ik95Hf/8z/iziv3uL66QhXW6xVOhCFElnFERKi1FRUjgqqRS8YjrDYbDofjZw683nekZcG5ll5ut2GaacmoFx735zzb3/DWauCV1Q57q2N89Cmrm6fIasunm4HkHFcl8doyc+0q/exYZM9Z8HwvrhjXkcfLzHspsa+Ct4H/3SW2RRlNMetYifLWhbHpHH2MbKRHrGPRipQMxwV1xqZkqmUGiyxmVBFczmydAIoFSFIpXskVcoADK342C75kvne85He5JGHkQ4GsPJkzZRPYElvgKZCBm9KGMZHMvmYOSZBaCPaYoSpnAuqhVtgSIDrmajxOmezgwnsGJ8wYe3G8+uoDpqW08ykQ+4hmoRRhd7FjXmaqtgyx2HUEgVJab+GJEydOnDjxebwUw5OY0YXAOI7M80gplRAjF7sznLjWQWbaijPMWJaR8905y1K4cNf8i390lwcXR3xdcKt7pDpi04Saw3BUK7dVK4rX0lx5siFJophhXFKzkqaZ8flj/tWfX/F+fZvv/O7vEcV48ewFoHSxQ0RYrTdM80JOM31sLsHPzo6+DXyrocd5x2q9YkmpOe4EaqmItCT17W5HrZn15owuOK408+e/+iH3po95+94FZ9s12ze+QDrc8NHlJS+uCg+c8d2zLYWe81SYScw1080ZLTNl1/N0TjzYRkKuvGbw5WHDeGeg2F1ydbAcuaMz25rZIkQRxBaydRyt0JWF9WqFEygiRE3tvFaMJIrQcrUEIaonVs/QGcESicS3QseHS2VfenwtXEhpQm8q37voWXXCCEQFQzlW4+NF2XoBCosafW0xEj3NTdk5OO8HppyYi/G3qXKtxoU4HriAiXGjlWt1lPv3SC7SSdf0VDmT80wfA8fxSF86OudJVcklk1LCeY9qIaf82/wonDhx4sSJfwC8FMOTqvLk8ceYcltlUnESqTUxrDZobQ4o5wwTYRg21KJ892sb/ui7O7b+GipYvcERqdrCKZesmCmYYibgAuJ7FIMC2fdM08J0+Qnzsue9XzzlX/3bG359eZf7DyLPnj7m7N4D+uiIsSfGjqvLp0gtIJ6Sc4s7qJXNdosDNqs1LniqKdMyk1Jmu16zGgaqVsImcHV1hdbK/uaGzWaFaeVwcyBud3wULvifrx7xT9LCV8/PuXu+ZX3vDm/FFf1hz2/2lwyPJl4MHY8s8urZmge7NdWMvMx04vjinTVJM/dKwTOThsiDBOeAG4yjC6zcnaZb8p6pKB+lmVe84jvHziACRQA1nCscXCA74aEIUTPOBM3GYlAM8mR47zin4sORLnaE5JikIxThzU3kDVOSKcekXDhhRWWshZXB696RMKiO7rZXT51nG2mJ4xXGtPA4VbK2INQveM/ate6862o8qsaM5423vozgWZbxtsPP48yY5oI4x35/TfQ9/WpFLoVpnHDRE7yj1VSfOHHixIkTfz8vxfDUUGLsyaUydD1931NKZVoW1qsNdRnZ3n9AnieqTfzB1x0/+HpPrE9QS6jrEdtRixJ9wTnHKuamn3IdEgKiFSFRXc+xvsLlow+oNz/l2bNr7u4cP/p15Lm8w7d/9yuYZDbbHevNCjUleKHmxO7iLrVUcsn0w0BaFqopx+OBvutYrVfM04Sqst5sWA2GqnI4HtpPqUoIAW51ULVUlprw4jnuj2zu3uVvnnyAKx37/Ig3Dmve3m55HgLnqwuG1QaXJ7Zl5qPLiQ+e7LlaR3ahpw+OaB1nEhi6njk4eqmsxChpZvStGiU5Iy0zkqUNRwKviiHRoy7g4xYfIwMwxMjlcSSK4/m88NAZWzMqynVZoOsIRRFTisBcDGfGuS5kLQwVPAotbYJNrUSprNSYK9QMOBBRNmaM3iE+sKJp0G6KccgL3oT14JHguSvtxLeY8FiVfTVuqnAww2+33H/1IWpGTkbVyhAHOhxlGlmvBtQgpYVxGtGqbDdrzBRxwotl4VYwduLEiRMnTvw/8lIMT+KE9fqCYVgxzhNd9Gy2Z0CLMViWmb7vWaaZsjziv/knX+RLrxYkHxFf6JyiTITOUawgBsENqCv4IIwLrOOaWhaULclWZL9lnh01fJk5/4Ifflh47L7Ft37vm5Sc8KE9Q0spmEDNmZoXVtuzVvbrA/M0E0NowZIhEIJnmma6rsPMuNnfILc/g6qx2WwwoNR2HoohkFJmSQlRAzG2dx+wPX/Az59/wj4Hfj+PlMOR1fma85jYrjdUGbjTdfzzrzxgfzySy8gn+wP7cUFM2Ksgq4FIYAgdYkoXI1sRuuDwUihdxzIuuFJRAXUAlbqMdCZYddyI44O98WoPrioPLHGZIecKvjYNUi5UU6oJ2QSrsMbAjOxgyoWqQq0KQeij0qln7Wj5UtLiCgYTDkmZi5K0MlsFa7lRG+/YSGTr4cYrZVYuzfFhzhwVnBipwqTwpS+8yf6wZ+h6tLZ+xHmeSQZgmCrQuviCD1RqKyu+LTD2ITSB2okTJ06cOPH38FIMT2ZGP3SYKM7B6taRttoMrMLANI3klFn1xn/3z9/g9bNPEO3BtzDLohVcIC8JLy3DJ+kR7wreDwx9oepENSgIORvH/Ud8+MmI5Et+/P7AcfMt3nrnHZCCDFuur18gwWPiWwaSZMQJKReGfsDMWA0DOSViCIQQkFsheM4ZrZVSCs4LMQS2ZxtSzhitCFnVKKaUXChLYimZ+3fvoOY4e/UBtY786uaK6+x4HDzfSDdMcs1F18N6zdDtWJujHwb6u1vevPuQ/bzn6XHi+TjCkjmkkY/VcOYIApvo6bxn5SEoROeRPuKdME+J2MXWVxcVhyMC2hm+VqIoNwa5Ar3g8HgnCEZRobd2GhtwqLWBrCfQ4alZyE7JVGYVZm3nu30taM5UM66ytlNrqay8564THKH16KFNVJ6VpMrjanySFfOOqhVMmLXSb7bce/iQEDzjfKTrOkJwLLkw18r52e62504RIC8JFwK1FEotBOeJLpxynk6cOHHixOfyUgxPQLPB+8DQA96zWw/cudjx9MUlRTNfetjzR7/3Clv3Ht46TEckOMQWxDJkbechAauKoyLWUfOMp1IQFjtnKZ6njz/lpz/+gL989xnvPgq8+c0/5At3v0i1TCkZJ5W+HxDvwYy6pNtogg0pJ1LOjOOIF+H8fNfcWs4zLTNqbfg7HnP72qJoNebpBT54+r4np8yyJIJzlFLpN2s2IaC0B/pw8ZD87FO+f+8e8zzx766OvDtVvhyFr2jiflqI/oA/9nBvxx06Ot9zvcB5f86X3F04qxwON1w75VoqaV6YNFGmxCUZpxWvFbstwz3URDh2gLE3h+C4Ez3Oe8R1OJsIPjJ4oVg707naFEJOlaJCvRXCL+rIqkgpjKkwqlK1UtQggFYFE8wynROKeu4ER3SB2VU80lK5TJisEtRIZI5FucRxU9r5cc5tmFMxui7y8K23Cf2GtCzgPMuSQJUlZYbtlnk8ti2YtgF4qgspJWKMhC4yTxPuNhn+xIkTJ06c+Pt4KYYnEYf4iNBekJXMXI0P9yPnO89/+Yf3+J1XnxHdR0Q/gGmLMLDW21ZlBUEwxnZr84LYjNhCrYbr7lG5y7Tf8+zRY/7i3/2CP/7xwtN0zte+/X3ipkOtNNdV8BRtm4kuRtI4EX0gi1FrwVTbFmwYyCVjZszTTNFC33fM08Q4HvHu1pEmjn7oSUuilsqkE845ckokVRTw3lNTput6aq2IBPwbXyV/9CO+e3fH273nT57e8Jez8OtUeRjgVZ84S5W8jLyyDlz0kOqGV/qA2oZPa+YVes5V2W62TLpQzfM8VFaaOdOMDsJSWsZRnxYejwvHMXHWe8YKn6ZKDQNumbkXCgE45goKK1GSg0mNqkaP4B2oCLUaPe3uKSi9E5J6OudxVTEBgmdVK0Ecx9pE2qaV6gSryqjGjSq5GlmNBeWocHX79blAxrjbCc4LaXOHe6+/gWCs12uWeWGaF/qux3eAVQCWaWZYD0zjARWh1HbapYBzwjJPJ8H4iRMnTpz4XF6K4QkgLQtDFPresyyFbMo7X7zDv/zBirvhA0LcoGbUOhJvdSlW2xnMpNz2vDmMBS+GR6jmsXDGwe5zeVN5/Lef8MH7H/DHP1rYd1/gm9/5Dme7NU5ogxEgBloKMUTmeaZaJU0JiYFlnhj6AYfgxbG7e4fp2B62ZgLm2WzOyDnjQyucnaeWah1iYCyJdbduNTTiMKtNT6WtY62UzHazJaWMDhtuHnyTH338M74WKv/9F17hr48jP7ma+OvjTLQ2cGgQXusDZ72wrZXrzvOcF5zHjrnr2IjgcmAdIosLfGyJXegZzTgPEQkdXR/45ZNrnlbjP7k78Mp2IEjLffJ9x/uffMKbmx2GI88ZTUpAkL6FWZbbSpPZCqUYg3jyUlim0rKbgkdzYcwZxFNVKVlRgblkisFcKi+sneacOWarBDH2Cks1DGFWYyqKimPjhYfRc21GXZ3zxe99n36zaSe743iraYqEEBECtWSqeCwYOMFcSzL33pNzBqUlw5dyOtudOHHixInP5aUYnkSE7XrDaujbtiIo33xb+KffmOnsMR7FytQ2BCIgCavgHBgepwWsbYE8oFQKBrJDw5ar5TX+h3/9Ls9++gs+ujT8g2/x3S//Ds7723Tr1nk2DD05JQTDBY+WtmnCCzmlFqPgIA4dF+fnpLSw2m4o1W7DPO2zgtkgkRg7cipM84T3LZCypSM51qsNyzzSrVpfX60V0xatUGoizTPb8wvu5lf46W9+w6+uL/ly5/lvX98x5nP+/MWBX+0nLpPyaJpx4jj3mWedsQpG5zyXoWfrhLWHMxw+CEt0fIqn88p6jkQxvHN8IRtf7zsGPCaR7IWjOVzKPNxuWa975gU8ERcdxSpaK7EUus6TBg8FJApzKUyiOG8UBbWJUit7NbQaT4vyqCrnBomKKog5jqUyirFoJisMwGhwUGGp2oZbJ/QeKvD+Ypw9eMhXv/NtzjZnpDSTquHNyCURQmjly+KoU6FIxnc9KDjn8AouBFJeMKsEEbx32ATCzZsAACAASURBVMltd+LEiRMnPoeXYnj6O5t4Spn1uuef/v49vnr+K9YuIWFLtUqQpl/BEqg0TZNKc4qpw7mObAuGkZaFUjxdv+fj54Wf/OR/5N0fjfzqcc+Xvvod3nrnS9RSqDmhImDtRLfebjhcK6Jg2rYSUykMq4FcKkpzrfVdE4z72OGcA2lbq5RSC7/cnH1m2NqebZtjT5VaKv62v69VgawQJ4gIQ9/jEI7HI5ozXd8zV+PpxWs8eXLA12s6VZ48HpEu8PXzc7597w7zfOBqPPL+mPlwgfemxGveobXyqRvZhFaBchbbFuqJwqdidE5YB8eKNoXeMced4Lmrhh6FxcO6iywWuJCFD6YbNDtqMjKxJaRrYevAzSM3x/bz3Rh4D1aMmpUPS+YiebK2oMxHBUaFzoQXUrjJRkDYSiFiXBZhLoZ3xpU5JoMqcK9z9C7yZFq4rII6x8WdO3z1W9/BVLm+vqQf1uRlou3BWvJ7KSPeebJm1mdbvA/UlHHet42fQDUll4XYd0gpv82PwokTJ06c+AfASzE8hRCZlyNvPrzHf/Wf3eee/jVdN2DWU8qB6NqAg+uxIFQT1AytBaPiUNQyosKxROZlIJan3Bw9V08/5sOPjvztk46v/s73uPvgIVqVIIKJJ8TAkha2mw3Hw7EFXCpNvzS3iIToA/TG2e4MEWFeWl9e0UoXmkMrlUwXAu7WxZZr0xJ550jzjA8RnMf5DitNPB1jpGoles/+cCSKI3Zde4iLtBgAAne/8X3AuNaK/ebn3Hn6Ke/PL5jM0TnPFzf3+K8vHFYSH6fMT29GPl4SKp7HqXKVMr0YgzN6gQmhqHC/V7I5qggb53Ai3O+M3eiZTXljmNmrUdWz6ypi0GGQhFIVxXGlymyFGEDVOALgyNW4TJUn6vlpSXTi6DCeVKMa5JpxOMbaAkyvndHjMZQuenDCPS+MqhxzO989XhLiPN61OIS7Z2tErBUv54WSEybWegxrxXv5LPW96yMlZ2rKpGVBQnMZ1lroux4R4c69V1iWj05RBSdOnDhx4nN5KYYn1coPfv/b/OE7I+fl3xPC0LrtrBK8w7vWGSfOgEitC8qtNlwVc5GaM8mMSqSuXuWjX+5Zx5F/827lz355xu98/1uEfku36tFSCD7g+yY43263iHf03uOCB52Y9gcIns16zfGw5+ziHDWjpNyGvWlsKePLghM4HI6IF5wPpJLwLnAYR/rgCKEJ0nHGNI+UJYFAjB1djBznA2ZCtkqZW2nxPB4whLv371NrZUmJpVbk1Xd4+ubX6Z+8z/bTj9nVIy9ujnyIQ1zHul/z9Tvn/BcCa1e4yZlHS+JYlUejcqUFKxWPsU/GxhREyTicg8vFMbpEFeH9I1yZspPI4ozeYCWVHcoggAkZUAO/VPbAdWkDj6DMFRYzZlWKWttWiaAFBu8wMe5Ex9udZ3AG4pjNcaPCjRrPcmVqOm9cP/D622/QrdbEovRDz+6Ve6gaS87szi44jhO73RlWlZura64ur3jl/iuICbVkDtOMA/ouNIPA0t6nea7UkrlUQ0+apxMnTpw48R/hpRiezjYD/+wrv2bLM6xf4UKH1dxOdOIxE5wZVhbUHJSEp2U74RxZHdU81UMuWz761U94/MkzfvIb5W+e3Oed732FLgzEbs32bMdxOeJV0NzObF2It51mwipGEId4QIy0ZM525zjxTPPUgjzHka7ruL5+wXpYAUr03OYtABjH457gI1UVq7nZ+WsixEjwjiUlLs4vmOcJcY6aEsF7MAgx0q/W5Fy4urqm+zv7vAnVKyEX9nfeZL7zJs/GG7qnj9jcPGFTE/Pxkl+a42dAFGHbBV6La14ZHN/aNRfhVApzrlxrwalxrMqhwqLGb6aZD7Njr0I1cMXx2CmCtU2aQG+u/eHcuuC8KE48HVACODV655AgXAAbD8EJG+fpBLwYEU92kFVYivIoVa6qMhZYVDAcxXs2d8/Z7i547c032Ww37VwqDgzEO1JaqLVyc9hjahyurnHO0XWR1dAywnwIOO9x0l6HmYF4un4FCHil63rUBPHh5LY7ceLEiROfy0sxPG3ixIY95gLeEqYLVg0nhohrDi1X0QJYQlzGmbYHrHmygtIz5zPe+8mPefzoCf/LXwmcf43Xv/qQkgPBQdUMVuicb64q5xA1ai5I9FipTOORmkvTQXUd3jkUZdxPTTuTMqvVwDiObLdbQEhpwTmH8xGrmZxmnPMsaSZ6R991pFIR7z87HcUQqbU2UXlOzenlPB5hWeam7xKh63u0VlQrLnpWfs2Sj7gqLMcD3XrF1cMvcHzjyzyZ9oRPfk13fEEowloqNiV+Mypj8whSgBuMrwwd0XXsHNwLjoHK6whvDg41z1XsGeemIYsC514otaJF+XSeOTrH3S6w81Cd8MkkvLqqSDW24tjnwlKEO17ICllbCvi+VvYF9loppiCVJQs3OKoauevZ3H+Few8eslqvWK/WOB/oYkDMCDG0OIRSEDWWZcH7Fv7pgiMtC+Oc0NsC5uaCNHCOEDw5V6QsrFab9v1KplTFOUVcIKVTPcuJEydOnPh8XorhSVCcL5imVpMhAR87zISiitOCliNOPIhHbUUhU60na6S4u+yPR374lz/kvV884t++3/HWt37A9s4FXgQXHT4GdhcXzMtMSRnnmvttfzwypUQXI14cVoRUFjQVzi8u6Ncrbq6vcd4xLTOSIIYIjpb5VAqb7YZaC9PYtE0xBkKMuJBIKbWQxtVA1/UYxvFwIJeC0b7emXL/Ysf+OFNrIcaOIK0aplYleE/sOg7TkWIJFwNd1zGPM73rCe7WibY5Y3jwCjye+OA6oSVzNwRCEvCVNYpzgYeaOU6FyWAvRqqGk8oTPAvCxlf+Zn/kDd+xxVHJLOJI2txzdyVgmumJZINjqpQKH+wNqYpRyKXd2z7BEGuOSqNlNhnQmaMz41CFy6KMteK843e+830uHryGWMFL6/9zZaHUAt4jTiipgFZEIAaPCOS84Fzb0HUxEFYDTgI5Z5aU6QTSOONjwIXAUjLLnChp4c7dO6g4nPfkZfntfRBOnDhx4sQ/CF6S4ck+Swqv4nEYoksz1+EoFhDn0dsspSqKlUgNFe1fZ3zxnP/jT99jPz7jPzy64Cu/93usz7ecnZ1Ta3uIh+A5Ho84EcZpou/axkesMh6PbF55hXmeKbVSa+XenbvkUpivrskl40LA18owDDhaivl4exKap5laMsNtmXEtBa3anHgG/WrAO09aFpx3iDiGvuPm5gYk8Mb9NVXhcl/xPrIsM3GzRqQjTSNmnmIOU2NaZjZhw7xMxD4Su0iInpSbQDr6jiVE3loZVoRPcmLbwypXnpvyy+fTbVWLsHIdZ4PRASvxxArRjH1N7Ez4+TIjGOcuYFbpvHBdMosqTgIxzSwe7qsxCDhq6/0zIwnU6hgNJjMmbTU8pRpjVcbS0s2LGRFhCKACOc1ECtdXV/g4YA5KzvRdO9darU3kvRoIvgn1vffMy0wQ306CsafvB/b7A0ua6YYVtVTWu12rcpkPmCnr9YqbUhk2O66uLjGdcTT344kTJ06cOPH38VIMT7f50iAQMESMaoaoIQg1V7wt+NiRreINctyw1DWPPrrkr//yb/ir967Yuwe8/dVvstlu6FxPoLnCPtPK+EC5HXJyzgzDgJeOeC8wLxPVlK4LrPodVZX5cOD8/Jx5mljKwmq1ouRWu7Jer4lWwQytiuDY70di185xtVT6rms6JjWWsjR3Xa0EH8llwfmOjplHz1tcQwg9qoXYDYgEhs5DVUIXmFNmGNasB1o1yZzYnZ2z3+9bWXDJLMvChsrKCXnb8/w6ceEcX/TKGzGyL0rojEUXjsXxxBaKBFIpOCdU/b8rVwQYrbnunlIxcUSrVBNMjLXLBARV+BTDGWSUWSEJROfYhVa/MjjHXJvDsJpxrC0dvDOhKrjQ8pWcCM459mOrSalaSXMiBodZolYjl0LfB9J4oPq2WZrnmRgj3oQ5L/ShY7q6vv3jUqwU8lIwa7EEf/d+1aKsVj3Xz56Qq1JSouRyynk6ceLEiROfy0sxPAlNa63VEEnUGlB1qFbAEM1UH0EGVKGqMvozfvP+T3j/Fx/yv/5YeVEf8KWvfY3t3TNcCKhVpmkEcbeJ0y2Haej7Vu8SAsfjiJqy7gdi6HC1shnW+BiZlwQIh5t92xKlI6lkxEFZFsQMccJ4nBER1CpdP+BEGM7OmOYZHz3RdcxLKzZ26zU3hwNdv8KLsdoMTIdCLQnvHV4Mcw4XAsUMq5WshWWqYIXQr1Bg6Af6Yc1+f0PJmSUtHI5H7t3b4VLgrA+keWGz2fB8nHlhygsreDW6rrnypuo4D55BlW0MeIyUaOGX1uIEzpziVSnmWEpqqe5maEsr4KhGFYeoEkXw1hIl1DWR+A96z+CU6gO/UmVfKs9rRWibLg9IMDbB2vsPaMn03UCtC6t+YH9juOAwA7NK7DsqkJbKbrfGF26F35BTwkmkpEQqC5vNFr39Ny4jF+t7dEGYj0qpyjxPoIqLgRADaVlIZTkJxk+cOHHixOfyUgxP0PQ9zjkqnlICqgshBGoxvDeq9MxLQiVQZMOvf/mU9356yb9+1zPFL/C9730X9SAmiNJSu7W2B25ouT+1Vm72e1abLdF71qsNx+OeZVkIQwdWKWlhmmdCcGhJ5Gpsz1ZsNyuWXNBibYOyLHRdh7hW7RJCJKfEdrtlnmZEK9mU6ptLzTDGcaQfImqFnAuxti67Utu5Ls0JFRi6NTEWSirMx4nQ91TLuBxaWrZroZwlZ1arFd4Hzi/OqTUjVtm4wOCVQ5rZ9hFK4WZWXphwNsBiHWedMeB5MWcCRtWEE0MdDLQTYRXBIwRV+uCZtRIduBa6jhPHUY3gHEENlebGQ4THc+V/q457TghS+DTDVI0owtoZIopDGFxz3xkeBJZ5YZ4nQnAsy4yZcmthJAbPMk6s12uKc5RSWA0D4zyh2gqYvXekNBNjz+FwaEJ+ETbrDaqV6bCAOEIXWaamKXOWydMCalgVBE4D1IkTJ06c+Ht5KYYnM2uhk1WpJaPpmq5zmJxhJiw1sKigGnl2E/n449/wwx+/z//5S+H8tW/wlbffYnW2ZpkSlVt3VSn06xV2mzSdSqZfDS0vSkBrYX99A96BtaDFLNwGWcJxXoghsjtbMU8TpgLaKlS0VlZ9z3IcKVbZ7c44HiZi13E8HokhkLWw7leUYiDS4ge6HueFXFoEQ0oJcY4udvRDj5njMI7M04G8tOHIgL5fYUS0KFoLh2VhSRlzLbPI14TgCDG0eIEgOPX01qFLauXDzuFrQUJEcmXwDq1KBAaBwXmcF8Q55pKoviWtJ4RZBSeKD62XzjtYDESMjRNUHEkMp0oUmm7IGVdZuUJAjFqh90ZwbVvF7ftQDdRcS5EPjmE10Pc93gmo0nWKc555GgldB8D+eORsu8F7z3GaKaqsViuWcWxGgH6FWjsp1loQE5x3pJRYrZqLMFSP956UM56AiWC+/T5PnDhx4sSJz+OleVLUnKmlQMl0rhLFNxt5fJ3nN3v2h8Sf/NXER598xDceJv743cAX3v4Gd197SK1GLUrsIv0QyKVpqKbpyDBsaLJzwUpt3wdhmkZqTuwu7jCs1ggKRARHFwK9j+Ta9DQlJ5SW4VRKwcemE/Ix4MyzzEvLYhIhxIATT+wGxqkNOdtt6+1blsw8L1ALap7V2YbgHHlJ5GVhsx7IMbMsiTu7M2aB3W2op6CUmsmlbdBCjHR9xJxnXGYON3su7t5jFQJ+cThnaBV2nWNUYb8kzDkeF2UuBUlwXxxvD45nRckWKaX1+okXehwOIYkwUfEq2G0MQXeb+C4YinE08M6oeKop1QkmoM7o1SgITowzb3QGk8FYoXNQgOhbaGa9/f2hrUB4mRO1JLqhZ1itiF1HZiFUw6qxn46Uomw3K8bjnu3ZluNxIsYOrZk+Bsy11IfgIjqPzNOMdxGtBRXwoWnSJLa4gzGn3+4H4cSJEydOvPS8HMOTWSvFJSCuoBKZirDImuubkT99d+ZvfvaCT18Y37m/kPya7/6n30fo8V3HsswMtWlixBurYcPNzQ3RB4S2dVlKEwTnNBO7SC4JCYFSKmqK1kw3rCi1cpxGTJXtbke6Da8sZjgRsks4FzCM4D3Bew6HA0UrfRcZViuWacGJZ1itWK3XoMqyJKZ5pmihC5EudszHkVxK28BUpZSMamGzWrE/7KnF6PuOEDpCF8j5Bi/C9mxHqoWUMkMn5FIY1mueX15yFpXOO5wJmx7qAqsAXzlfsc+ZR9VzY45ny8I760gumTsucFkKgwtcV+WOCJ137DtPXyv3JEKGpIV6e0YLzsCMaI6mOBKuMzxKxhohemNj7cZnNC3XQEW8oNUYgqNzkFRxtK69IsLQRepSOOSREDoO48zaCX3X44HVamCaFrLAerclz6n1A/qAFqGLAdOW0yWubfdc8Ezz2MT7IqgqJkof1yiK3eqc+hjRfjjVs5w4ceLEic/lpRieDKOWkRBWLNY2OBRlVmM/w9NPnnK8Grm+3PPR+iF7fYfV6h5VKxKEu5s75HkGHGaelDLzOJOdsPVwHKemFSoF5wNmxsX5jhg75qWgVpsOJrR8piUlVps1pRaCaw/cNM/NpXUbIr4eVq28N83cvX+PaZroup5SK4jRdT0p5xaKuSTiaqCPkR7PkispJ3yMRGk5V9v1hiW1rccyT6SidKGjlkIpleWYsVoZuoFlWRDvwLRlQZWKd46z7QYdZ4YgFAtsXCF3HaoVq4nFO86tcG/j6cXjBRZpfXLRe7qiLM7YucCkLRyzd45Dav2BGWVUx1KVnYcL5xHXNlDOhE0Q7prnpoCKg9uk8E5grsqm94gYqBG10omjuNszKw41mFPCqRCCB1OcE9brFVQoS24DZjWcD+CEskwkdWQt1JQQazqogrGkRBcGfHQ4QKtSSsVUGFZDi36YRoauw9ECM1Mup5DMEydOnDjxubjf9gtoCGYdST2iFa8FL0oOb/C3n4z4cs1hHtmud6wefJ3qdphWghfWwxqqshoGTAubYWAZR/q+w8fIOC50Xd+qObqewzQxpsqclZwLiKGlPVS1GrVUtus1YoZrr4wlJ0wVnJCKtnOiGfvjCMBhfyT6CNUI4gFYdR1DF6glY2bUlKhaPju7xa6jlEpwjmFYc9gfcOKI/YD5iCBcH67ZH46A4sTItbCUTIgOzQl/K4ZexR4nDk0J7z0VayW9GaasOG0bn/M+cBE7tt7xznaFYlwE4U5wbETYDfBmHxEvjNZ65T6eK4+LMuK5zsKTDLOBc55ssFdIJkQJXGWYtUUWLGZNkyVGAJwIQRxehN5BDI6sgMJiwlzaZq/WtkU72wzkPHN+fs54GMklNXF/uv193iaDb7fbdhLc7lhvz9ns7nJcMjUnVtFjZWJZErdvH1WV0HXNQIDifSAX5epmz3KbNH/ixIkTJ058Hi/F5gkznBbMMiaRVIzL+kX+7C9+yHvvfsTPn3jivS/x4M0vsT3b0Q2RWhUzY5lnnHMcDke2uy3jsuBiwHIhdhHnHMdxbO6xmnnj9TduN0aJtCSi9/QhNPsYyjK3uo80zU1gLu38E2M75SxLYXW2odRbpxaO6GA63CAuILc1IdM8cTzumceR1XaLKqzXW6ZpZDv0mCrBQyqJObcYgJwTnW/BmNRK3/UcDyMxeZzznO8uKKWgqoQQMXGt060UXrnYksYjKS0sQRjEsQ2e4hRRIZdKwuGcts2OGHf6SNDKsRjRVbaho1qlaosz+DgXFge7EBlMqK5yIY5BHNEJGSFVw4uQnDBaRgGHYy0QEFZeMISVB+cMj6N3oGZk71Ft+iXnb4uDq1Fq4fr29JnmTEoLq/XAetMqVabjvtXkDD1ewKjsj9e3XYGJokofO8alcufOBcs4cVxyE6T3A7lkTCrD+gznPSIOM8WLY57H3+pH4cSJEydOvPy8FMOTAbP5lh7uAs+mN/mLH/6IP/s3n/Dec8c3vvNdHr7xheZiq5Xj5UjsOuZ55s7FBbkUtrszEKHve47HI9Myt9NQ1zd90XxobrSqjOORzdkZ69WAVkVTbj134oixw0xZctPKiHfEELh6/oLNZsNms0IMNqsVw2rFeDyiJRO0UrI2MXlayLXVuMTdOWrCoonLF5ec7bb0IXC4uSLEjqUa/1d77xYrXZred/2e97RWnXbt79Az05me4HEychSIE48CeJRgRQ4gbBDhIkJBSLFQkCVAEYgLZAsJiUu4QDgSSrASIiMFSGIOMRYkmImVu0xi40PG0+PxOBl7ejLd33HvOqzTe3i4eFe3O6OecXfH3bu6Z/2kUq1aVXuvf9Wqeuqp933e/6NabUIFqe7lpdobEBPrdYvM5pFpGrHeUophjCPeWBpjaPY7nh/PONeyCopJA2cRnFVKzhhVVtajJWOcx6uSUsaiBOOwkinBQCoYNThjUMm8YBqsKeyMcIgRI4akSnbgbcGLA5SNtYxlYG1tbaczT8VtDaydBQzdFHFikLm+ScRyM2SCAS+G11vQlVzqYkmBdRNwvmHSyM3Nke064htHzjWBPB5PGM00bUvOkTgOaC60oaHkCKVwur2lTBFjLP3pzGrV4lCsb+hPZ6yznLsBF6qBKqXc6WdhYWFhYeHyeVvTdiJyLSI/KSJfFJGXReQzInJfRH5GRH5tvr43P1ZE5M+JyJdF5JdF5NNv4wik0vKo2/Olfzjx2Z/9O/zs3/3HvPzY8olPfIoXPvYSYy6MOTHGAWctAgQfMGIQEVJKDF3Hk0dP6pdkWw0r0zQxjT377YqPvfhRcimsVmu8tVgRtGTGFHl+c8MwjrVHXd/Trte1JYv1xBgRaxhj5Hw6MQwDXXfm+ZOnHA9HUlFsaLCNr0v5sVhXR6BSztU+QARrhPPxxDhFhlQYxoRzAWMM0zTWgmYF5z3WBay1xJhqEfv5yJRT9TISpeREzplxGjmfzzhnERdqsbsRghEMHqMGxSJSEFXSVAhSSFrwkhGjFITzpDyNSjG1EN6L4Cis5pqmtXVcB0Mjlg2WtTiYV9EZozQSyAjaNOQi7J1l4w2NETyF4BzOGIyxWGOY5r9tneAsjDFTSmGcJtp2jcdwPhy5uXlOP1RLhylGUoLgGlCDcZ5RC900slo19N2ZaZqqzQG1dmwYRo7TRCx5rmMrpKyo1ilPiuKtIQTParNiu9su7Vk+ZLz38WthYeHbjbdb8/RjwN9U1d8H/EHgZeBHgM+q6qeAz863AX4A+NR8+WHgz/92/7yo4Sat+c1XDnzxC7/G3/xcz6s3DZ/67u/h9/6BP4hvAusQ2K1XbNo1PjT4EFitV2QK3lhaH1jvdvyul17i+sEDmnaFAqfzCec8odkxDBFRpe/OnA4nulPHNNbeaJv1hjxNxGFkv9vhfW1Cq1oQhXv7a3bbDW3b8uDBfayxDNPIlCLeOYLzeOvouyNCxjtXj2ccwRuatkGsxRqhHwaado3znv58ovGONgSOhyOPHj0BjWx3LSqZ9crjjdTmt9PEMAzstlsePnwI1rDarLh3fU0THKfjLc43qCorJwwlU0whGIgJno5zLX6EnOGcLGMW/vGQeJITj6bC4wTHnHmWlN8YqtN4EXi1n3g+wi6YmnBZw9Ox0FhHKoUswto6diWx97CzjkbAW0uqSwKwUpMxa4SghnXw5FLbwoixGOsI3jMOHeIsft0SQmDXehqTCUY5Hm5RLWxWDSVNlFywAt3xgHOurpzUQoqR0HiGsccaMz/vTC7KlDJ93zMlJQOu9aSUAIhzTdXCh4r3NH4tLCx8+/HbJk8isge+D/hLAKo6qeoN8CeAn5gf9hPAvzVv/wngf9TK3wWuReTFb3UMxXDuHS//+qt89lcMIyu+63u/n3/2n/tuNtsN1lg2mw3TlBCZl5ujdH2PMQaxwpQimgrjONQedDmDwHq3rcXZClqglFooPsWJcaiNep1zaMo07YrVZsM4ReIwQs70xxM5JW5ub1BV2vWK4/FICOENXefzmaLKMAy0oZ1bv5wJPhCnkenccXp+S+MdvgkIIKqgmaurLVqqVYNxjlIKxgSmfmLsIgaL9Z6cwRsHWri5uaXkzBRHYoycz2dub57zwgsPcU3g2TQSYyFYT+M83hia4Hhx7QkamUphZQ0OJWZ4dSr0xXLMisNgxdD4wMoZroOlFYtzjpUVNh7ut461EbwTiigPWkeQzNbWNivGGZBMVjP3FLTVf8rUvnixwNdj5DQmKIK1FtVCogBKyTWBWbUtVgqCEpMyFWG1XtOPPU+fPaHrzjQhVBsD7zmdTjjnGIcBHwJiDD54QBjHONc3gbWG9brFuvr2L1mJUyJn5XQ6L+7iHyLej/i1sLDw7cfbGXn6JPAY+Msi8gsi8hdFZAN8VFW/Pj/mVeCj8/bHga++6e9fmfd9U6ZY+Ov/5y/zd/7+U45jw/f8kT/Gw4885Hy44XDzjJQi52FgygU19cu5bRv2+33tMSeCoFASQ98hqjhrWG/WvPTxj9eVeJrr1FioU2tFM0UKt8cDMUZUYIgTzWoFxrDa7mjWG/YPHrDd7/FNQ1bFWIMPdUrtarujdQEtEFPCel/NHaeMb1uyZowA3nF1b4czOjcFTtWOYBo5HY5MMYKp9VpGhGmaAEUcdNPEkDJhtWZKkVKEkieOz56hMYEYFME3K3LOlDRxGBOjClEzmhMZoUFpSDS+AWPpU/XEOmlhZYWsiQcrx1VQgoXWKK0ptEbYeOWh9xhbXcO34hlL4UHjZkdxg3WOQYSnU2GN4TYrGcVaQRWGnOpIT7EMWckqnAuMWpfctd6iwDiNxJSYxgnNGWst3fmMaiZPI1M/EqfEbr9HVXHG8ujxU3xTa9CmocdKTcjadkXwDaCs2jpSJcgbCw0oEaMFUcE7izdCEzzLpN2HHyvMnwAAHG1JREFUivc8fi0sLHz78XYKxh3waeDPqurnROTH+K0hbgBUVUXkHf1gF5Efpg6L03r4WjuRw4bv/ue/n7Dd0R1uyDlhpBof+ibQrlfkMbLerDn3Hd46IsLx9sh2s6Zdryil8PjJ4yrcWU7HA9Z4tusVXdcxjiMlZ5x3iHO0q2piud/vefbsGX3XMQ4DWYTtfseQI3GsDuI5JnJMNCGgJpNy4ng6Ya2r03hdN3eGSeRc265kFYxxZAql1PYk63XL4fYWMZbgPSF4zucz5+E898orGOPY7feAxTcBaxw3zx/jXcs4njh1PZv1FmImW+Vqf597H/kY+bWMHZ6SSmHKSsoG0oTDclaLB9Daq05E2AVlnzNJHWtXa6WCqcaaqg0YmLLwrPTsbCBIxktm5z2T1mTQAE5hbSxdUl4pE59cNXhX27WoGl7tldYLV065mQrPYubKClGF81honCFL5GEIWGMoWXn+/FkdFTQGjOP2+Q3X19cE76uJ6XZDP3asty1xGjCqpGmA4qpX13pD33WIc/TjwNV2XQvSbcBgKDlyOh1QqfVpaCEvBeMfNt7z+LWwsPDtx9tJnl4BXlHVz823f5IafF4TkRdV9evzsPaj+f6vAZ9409+/NO/7J1DVHwd+HKBxRl/rN3zy9/4BjLV05wNI7bNWcuZ0OuGHie3VDnGW4+nMOPQU7xmHnlUTuNquOZ/PjHHCWcM0Thjv6Pqe4Aqb1QpTIA4j2+0WcqIfBry1OO+5fX4z2xnUlVyPnz6l72vtjTWWcRzZbneIEU7nE+tVS4oZnVuljH1P23hyKjhjSDnSn46UogQVRA3TMNHngabxhCZgrCcNAzSB9Wpba3ZKhlTo+qGuItNIdz6x319zb7/nfBrYXO1xYU0cB3AWsUI83/L4lRFuXmWflE4TXSl008SuFDZG8C5zHIVf7yYeWsvaW6YUuXYWLGgsiFhSqf34jIU8N0L+Dr/iiU5ciUVMZlWEQmFtmlokLxarkd+98VgFZzLOWIoK51KT1WAKTpW1E14wDlHldsooYKUQjKU7dzSbDTEWxNRVhnHsCD5gnSPl2kB6s13TjxOaHDFm0Mww1NdsmiZEakG42OooDsIYYz03ceJqtyNOynq9IZU6eulCQ7tK7+qDtHCxvOfx650mXgsLCx98fttpO1V9FfiqiHzXvOuPA18Afgr4oXnfDwF/Y97+KeBPz6tWvhe4fdPw+FuSxfKZf+n7uf/Si4xxwiJIKaCFzXbN7/rES7S7Dblknr/2mDxWJ+6cE2IsWM/hVFudjFNk6DtC8HWFm6193p6fbulTZHW1BWMYYqRpWlSrcWIptfGtd46mbbl6cJ8xZbQooVnxwkc/RtM2GGvYXu3o+o6UEykNrFaGUkb6aWSYBhCpdTMGMpkxDwzTUOuwDDXpUWXqz9XsMSbW6w3eWdZtwDWW63vXpJzx3tE2nmnsuLm5IedM7AeYjS+9tXiE8xQ59z1qhNt+oDOerBYvhqZt6UzhnD1fGTNfH5VfOma+0g98sSu8fJooyfL508gXDhPdVHBAg1IwdClx1EyjSmMEiyUbw9o4iiijZgqZjOBE6qgVDhTORXnUJ7aiPPSGxjr2wbJ3cBsLxhqSKOv5zahZOZ6OpBxrwX4prJuWOA5sdxu6oafre25vDwzDGSMZLQnvPGAYx4S1dQXj06dPCSGwbhucAUsdBdNcOB+PaFamMbLZrGtbl5zpjqelYPxDxPsRvxYWFr79eLs+T38W+CsiEoB/CPx71O+6vyYifwb4DeDfnh/7fwE/CHwZ6ObHfku2V3sIW2ycSFCnt7zDOsdus6WUwtQP7K+ucA/uM04TaYiMJdM2LTlFxDuGOLFaNbVXnAo511YggUwqhaGfaAl45wm+RUr1VxqHoS6FP/XktmWzv6ZYh6xXND4QvGXoznXbBQpKSoV+6PHeczxMeN8QrCVJRIHtble9mnLhdLpltdoQXcZ54XRzg7G1r553ju58qi7o1tdVac5xvLlhs9vS9T0lK+u1J2VL19dWM8YYmqYhpYRzFms9zjfYfOZe8PzmzZmhFO5bGMuAK8pYhK/1PYJDnHCThI80lsMEX+kmUoavp4nWNIg1BCyByNfHQhcTH1k5rhSycVASrbV0GW4jGCyPhpFgleMEpzTw4nqFU6VxhevQVDPRBJMqUy5cBVtX2hVqPRmQ4sS+fcBmveJ87oiipKmaiGop1cbBOoaYCN6RY+J6v+fRo0coiohlHAYevvAQUIaur7YWbUNoGm6f3dD1PQ8evsDpcGIqBY5HNEZcE3BtU806lwTqw8R7Gr8WFha+/ZBL+JK4/+AF/Zd/4F+nTwON9RhjySVjjaOkRBEhNIEUI33f452r3k6zIeM0jvjgudpfM3bVB+rYnSiqXG/3WFP9g2KqPTpyjGw2W7r+jHUOZx0pZ7rjgfvXe3CB/tThvZtX0XUYI5QCTXD4dkXfD1gDIoYSE/35wHa7Qdy8okuqxhwnIoZpmkgps1o3oIJSOB6OrNZrxmlCcj0P6+2Woe/RnFitWzCGUuapwnaFGKmF8xmsFVzwOOeB2p9vevI1Hpxepajnq7dHPhkML2xbxjTyjw4TXz0nuphZGWEbDP0YaQ08n4RM4qWV54F3RDL3xfIkTnzpFBEKv2fdcC/AzVBwVnjgPX1OfOWcuJ0yIoWHjeXJmNkay8ZDFxNjEdYC1sKQDYeYGHPCiuWskHOmESEKyO6Kj730cdZty7k7gxhyzrUlS874piW0q7mZ8+s1cQ05J2IcMbZO4xkD69WKNI9GNk1DihHnPMbVpC2NEd94pikR2sDQD6Rp4ouff3me6lv4nUBVP9Q1+Mu03cLCh5qfV9U//I07L8RhXDkfT1jvqgXB6UTwwnHoCc4jznM43LK/3rNarei7M6Uobduy3m7JoUE1M/QdxlrOfYegOGd59uwJ7SqQ0sTGWUofKQpTD42zWJSu64gpg1ie355Ybbe0mzXPnjxhs90gxrHZ7cgl0h2eM4xjLWSmjnCNfY/3DbeHM+vNhmbV8PT2jHcWLRNjzFzv99y/t+Z4uGWaEutN+8b0noiQNbPyjjSeGYYR7wxJC2WM7HY7Um45nTv2V2ucRs79iBghHxJtWIEUfAjkceQ3z4Wd9BhrScBr/cDvWQU215YgE68NE11Uci54a2hMwUlGBIaUuWotKhbNmcdj5qF35FJopZBL9eWaktKZwmEqnLMy5Mze1Xqp+xaCq57prXFMqogpDLkmU6IgUle3TVPGIaAwqOIVimZujzcglhCqi3lRrSNx557udKJtAi/cv8eTJ08Z00CMYy3kV4BCKnA4Hlmv17RtS9/3tbGzMchsZ962AeMd0xhxWlfaLU2BFxYWFhZ+Oy4ieSo5MYxnTLLkrIj1NG3Dw3t7xhg5HHqapqHv6xTMerNiGCaOxyOUUkdoxFFiZhxGUoqsm4anT5/RrFoUgwkrnj97zHR4zsN7e8p4IIkjNiumImQ19N2Z/X5PiXVKMFE4n88YYxmnkeAtRSyNr5YC4ziQcsFYj28bwmoFosQ40QaDt4aiK5qmFpyLUH2IxpE4RfbXe46HUy2E1lg9jIYOa8FYw9QPBO+QEsnTgLWOvqvJg4rU3nsU+qmjCQ1jjIx9RyqFbkqsDeAsDcIhJYxAMMrv3jQIws00kLKw0oS2SimWrPDVLvJg5TBJGSMcS0RVECyfCIJ3hWdTwUTLa0PitTFiUT4eAgalmOrDpbmaZzpRWiv0GRrneDJO5KKIgJc6ZTcAQyoEqb3y1BjO565aB2hts3M6nZj6vk7zUjgenqOlcO47tts1SRUBjFhWq0COmRQTlEwbAqkUSi7kMoKA+JbD81ua1Zop16bKr7uTLywsLCwsfDMuInkSMay369oGxRms1CSqGzKnbkCsYRhHQtPgrHDz9Bm+qQ7irgl0fYdgMNaCFMQK56HHOMuDhw8ZxxEDmBc+yvYjL2KdR8eRlCasD7gpYlRxfg8inE4nKIXd/or1eo3OUzjeOZpmRYyRHCPbzZZcCkaYpxAtJUZyrqM4RZW2aTiee/bXe7qhI8dc651KIeREsAZrDdkabg8noBBsbTlzGiesDdzcdhyPHcZ5Wu+xPhDaAFC/8K0DUaY4UcQyxkwqcJoSsSj3DKTG8/G18LFNw+NTz21RYhauHEzJUNTR58wE3EQhlol9sGyDwc8zWKcc+Y3okKQ8bAw9IyqWnSQ+unLsrdAXJZYCahizsgoWo5GsBi9KLokrL8QMZzWgiVgKvULRWmuUUqFp14zjxDiOpBhpxWGN4f6Da5x1xFRIuRporlqPqDKce6x3bLcbxn5kvb3i9vaI1UIIQokR17YEI5zPZ6A6txsDQz9ijeXp02dLvdPCwsLCwrfkIpInqKugihq0KKfugLWuukMXpVDNKadpxDd1hMW4QOMt58Pt3D+uLjsvKWPEkFXYXu24PRwIztNsNkynI6Ccx0gSYdfWxGgaB9rNlhQjm90W1wSG0xnfNhhnOZ8GjDGY4GEu1sb52lzXObwzmFyYplhrlDI44xDreX5zIDQNx+ORooUmtIhXhnEkFcW3LTEmNtsNp/PAqgn05w6jcO/6PiVHbo+3XF2tiTm/0btt1TYMw4T3nr4fCU7q87aWLLWmylnLs6g8zcprU88hOh4Gy5V32JR5HEc23mHV8KV+YgAshRF4KI5cEivv2RtDEeX5uRCspUjkeUycsuINXLXV+HIwWvvXiTClwrlkiHbuPwgoqFhEI11RjjFyflNtkTEwTZmUMvl8xtq6GHS1WuN8tSm4PZ5oQ22WHFNG5lWSMdaENTT+tzzAhh7RjGsCKmCdpaTMYRpogsc4gyRwImw3G6aU2F/veUVeWRKohYWFhYVvysUkT11XC8GPx47NfkOJhSLgnaVYQ5kiWpRzP7Ber2kaR86KsZ7D06fcv3+PoqUmQ2Vis9kQcyHGiAueYeiZYl2W7qcJUxTEYr2lXW8oKRGsYzieURGCDxAzx/MtRWDTrsjTiBHwbTXj1FJAlRhj7bHma5G4plz7qZFp2oARqc7lIhwPR7w1rNoVKUbSlHDG8OS1J6zXLRoV4y3TMLHZrFEx7B/cRyjoMJKlPqehr4nTOI3klDiPdSRMtGCBsdTaIY9gg+fZ0PM8Jhoz0WrmgXdsRCGD0UwjhUGFXAzGKlfeU4owzB5J5MKzCE2ZR4HE0MhAoaAFbnNt8Lsxhj6OGGMRDKoZb4RYlCjCISa6VDilwjnXejcjghWpXktWEFGMGEqpxpVI7Ue429WVl6/3oSs58ZEH93h+e2BKBRSMwm695vGTG9ab2kRZtJCTEqcI1mGcwxhD3/W1t6ExxGmaRxHfbrvHhYWFhYVvVy4jeRLY7LYcT2fCquHB/XscDifiNDJMI9vNjskVgvOM44AiDGMiTpmrq8DV1RVZla47Y4Dd9oqclBwL290O5yzD6UTTeJ49esT19TXtJmC88vzpEWdt/d9zy5T1bkucMuM0klLGOMvN7Q27qy1iDOMwELxlGkdyKQQfmOKExIk01RVdIgYtER8cU1ZQ6E8nVm0ALKfjmRAsfV9rqprgcNYixmIzXF/vSaX6TG23GxSIUVFqAfkUE93hQHCBxgdk1TDGOdEB1BjilGi8JceJYA05Q58NpwyvTUpJSolnggVnQWuKhimFEgtqMo0K0xQZ1dIVpSuFfRDiFHFW6MZMoRCL8KwoEgpjErytLXLOuXAo8GyYGFJhUEjU10O11j1Ry+ZRVWJKDMOAEVN73uVMzkpKiaK1d50xpk7xYnj6/IAYAwKrTcM09tVt3Lm6Os85YowA1WBTah/BTCDFXN3fsyLGVJ+noVtGnRYWFhYWviUXkTzllOlOZ7wI1x95yPl8pu871us1q1XLJnhEPMfjGaMZ7wI5gzWF0+EW6wOqBSMeMYZUSl09B5yPtwx9z2Z7BTGTsnIaRrTrWK9WWOeIKTKMI9ZaNld7fPAoI1qUduWJOc9TT0JMCS2FoRtro+B2RT9MYA1N6xFr2F3tOByPb0zrBe9w3uG8J6VCTJFSJlK0lFKo7e8s1lqmlLFGiDmjpSAKt7cHfNMQmnbu4ycYJrarQMQiKKqZJrRMU0fMWqcZRRhixlKLsktRoOBRLDCIghf6VHBYjCqC0ovwuZszq1AtHIzAOE6oM9UXq4soBp0SYgxZIWc4pInf6Otg0crVmq+UC0mFrHMzZAOmLrerfebQN/rN1S1IMdbECZ19u2pSmVKso1PO1dcqRoqamuxNiUkLY0yA0jQeTZk8u9SnlPDeV/uLnEgxA4W2bUg5VXf3FHHW3tGnYGFhYWHhg8JFJE/1K92Qi/L06VN88HjrYMqE3Z7n5yOWBAL37r/Aoetm9+7qgF1iwTqDE6GfBnbekYwleEvTBsJ6W926nWWzv6rHG5XTqaNtW7pzx269ronANBGnARFL3/VveC2p1NYuzge0bYkTpLFniiMh2GrqaSy2cYzdhMUgoZmTBK099UTQkrAG/GZNdzojRkHA+VATPmsxznO6ueVqv6VgmPqeKZ1pmhWlCClGpgzOeFDY7vfcPHtG0UQuGecNZcoEgakUMpByqT395mmppIpB8WIZTU2uXl9pVmJhUuaVaZkUa18+owVjanF7TLEWuyuUUp3Uc4Ey+1X1uVotCFIHw1TBCEYEyLw+2mR0TqKkGpYaY1i1Dt/UWrDu3KNaEzHnHf3Q44yjDYHG1ybPKSUydbqybZua7NpAP/YEiXjvCMHRtCu60xlEUZRxTPiQ58bOGesbpm56v9/+CwsLCwsfMC6iwKO6ZXusFprGgwhjLGQjPH76mPPpRI5CVs/XnzzlfDzy7PETQmgRhZwmCsI5FrbXDzhF5XjsEIE0FlLMxJjIKbO7qivocs6s1ivGOLLdbOi6vjqXp0Q/Dljn2F7tMNbhrWe92WCaQGir2eI0RZxv8E3LNI1M48jt8cSzZ8/JKeG9qwld0yLG0Z174hgZU6IfRvq+Nii+2t1jvdnimxZjLc4ahMJ6s0asAyOogWa1woUARmhXK66u9lzt92gpdOeOkiacEZo2kIuStSYjQaSe5NkSIGlhKkrWms8okHJGtNRps1IYppEwJ6MlG4rWeiQjBmPASC2yri5VSgEUQ5mTnNcnvUSpyZNWLytgdgGv96uW+bqKUdU3puW6cwcw9wCsqwpFDME3OOfoxoGYEtZajDE8fPCAzXbLerOh5MxqtaZdNVWvsbSrujgghFBHtVRZ79a40BDjPNo321G8rnVhYWFhYeGtuIiRJ1Rx1jICwdn6JR8MSqFZNZTiOByPGFflTsOED4Fnz5/ijKl1QqWwagPdzQ1FFGMtz2+PaAbvbW0AO008fvU1tvtrQhMoOdF4TxMaVIQYJ8ZU/ZdKigzDUKd5xHE8HlmtGmIzYTCE0KAlM/YjuRicOpxTVus1cRrI/Zmr/TXPjyc0K5ozIViasMKIcDwcMCEQsyKqlJKJKSFJUTUYASl1inDVNAQXMGIxTfVo0qL0pzNDHGnaFS60DDEhY6pF4BhElEisLVC0JiApZ3KqI0neCMZQVxDOJslStJqHChQtPGwhZsdpnk4EUJE5ydM5fRKKFnKpo2hi6j1WzFzXJCC1Qe/rCZvqm6bu5seowjSO9H0POARD04TawqYbiHEiTWCcxVhLTolpmmjbtvpxWUdoGrabDblMGCNoMQQfZj8ti86F/iICpdAdj1zf29XkL2stPF9YWFhYWPgWXER7FhE5Ar961zq+CQ+BJ3ct4i24VF2waHs3XKou+KfT9s+o6gu/k2IuDRF5DJy5zPP3YX1fvZdcqi5YtL0b/ml1vWUMu5Tk6efeqnfMJXCp2i5VFyza3g2XqgsuW9ulcKmv0aXqgsvVdqm6YNH2bnivdF1EzdPCwsLCwsLCwgeFJXlaWFhYWFhYWHgHXEry9ON3LeBbcKnaLlUXLNreDZeqCy5b26Vwqa/RpeqCy9V2qbpg0fZueE90XUTN08LCwsLCwsLCB4VLGXlaWFhYWFhYWPhAsCRPCwsLCwsLCwvvgDtPnkTkXxORXxWRL4vIj9zB8f8HEXkkIp9/0777IvIzIvJr8/W9eb+IyJ+btf6yiHz6PdT1CRH5WRH5goj8ioj8x5egTURaEfl7IvJLs67/ct7/SRH53Hz8vyoiYd7fzLe/PN//He+Frm/QaEXkF0Tkpy9Jm4h8RUT+gYj8ooj83LzvEt5r1yLykyLyRRF5WUQ+cwm6Pggs8eub6rrI+DUf66Jj2BK/3pW29z+G6dwW4y4ugAV+HfhOIAC/BPz+91nD9wGfBj7/pn3/NfAj8/aPAP/VvP2DwP9N7db2vcDn3kNdLwKfnrd3wJeA33/X2ub/v523PfC5+Xh/DfhT8/6/APwH8/Z/CPyFeftPAX/1fTin/ynwPwE/Pd++CG3AV4CH37DvEt5rPwH8+/N2AK4vQdelX5b49S11XWT8mo910TFsiV/vStv7HsPesyfzNp/wZ4C/9abbPwr86B3o+I5vCD6/Crw4b78I/Oq8/d8D/85bPe590Pg3gH/lkrQBa+D/A/5FqoOr+8bzCvwt4DPztpsfJ++hppeAzwLfD/z0/AG5FG1vFXzu9HwCe+AffePzvmtdH4TLEr/ekcaLi1/zcS4qhi3x613pupMYdtfTdh8Hvvqm26/M++6aj6rq1+ftV4GPztt3oncejv0e6i+kO9c2Dyv/IvAI+Bnqr+8bVU1vcew3dM333wIP3gtdM/8t8J8Brzepe3BB2hT4f0Tk50Xkh+d9d30+Pwk8Bv7yPFXwF0VkcwG6Pghc6mtxUefu0uLXrOlSY9gSv945dxLD7jp5uni0pqZ35ucgIlvgfwX+E1U9vPm+u9KmqllV/xD1V9K/APy+91vDWyEi/wbwSFV//q61fBP+qKp+GvgB4D8Ske978513dD4dddrnz6vq91B7tP0TtTt3/RlYePfc9bm7xPg1H/viYtgSv941dxLD7jp5+hrwiTfdfmned9e8JiIvAszXj+b976teEfHUwPNXVPV/uyRtAKp6A/wsdSj5WkTcWxz7DV3z/Xvg6Xsk6Y8A/6aIfAX4X6hD3z92IdpQ1a/N14+A/50atO/6fL4CvKKqn5tv/yQ1EN21rg8Cl/paXMS5u/T4BRcXw5b49e64kxh218nT3wc+Na8mCNSit5+6Y01QNfzQvP1D1Pn61/f/6bla/3uB2zcNC/6OIiIC/CXgZVX9by5Fm4i8ICLX8/aKWsfwMjUA/clvout1vX8S+Nvzr4DfcVT1R1X1JVX9Dup76W+r6r97CdpEZCMiu9e3gX8V+Dx3fD5V9VXgqyLyXfOuPw584a51fUBY4tc34VLj16ztImPYEr/eHXcWw96LAq53cqFWvn+JOuf8n9/B8f9n4OtApGawf4Y6b/xZ4NeA/xe4Pz9WgP9u1voPgD/8Hur6o9Rhxl8GfnG+/OBdawO+G/iFWdfngf9i3v+dwN8Dvgz8daCZ97fz7S/P93/n+3Re/xi/tVrlzrXNGn5pvvzK6+/1uz6f87H+EPBz8zn9P4B7l6Drg3BZ4tc31XWR8Ws+1sXHsCV+vWN973sMW9qzLCwsLCwsLCy8A+562m5hYWFhYWFh4QPFkjwtLCwsLCwsLLwDluRpYWFhYWFhYeEdsCRPCwsLCwsLCwvvgCV5WlhYWFhYWFh4ByzJ08LCwsLCwsLCO2BJnhYWFhYWFhYW3gH/PzQ43B/pRYANAAAAAElFTkSuQmCC\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Jn5cPT_-qzf-" + }, + "source": [ + "It's important to note that we don't actually need to worry what values we are using for padding here, because convolutions are applied locally. We just need to calculate the size of the output region and can then crop and retrieve our result.\n", + "\n", + "*This is not the case* for other operations such as max, min, sum, matmul or var, where the operation is applied to the entire Tensor at once. We'll get to that later.\n" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "enWHS_JErbcS", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 683 + }, + "outputId": "ac4b441a-8ae8-45ef-d3c7-bde9abddf368" + }, + "source": [ + "with torch.inference_mode():\n", + " padded_result = torch.conv2d(data_tensor, weight)\n", + "display_image_tensors(padded_result.unbind())" + ], + "execution_count": 7, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).\n", + "Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).\n", + "Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).\n", + "Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).\n" + ], + "name": "stderr" + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "P4S3x1cKru_A" + }, + "source": [ + "Now let's cut out the output regions and test that they are actually the result we want\n", + "\n" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "kcemIiA-s197", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "455383dd-0b61-43a1-93d3-f828744fde38" + }, + "source": [ + "results = []\n", + "for orig, result in zip(EXAMPLE_IMAGE_TENSORS, padded_result.unbind()):\n", + " # The output region is 4 pixels smaller than the input because we're applying a 5 by 5 convolution\n", + " results.append(result[:, :orig.size(1) - 4, :orig.size(2) - 4])\n", + " # To test the result we're going to apply conv2d again here but one image at a time\n", + " print(torch.eq(torch.conv2d(orig.unsqueeze(0), weight), results[-1]).all().item())" + ], + "execution_count": 8, + "outputs": [ + { + "output_type": "stream", + "text": [ + "True\n", + "True\n", + "True\n", + "True\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "qUXR2h7RDInz" + }, + "source": [ + "### Using NestedTensor\n", + "\n", + "Here is the *entire operation* using NestedTensor." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "InFtSbnyEoG_", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 655 + }, + "outputId": "7e70d666-f5f2-491d-c324-5e727e4672b4" + }, + "source": [ + "with torch.inference_mode():\n", + " # 1. Put the images in a NestedTensor\n", + " nt = nestedtensor.nested_tensor(EXAMPLE_IMAGE_TENSORS)\n", + " # 2. Call conv2d\n", + " results_nt = torch.conv2d(nt, weight)\n", + "\n", + "display_image_tensors(results_nt)" + ], + "execution_count": 9, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).\n", + "Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).\n", + "Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).\n", + "Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).\n" + ], + "name": "stderr" + }, + { + "output_type": "display_data", + "data": { + "image/png": "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N998k5kzZ9rG89/97neUlpZyww03sHv3bhYvXkwgEKCyspJwOMzEiRPZtm0bR48eZfHixQSDQd59910WLlzI+PHjR/IwDitaa8aNG8eUKVNobm4mkUjY/XqzZs1Ca81DDz1EWloaPp+Pt956i/379+PxeOjs7KShoeFDZa/Ky8sZN24cBw4c4KyzzqK7u5t4PE5ubi55eXl0dXUBgyuEvF4vLS0tbNiwgTlz5lBaWkosFsPv9/OVr3yF6upqXnrpJUKhEBMmTKC+vp7i4mK01ixYsICKigrS0tJspnRgYGBYj6EgCILw4RFhdRJ4vV527txJXV0dzc3NdiJsYGCA7u5uNmzYQFdXF2+++SZ+v594PE4wGOQHP/gBDocDl8tFR0cHsViM+vp6nn/+eQ4dOkRKSgqtra28//77XHLJJVx77bV2L9zWrVu5/fbbufzyy8nNzcXpdNLf388ZZ5xBOBymtraWtWvX8t577zF27FjWrVtHf38/zz77LH19fcyYMYNNmzbZfXbTp08/qWMwGtfgDAwM8PTTT1NUVEROTg7l5eW0traybt06jh49SkVFBdFolLvvvptzzz2X//t//y+JRIKmpiaysrL+x9/nT+3mM+U+r9fL3LlzUUrhcDjIzMzE7XZTX1+Pw+GgsrKS999/nzlz5pCenk5bWxuxWAyXy0Vubi4LFy6kpqaGw4cPU1ZWRklJCbm5ubbH6rzzziM7O5vU1FT6+vqGvWdMEARBODlEWJ0kd999Nxs3bmTs2LG216Wrq4ve3l5SU1PJyspi4cKF1NbWsmTJErZu3crx48c588wzuf3227n77rt5/vnnqaurY+nSpZx11llorSktLWXVqlUUFhayb98+xowZg9/vp6amhgULFnDhhRcyffp0otEoKSkppKen09zczLZt27j88suJxWJ897vf5fXXX+c73/kOM2fOZPbs2dTX13PkyBEyMzMpLy+nqKjopEpJAwMDoyZjkkgk7O81ZcoUOjs7qaiooLq62jaVA4wfP5729nauv/56XC4XL7zwAt/61rd444038Pl8pKWl/dGf/6cEZCQSweVy0d/fz9atW4nFYng8HhwOB21tbcBgo3tPTw+BQIBFixaxefNmqqurcTqd3HfffUycOJGqqiri8Tjd3d14PB7OOOMMYrEYAwMD7NmzhzFjxgCD048DAwOEQqFh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UFpaSnh4OE6nk7vuuguz2Yzb7SY3N1cARKOjo4WvanR0VESuHT16lDNnzhAdHS0mMP+c5hqrq5CXOu6dItNqtTQ2NqJQKFCr1QwMDBAREcHzzz/P7t27eeihh1ixYgVqtVoYoP+cvA3UH6u0tJSKigoxQvree++RmJjIhx9+yNTUFL6+vgKb4O/vz/T0NMuXLxdTfQaDge7ublJSUgRYUqFQcO7cOWZmZkhKSuKGG25Ap9NhtVrFNoBKpSIzMxOTySQCXBUKBT09PaxcuZLvf//71NfXCzCcy+ViampK/ELodDr0ej0vv/wy+/btw+FwiP1wp9NJUlISaWlpNDc343Q6kWUZi8XCxYsXRXPqzfZraWnBYDCQmJhIUVERWq2WLVu2oNPp8PPzQ6/Xc+LECSYmJvjwww8pKioiLi5OxM54fwHDw8NJSkoS2IapqSkcDgf5+fksWLBAjB570QZJSUmMjY3R399PTk4OMTExrF69mvnz56PVaklPTyc1NZVTp07x0ksv8e677zI+Pk58fDz33XcfmzZt4q677uLIkSO89tprHD58mMbGRiYmJnjwwQepq6vD7XZz6NAh1q5dS0ZGhjDglpWVERYWJkJv77jjDqKjo8U27pyunVQqlcCTVFRUMH/+fFJTUwUocXBwkKioKGJiYnA4HExPT5Oamkp0dDQTExMkJyeTnZ2N3W7n0qVLTExM8Mgjj7B06VIWL15MaWkp77//Pg888ACff/45P/3pT8VV+3vvvceKFSt48skniY6O5tChQ+Tl5eFyudi3bx8LFiwgMDBQXGHPzMyI3NHw8HAiIiL40Y9+xMMPP0xaWhrHjh1j165daDQaPvzwQyIjI1m/fj2vvPIKPT093HbbbYyNjfHss89y3333sXbtWt555x0aGhrIysri3XffJSwsDFmWGRoawuPxCDTB0aNHOXLkCI8++ih79+4V24GXLl3io48+IikpSWQoWq1WfvCDH7BkyRJ+97vf8fTTT7N27VouXLiAQqFgx44d4vXbvHkzFouFiIgILl++zIYNG0Rz8MADD3D06FHefPNNbr75ZpYvX05tbS3PPfcca9euZd68eZw/f569e/fy7LPP4nK5+NGPfoTFYmHnzp243W7efvttcnNzGRgYIDY2lj179hATEyNez4GBAQYHB/n973/PsmXLhB9ux44dtLW1MTMz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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "cgDhgoQwgXdf" + }, + "source": [ + "### NestedTensor and masking\n", + "As we've seen in an earlier section you can use padding to merge images of different sizes and apply an operation (conv2d) concurrently. But there are cases where padding is not enough, in particular when an operation is applied globally to the entire datapoint and the padding values are incorporated into the result. One example here is ```sum``` and ```max```. Let's construct some small Tensors to showcase how padding and masking allows us to apply these reductions concurrently to a list of variably sized data.\n" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "uT83TQ7rSwiV", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "5a3a5ec8-25f9-40e1-8ec9-1c8116a9674d" + }, + "source": [ + "t0 = torch.arange(6).reshape(2, 3).float()\n", + "t1 = torch.arange(9).reshape(3, 3).float()\n", + "t2 = torch.arange(8).reshape(2, 4).float()\n", + "t3 = torch.arange(4).reshape(2, 2).float()\n", + "tensors = [t0, t1, t2, t3]\n", + "for t in tensors:\n", + " print(t, \"\\n\")" + ], + "execution_count": 10, + "outputs": [ + { + "output_type": "stream", + "text": [ + "tensor([[0., 1., 2.],\n", + " [3., 4., 5.]]) \n", + "\n", + "tensor([[0., 1., 2.],\n", + " [3., 4., 5.],\n", + " [6., 7., 8.]]) \n", + "\n", + "tensor([[0., 1., 2., 3.],\n", + " [4., 5., 6., 7.]]) \n", + "\n", + "tensor([[0., 1.],\n", + " [2., 3.]]) \n", + "\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "P7tQeG0mUBMW", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "74cd3af5-5ed8-4bbe-b179-ad7a7ce7a33f" + }, + "source": [ + "max_size_0 = max(t.size(0) for t in tensors)\n", + "max_size_1 = max(t.size(1) for t in tensors) \n", + "data_tensor = torch.zeros(len(tensors), max_size_0, max_size_1)\n", + "for i, t in enumerate(tensors):\n", + " data_tensor[i, :t.size(0), :t.size(1)].copy_(t)\n", + "print(data_tensor)" + ], + "execution_count": 11, + "outputs": [ + { + "output_type": "stream", + "text": [ + "tensor([[[0., 1., 2., 0.],\n", + " [3., 4., 5., 0.],\n", + " [0., 0., 0., 0.]],\n", + "\n", + " [[0., 1., 2., 0.],\n", + " [3., 4., 5., 0.],\n", + " [6., 7., 8., 0.]],\n", + "\n", + " [[0., 1., 2., 3.],\n", + " [4., 5., 6., 7.],\n", + " [0., 0., 0., 0.]],\n", + "\n", + " [[0., 1., 0., 0.],\n", + " [2., 3., 0., 0.],\n", + " [0., 0., 0., 0.]]])\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "xDWiUoQ_yz0K", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "af7a2bf2-2cac-4821-ab38-cc7bca82d7f0" + }, + "source": [ + "results = []\n", + "for result_t, t in zip(torch.sum(data_tensor, dim=1), tensors):\n", + " results.append(result_t[:t.size(1)])\n", + " print(torch.equal(result_t[:t.size(1)], torch.sum(t, dim=0)))\n", + "print(results)" + ], + "execution_count": 12, + "outputs": [ + { + "output_type": "stream", + "text": [ + "True\n", + "True\n", + "True\n", + "True\n", + "[tensor([3., 5., 7.]), tensor([ 9., 12., 15.]), tensor([ 4., 6., 8., 10.]), tensor([2., 4.])]\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "UuJKrhdhP27-" + }, + "source": [ + "This works because the Tensor is padded with 0s. Since it's up to the user to choose what values are meant to be used for padding that's fine." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "PfMYCQk7y56g" + }, + "source": [ + "Or equivalently using NestedTensor via the same operator" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "vrldzgFsy9Ry", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "726a02a1-d6a4-4be8-eb72-9526d051bfb8" + }, + "source": [ + "with torch.inference_mode():\n", + " print(nestedtensor.nested_tensor(tensors).sum(1))" + ], + "execution_count": 13, + "outputs": [ + { + "output_type": "stream", + "text": [ + "nested_tensor([\n", + " tensor([3., 5., 7.]),\n", + " tensor([ 9., 12., 15.]),\n", + " tensor([ 4., 6., 8., 10.]),\n", + " tensor([2., 4.])\n", + "])\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "hdERKTAR0_bR" + }, + "source": [ + "When using padding and masking we always need some kind of information to recover the portion of data from the result that is relevant. We can store the shape of the individual Tensors and manually update them to do the retrieval, or alternatively we could use a mask to signify which elements are valid. This also provides us with an alternative way of calculating the sum that doesn't depend on the values that were used for padding." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "A4F4Gz-Y1fxl", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "1e162228-6847-474f-95a5-cb63b2a98912" + }, + "source": [ + "max_size_0 = max(t.size(0) for t in tensors)\n", + "max_size_1 = max(t.size(1) for t in tensors) \n", + "data_tensor = torch.zeros(len(tensors), max_size_0, max_size_1)\n", + "mask_tensor = torch.zeros_like(data_tensor)\n", + "for i, t in enumerate(tensors):\n", + " data_tensor[i, :t.size(0), :t.size(1)].copy_(t)\n", + " mask_tensor[i, :t.size(0), :t.size(1)].fill_(1)\n", + "print(data_tensor)\n", + "print(mask_tensor)" + ], + "execution_count": 14, + "outputs": [ + { + "output_type": "stream", + "text": [ + "tensor([[[0., 1., 2., 0.],\n", + " [3., 4., 5., 0.],\n", + " [0., 0., 0., 0.]],\n", + "\n", + " [[0., 1., 2., 0.],\n", + " [3., 4., 5., 0.],\n", + " [6., 7., 8., 0.]],\n", + "\n", + " [[0., 1., 2., 3.],\n", + " [4., 5., 6., 7.],\n", + " [0., 0., 0., 0.]],\n", + "\n", + " [[0., 1., 0., 0.],\n", + " [2., 3., 0., 0.],\n", + " [0., 0., 0., 0.]]])\n", + "tensor([[[1., 1., 1., 0.],\n", + " [1., 1., 1., 0.],\n", + " [0., 0., 0., 0.]],\n", + "\n", + " [[1., 1., 1., 0.],\n", + " [1., 1., 1., 0.],\n", + " [1., 1., 1., 0.]],\n", + "\n", + " [[1., 1., 1., 1.],\n", + " [1., 1., 1., 1.],\n", + " [0., 0., 0., 0.]],\n", + "\n", + " [[1., 1., 0., 0.],\n", + " [1., 1., 0., 0.],\n", + " [0., 0., 0., 0.]]])\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "BwVgGgoCHMGH", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "e42789e1-e888-44e6-a3a6-bade1b741857" + }, + "source": [ + "result = torch.bmm(mask_tensor.transpose(1, 2)[:, :1, :], data_tensor).squeeze(1)\n", + "result_mask = mask_tensor.max(1)[0]\n", + "for result_t, mask_t, t in zip(result.unbind(), result_mask.unbind(), tensors):\n", + " print(torch.equal(torch.sum(t, dim=0), result_t[:int(mask_t.sum().item())]))\n" + ], + "execution_count": 15, + "outputs": [ + { + "output_type": "stream", + "text": [ + "True\n", + "True\n", + "True\n", + "True\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ACXhkCNuIolA" + }, + "source": [ + "As a bonus [bmm (batch matrix multiply)](https://pytorch.org/docs/master/generated/torch.bmm.html#torch.bmm) will use efficient matrix multiplication kernels, but it does require the mask to be of type float (there is no explicit support for boolean values yet).\n", + "\n", + "Both of these approaches work for summation, but what if we wanted to calculate the maximum instead of doing a summation now?\n", + "\n", + "One approach here is to change the value we use for padding. In particular we need to fill the data Tensor with the smallest possible value a particular dtype can represent. It's important to pick the right value for that, but luckily we have [torch.finfo](https://pytorch.org/docs/master/type_info.html#torch-finfo)." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "UZWthXk_JEIE", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "4c8d32be-8e9e-4991-d286-503d7140b4fb" + }, + "source": [ + "max_size_0 = max(t.size(0) for t in tensors)\n", + "max_size_1 = max(t.size(1) for t in tensors) \n", + "min_value = torch.finfo(torch.float32).min\n", + "data_tensor = torch.zeros(len(tensors), max_size_0, max_size_1).fill_(min_value)\n", + "for i, t in enumerate(tensors):\n", + " data_tensor[i, :t.size(0), :t.size(1)].copy_(t)\n", + "print(data_tensor.max(1)[0])" + ], + "execution_count": 16, + "outputs": [ + { + "output_type": "stream", + "text": [ + "tensor([[ 3.0000e+00, 4.0000e+00, 5.0000e+00, -3.4028e+38],\n", + " [ 6.0000e+00, 7.0000e+00, 8.0000e+00, -3.4028e+38],\n", + " [ 4.0000e+00, 5.0000e+00, 6.0000e+00, 7.0000e+00],\n", + " [ 2.0000e+00, 3.0000e+00, -3.4028e+38, -3.4028e+38]])\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "_ALa60C8KPsP" + }, + "source": [ + "If we're doing this reduction as a follow-up to the previous summation we might utilize the mask to fill the padding values. It just needs to be of boolean dtype and inverted, but might be faster than reallocating memory and then copying into the subtensors." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "Cd3ufW2dKlsn", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "d101851d-9c29-4b9b-80f8-b13b8eafe811" + }, + "source": [ + "max_size_0 = max(t.size(0) for t in tensors)\n", + "max_size_1 = max(t.size(1) for t in tensors) \n", + "data_tensor = torch.zeros(len(tensors), max_size_0, max_size_1)\n", + "mask_tensor = torch.zeros_like(data_tensor, dtype=torch.bool)\n", + "for i, t in enumerate(tensors):\n", + " data_tensor[i, :t.size(0), :t.size(1)].copy_(t)\n", + " mask_tensor[i, :t.size(0), :t.size(1)].fill_(1)\n", + "data_tensor.masked_fill_(~mask_tensor, torch.finfo(torch.float32).min)\n", + "print(data_tensor.max(1)[0])" + ], + "execution_count": 17, + "outputs": [ + { + "output_type": "stream", + "text": [ + "tensor([[ 3.0000e+00, 4.0000e+00, 5.0000e+00, -3.4028e+38],\n", + " [ 6.0000e+00, 7.0000e+00, 8.0000e+00, -3.4028e+38],\n", + " [ 4.0000e+00, 5.0000e+00, 6.0000e+00, 7.0000e+00],\n", + " [ 2.0000e+00, 3.0000e+00, -3.4028e+38, -3.4028e+38]])\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "i8vUxMAaOMrE" + }, + "source": [ + "Of course with NestedTensor you just use max instead of sum to do this." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "zrxJ9evmOPJO", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "55f2db10-d5cf-4112-e837-dd3c1532e98b" + }, + "source": [ + "with torch.inference_mode():\n", + " print(nestedtensor.nested_tensor(tensors).max(1)[0])" + ], + "execution_count": 18, + "outputs": [ + { + "output_type": "stream", + "text": [ + "nested_tensor([\n", + " tensor([3., 4., 5.]),\n", + " tensor([6., 7., 8.]),\n", + " tensor([4., 5., 6., 7.]),\n", + " tensor([2., 3.])\n", + "])\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "lV0FikPsSfnK" + }, + "source": [ + "As a convenience function you can also construct nestedtensors from a padded and masked version of your data, as long as the mask is boolean and matches the shape of the data Tensor. This is useful when you want to gradually apply NestedTensor in the context of a pipeline where you already are using padding and masking." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "-QBiny_CVgDm", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "4a24bc5f-9a7c-47e1-987c-76ac399d470e" + }, + "source": [ + "tensor = torch.tensor(\n", + " [[[0.8413, 0.7325, 0.0000, 0.0000],\n", + " [0.0000, 0.0000, 0.0000, 0.0000],\n", + " [0.0000, 0.0000, 0.0000, 0.0000]],\n", + "\n", + " [[0.6334, 0.5473, 0.3273, 0.0564],\n", + " [0.3023, 0.6826, 0.3519, 0.1804],\n", + " [0.8431, 0.1645, 0.1821, 0.9185]]])\n", + "mask = torch.tensor(\n", + " [[[ True, True, False, False],\n", + " [False, False, False, False],\n", + " [False, False, False, False]],\n", + "\n", + " [[ True, True, True, True],\n", + " [ True, True, True, True],\n", + " [ True, True, True, True]]])\n", + "nt2 = nestedtensor.nested_tensor_from_tensor_mask(tensor, mask)\n", + "print(nestedtensor.nested_tensor_from_tensor_mask(tensor, mask))\n", + "print(nestedtensor.nested_tensor_from_padded_tensor(tensor, padding=0))" + ], + "execution_count": 19, + "outputs": [ + { + "output_type": "stream", + "text": [ + "nested_tensor([\n", + " tensor([[0.8413, 0.7325]]),\n", + " tensor([[0.6334, 0.5473, 0.3273, 0.0564],\n", + " [0.3023, 0.6826, 0.3519, 0.1804],\n", + " [0.8431, 0.1645, 0.1821, 0.9185]])\n", + "])\n", + "nested_tensor([\n", + " tensor([[0.8413, 0.7325]]),\n", + " tensor([[0.6334, 0.5473, 0.3273, 0.0564],\n", + " [0.3023, 0.6826, 0.3519, 0.1804],\n", + " [0.8431, 0.1645, 0.1821, 0.9185]])\n", + "])\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "JYdN4ynSOruq" + }, + "source": [ + "Likewise you can also convert from a NestedTensor into a pair of data and a corresponding mask." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "1cuIs73rVgDo", + "scrolled": false, + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "02bcfd6d-adc4-46ab-b525-b484be7682c4" + }, + "source": [ + "data, mask = nt2.to_tensor_mask()\n", + "print(data)\n", + "print(mask)" + ], + "execution_count": 20, + "outputs": [ + { + "output_type": "stream", + "text": [ + "tensor([[[0.8413, 0.7325, 0.0000, 0.0000],\n", + " [0.0000, 0.0000, 0.0000, 0.0000],\n", + " [0.0000, 0.0000, 0.0000, 0.0000]],\n", + "\n", + " [[0.6334, 0.5473, 0.3273, 0.0564],\n", + " [0.3023, 0.6826, 0.3519, 0.1804],\n", + " [0.8431, 0.1645, 0.1821, 0.9185]]])\n", + "tensor([[[1, 1, 0, 0],\n", + " [0, 0, 0, 0],\n", + " [0, 0, 0, 0]],\n", + "\n", + " [[1, 1, 1, 1],\n", + " [1, 1, 1, 1],\n", + " [1, 1, 1, 1]]], dtype=torch.uint8)\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "96y9b2b2j0we", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "9c5c6f6b-d387-47e1-d5ad-c7518dcfe470" + }, + "source": [ + "with torch.inference_mode():\n", + " print(nt2.to_padded_tensor(padding=-10))" + ], + "execution_count": 21, + "outputs": [ + { + "output_type": "stream", + "text": [ + "tensor([[[ 0.8413, 0.7325, -10.0000, -10.0000],\n", + " [-10.0000, -10.0000, -10.0000, -10.0000],\n", + " [-10.0000, -10.0000, -10.0000, -10.0000]],\n", + "\n", + " [[ 0.6334, 0.5473, 0.3273, 0.0564],\n", + " [ 0.3023, 0.6826, 0.3519, 0.1804],\n", + " [ 0.8431, 0.1645, 0.1821, 0.9185]]])\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "cwQja7vpFFay" + }, + "source": [ + "### Under the hood\n", + "\n", + "Let's take a second and look at what a NestedTensor looks like.\n", + "\n", + "For now it simply prints as a nested list of Tensors." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "iVMbsEwYFzNp", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "bfcda4ae-1064-46db-fef4-e444c110806a" + }, + "source": [ + "print(nt)" + ], + "execution_count": 22, + "outputs": [ + { + "output_type": "stream", + "text": [ + "nested_tensor([\n", + " tensor([[[0.4431, 0.4431, 0.4353, ..., 0.1451, 0.0784, 0.0627],\n", + " [0.4471, 0.4431, 0.4392, ..., 0.1137, 0.0784, 0.0627],\n", + " [0.4510, 0.4471, 0.4392, ..., 0.1137, 0.0118, 0.1255],\n", + " ...,\n", + " [0.1765, 0.1608, 0.1765, ..., 0.3294, 0.3725, 0.3686],\n", + " [0.2078, 0.2039, 0.2314, ..., 0.4275, 0.3333, 0.3412],\n", + " [0.2118, 0.2235, 0.2471, ..., 0.4000, 0.4392, 0.4353]],\n", + " \n", + " [[0.5647, 0.5647, 0.5647, ..., 0.1490, 0.0824, 0.0667],\n", + " [0.5686, 0.5647, 0.5686, ..., 0.1176, 0.0824, 0.0745],\n", + " [0.5725, 0.5686, 0.5686, ..., 0.1216, 0.0196, 0.1451],\n", + " ...,\n", + " [0.1843, 0.1647, 0.1765, ..., 0.2745, 0.3176, 0.3059],\n", + " [0.2118, 0.2078, 0.2353, ..., 0.3882, 0.2941, 0.3098],\n", + " [0.2196, 0.2314, 0.2549, ..., 0.3451, 0.3882, 0.3961]],\n", + " \n", + " [[0.6863, 0.6863, 0.6863, ..., 0.1294, 0.0510, 0.0353],\n", + " [0.6902, 0.6863, 0.6902, ..., 0.0863, 0.0588, 0.0471],\n", + " [0.6941, 0.6902, 0.6902, ..., 0.0706, 0.0000, 0.1216],\n", + " ...,\n", + " [0.1804, 0.1725, 0.1843, ..., 0.2235, 0.2667, 0.2471],\n", + " [0.2196, 0.2157, 0.2431, ..., 0.3412, 0.2471, 0.2588],\n", + " [0.2157, 0.2275, 0.2510, ..., 0.3098, 0.3529, 0.3569]]]),\n", + " tensor([[[0.7608, 0.7843, 0.7725, ..., 0.4745, 0.4980, 0.4784],\n", + " [0.7529, 0.7686, 0.7686, ..., 0.4902, 0.4902, 0.4941],\n", + " [0.7569, 0.7608, 0.7647, ..., 0.4980, 0.4863, 0.5020],\n", + " ...,\n", + " [0.1765, 0.1804, 0.1804, ..., 0.4588, 0.3922, 0.3451],\n", + " [0.1804, 0.1725, 0.1804, ..., 0.3294, 0.3216, 0.3294],\n", + " [0.1804, 0.1725, 0.1686, ..., 0.3255, 0.3216, 0.3137]],\n", + " \n", + " [[0.7804, 0.8039, 0.7922, ..., 0.5137, 0.5333, 0.5137],\n", + " [0.7765, 0.7922, 0.7922, ..., 0.5176, 0.5176, 0.5216],\n", + " [0.7922, 0.7961, 0.8000, ..., 0.5333, 0.5137, 0.5294],\n", + " ...,\n", + " [0.2118, 0.2039, 0.2039, ..., 0.4627, 0.3961, 0.3490],\n", + " [0.2039, 0.2078, 0.2039, ..., 0.3255, 0.3216, 0.3294],\n", + " [0.1961, 0.2078, 0.2039, ..., 0.3176, 0.3216, 0.3176]],\n", + " \n", + " [[0.7922, 0.8157, 0.8039, ..., 0.5490, 0.5608, 0.5412],\n", + " [0.7765, 0.7922, 0.7922, ..., 0.5569, 0.5569, 0.5608],\n", + " [0.7882, 0.7843, 0.7882, ..., 0.5608, 0.5529, 0.5686],\n", + " ...,\n", + " [0.2078, 0.2039, 0.2039, ..., 0.4431, 0.3725, 0.3255],\n", + " [0.2039, 0.2039, 0.2039, ..., 0.3176, 0.3137, 0.3216],\n", + " [0.2000, 0.2039, 0.2000, ..., 0.3216, 0.3294, 0.3255]]]),\n", + " tensor([[[0.5451, 0.5765, 0.4118, ..., 0.0196, 0.0118, 0.0039],\n", + " [0.4784, 0.6824, 0.2588, ..., 0.0078, 0.0078, 0.0039],\n", + " [0.6902, 0.8431, 0.5373, ..., 0.0078, 0.0078, 0.0039],\n", + " ...,\n", + " [0.3412, 0.3451, 0.2627, ..., 0.1686, 0.1882, 0.1765],\n", + " [0.3059, 0.2275, 0.3490, ..., 0.2275, 0.1216, 0.1529],\n", + " [0.1529, 0.1804, 0.3098, ..., 0.0235, 0.1647, 0.2431]],\n", + " \n", + " [[0.5137, 0.5725, 0.4275, ..., 0.0039, 0.0039, 0.0039],\n", + " [0.3882, 0.6471, 0.2510, ..., 0.0000, 0.0000, 0.0039],\n", + " [0.5451, 0.7529, 0.5137, ..., 0.0000, 0.0000, 0.0039],\n", + " ...,\n", + " [0.3804, 0.3843, 0.3020, ..., 0.1725, 0.1882, 0.1843],\n", + " [0.3373, 0.2588, 0.3804, ..., 0.2353, 0.1294, 0.1725],\n", + " [0.1725, 0.2000, 0.3412, ..., 0.0314, 0.1804, 0.2588]],\n", + " \n", + " [[0.3686, 0.3922, 0.2824, ..., 0.0078, 0.0078, 0.0039],\n", + " [0.3333, 0.4157, 0.0902, ..., 0.0039, 0.0039, 0.0039],\n", + " [0.5137, 0.6275, 0.2863, ..., 0.0039, 0.0039, 0.0039],\n", + " ...,\n", + " [0.3882, 0.3922, 0.3098, ..., 0.1529, 0.1804, 0.1725],\n", + " [0.3451, 0.2667, 0.3922, ..., 0.2235, 0.1176, 0.1569],\n", + " [0.1843, 0.2118, 0.3490, ..., 0.0196, 0.1765, 0.2549]]]),\n", + " tensor([[[0.3922, 0.3569, 0.3569, ..., 0.1137, 0.1137, 0.1059],\n", + " [0.3294, 0.3922, 0.4039, ..., 0.1098, 0.1059, 0.1020],\n", + " [0.2118, 0.2941, 0.3569, ..., 0.1137, 0.1098, 0.1059],\n", + " ...,\n", + " [0.7961, 0.7373, 0.7412, ..., 0.7529, 0.5608, 0.3020],\n", + " [0.7373, 0.7647, 0.6824, ..., 0.2235, 0.5765, 0.5137],\n", + " [0.2196, 0.4549, 0.2588, ..., 0.3412, 0.0627, 0.2196]],\n", + " \n", + " [[0.2510, 0.2275, 0.2431, ..., 0.3020, 0.3059, 0.2980],\n", + " [0.1647, 0.2314, 0.2392, ..., 0.2980, 0.2980, 0.2941],\n", + " [0.0902, 0.1451, 0.1804, ..., 0.3020, 0.3020, 0.2980],\n", + " ...,\n", + " [0.5255, 0.4980, 0.4902, ..., 0.6235, 0.4902, 0.2196],\n", + " [0.5059, 0.5725, 0.5020, ..., 0.1216, 0.4588, 0.3686],\n", + " [0.0588, 0.3294, 0.1922, ..., 0.2431, 0.0157, 0.1529]],\n", + " \n", + " [[0.1569, 0.0902, 0.1098, ..., 0.6000, 0.6039, 0.5961],\n", + " [0.0706, 0.1216, 0.1451, ..., 0.5961, 0.5961, 0.5922],\n", + " [0.0078, 0.0549, 0.0980, ..., 0.6000, 0.6000, 0.5961],\n", + " ...,\n", + " [0.3961, 0.3255, 0.3412, ..., 0.5490, 0.4353, 0.1451],\n", + " [0.3725, 0.4471, 0.3725, ..., 0.1176, 0.3490, 0.3373],\n", + " [0.0431, 0.2314, 0.1216, ..., 0.1569, 0.0235, 0.1137]]])\n", + "])\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "jyrUH0Jx1AIc" + }, + "source": [ + "We can unbind a NestedTensor (which is already a regular, but lesser known torch Tensor operation with the same behavior) to get an actual Python list and take a closer look at some of the constituents." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "_XLL0ptR1FYT", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "6c4f3116-a2df-45ac-c4d6-bc4db4bd9fe0" + }, + "source": [ + "print(nt.unbind()[0])" + ], + "execution_count": 23, + "outputs": [ + { + "output_type": "stream", + "text": [ + "tensor([[[0.4431, 0.4431, 0.4353, ..., 0.1451, 0.0784, 0.0627],\n", + " [0.4471, 0.4431, 0.4392, ..., 0.1137, 0.0784, 0.0627],\n", + " [0.4510, 0.4471, 0.4392, ..., 0.1137, 0.0118, 0.1255],\n", + " ...,\n", + " [0.1765, 0.1608, 0.1765, ..., 0.3294, 0.3725, 0.3686],\n", + " [0.2078, 0.2039, 0.2314, ..., 0.4275, 0.3333, 0.3412],\n", + " [0.2118, 0.2235, 0.2471, ..., 0.4000, 0.4392, 0.4353]],\n", + "\n", + " [[0.5647, 0.5647, 0.5647, ..., 0.1490, 0.0824, 0.0667],\n", + " [0.5686, 0.5647, 0.5686, ..., 0.1176, 0.0824, 0.0745],\n", + " [0.5725, 0.5686, 0.5686, ..., 0.1216, 0.0196, 0.1451],\n", + " ...,\n", + " [0.1843, 0.1647, 0.1765, ..., 0.2745, 0.3176, 0.3059],\n", + " [0.2118, 0.2078, 0.2353, ..., 0.3882, 0.2941, 0.3098],\n", + " [0.2196, 0.2314, 0.2549, ..., 0.3451, 0.3882, 0.3961]],\n", + "\n", + " [[0.6863, 0.6863, 0.6863, ..., 0.1294, 0.0510, 0.0353],\n", + " [0.6902, 0.6863, 0.6902, ..., 0.0863, 0.0588, 0.0471],\n", + " [0.6941, 0.6902, 0.6902, ..., 0.0706, 0.0000, 0.1216],\n", + " ...,\n", + " [0.1804, 0.1725, 0.1843, ..., 0.2235, 0.2667, 0.2471],\n", + " [0.2196, 0.2157, 0.2431, ..., 0.3412, 0.2471, 0.2588],\n", + " [0.2157, 0.2275, 0.2510, ..., 0.3098, 0.3529, 0.3569]]])\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "UBmu0s1n1P91" + }, + "source": [ + "or simply use indexing" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "ULD9QpRt1OJM", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "6c20ee0c-f23e-4b0b-a493-911eccd08a15" + }, + "source": [ + "print(nt[0])" + ], + "execution_count": 24, + "outputs": [ + { + "output_type": "stream", + "text": [ + "tensor([[[0.4431, 0.4431, 0.4353, ..., 0.1451, 0.0784, 0.0627],\n", + " [0.4471, 0.4431, 0.4392, ..., 0.1137, 0.0784, 0.0627],\n", + " [0.4510, 0.4471, 0.4392, ..., 0.1137, 0.0118, 0.1255],\n", + " ...,\n", + " [0.1765, 0.1608, 0.1765, ..., 0.3294, 0.3725, 0.3686],\n", + " [0.2078, 0.2039, 0.2314, ..., 0.4275, 0.3333, 0.3412],\n", + " [0.2118, 0.2235, 0.2471, ..., 0.4000, 0.4392, 0.4353]],\n", + "\n", + " [[0.5647, 0.5647, 0.5647, ..., 0.1490, 0.0824, 0.0667],\n", + " [0.5686, 0.5647, 0.5686, ..., 0.1176, 0.0824, 0.0745],\n", + " [0.5725, 0.5686, 0.5686, ..., 0.1216, 0.0196, 0.1451],\n", + " ...,\n", + " [0.1843, 0.1647, 0.1765, ..., 0.2745, 0.3176, 0.3059],\n", + " [0.2118, 0.2078, 0.2353, ..., 0.3882, 0.2941, 0.3098],\n", + " [0.2196, 0.2314, 0.2549, ..., 0.3451, 0.3882, 0.3961]],\n", + "\n", + " [[0.6863, 0.6863, 0.6863, ..., 0.1294, 0.0510, 0.0353],\n", + " [0.6902, 0.6863, 0.6902, ..., 0.0863, 0.0588, 0.0471],\n", + " [0.6941, 0.6902, 0.6902, ..., 0.0706, 0.0000, 0.1216],\n", + " ...,\n", + " [0.1804, 0.1725, 0.1843, ..., 0.2235, 0.2667, 0.2471],\n", + " [0.2196, 0.2157, 0.2431, ..., 0.3412, 0.2471, 0.2588],\n", + " [0.2157, 0.2275, 0.2510, ..., 0.3098, 0.3529, 0.3569]]])\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "JmEPDgQm1TL-" + }, + "source": [ + "### nested_size\n", + "\n", + "Since NestedTensors are strictly more general in their shape than torch Tensors we introduce new methods called nested_size (and nested stride) to get a representation for their shape. \n", + "\n", + "NestedTensors still carry sizes, but they may be undefined (None) along some of the dimensions. See the next section on more details for a stricter definition, but roughly speaking, size is None when *constiuent sizes are non-uniform along that dimension*. \n", + "\n", + "In the example below the constituents of NestedTensor `nt` have sizes of 351, 480, 640 and 425 along their second dimensions, which means the size along the third dimension of `nt` is None. \n", + "\n", + "Similarly, constituents are non-uniform along their third dimensions, making `nt`'s fourth dimension None as well.\n" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "jI0wu6FS0tpg", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "ec6bc6e6-890f-45ef-ba0f-1346675fe5c6" + }, + "source": [ + "print(nt.nested_size())\n", + "print(nt.size())" + ], + "execution_count": 25, + "outputs": [ + { + "output_type": "stream", + "text": [ + "NestedSize([\n", + "\ttorch.Size([3, 351, 640]),\n", + "\ttorch.Size([3, 480, 640]),\n", + "\ttorch.Size([3, 640, 423]),\n", + "\ttorch.Size([3, 425, 640])\n", + "])\n", + "(4, 3, None, None)\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "_9Oe8_q0S_WJ" + }, + "source": [ + "### Other Tensor properties are unchanged\n", + "\n", + "A NestedTensor is very similar to a regular torch Tensor, with the only key difference that its shape can be more complex. That means most importantly that a NestedTensor size (and stride) can be irregular and for some dimensions may not be defined (hence None). Instead NestedTensors come with a nested_size and a nested_stride.\n", + "\n", + "Everything else still applies. It still only has a single dimension, single dtype, single layout, single device. And it is backed by a single, contiguous region of memory.\n" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "3hokMvGWT_WX", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "d847c83c-94a2-4571-f6f4-d2cbd4ae5196" + }, + "source": [ + "print(nt.dim())\n", + "print(nt.layout)\n", + "print(nt.device)\n", + "print(nt.dtype)\n", + "print(nt.numel())" + ], + "execution_count": 26, + "outputs": [ + { + "output_type": "stream", + "text": [ + "4\n", + "torch.strided\n", + "cpu\n", + "torch.float32\n", + "3223680\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "VKLWvY_OUUFX" + }, + "source": [ + "A NestedTensor is semantically interchangeable with a regular Tensor if its nested_size is regular and regular torch operators will behave just as expected. It is only when a NestedTensor's shape becomes irregular, that an operator might behave differently." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "jLXML_Q0Ud4e", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "13db8dc8-487a-4525-9e13-ae0b583befa6" + }, + "source": [ + "nt_tensor = nestedtensor.nested_tensor(8 * [torch.randn(3, 100, 100)])\n", + "print(nt_tensor.nested_size())\n", + "print(nt_tensor.size())" + ], + "execution_count": 27, + "outputs": [ + { + "output_type": "stream", + "text": [ + "NestedSize([\n", + "\ttorch.Size([3, 100, 100]),\n", + "\ttorch.Size([3, 100, 100]),\n", + "\ttorch.Size([3, 100, 100]),\n", + "\ttorch.Size([3, 100, 100]),\n", + "\ttorch.Size([3, 100, 100]),\n", + "\ttorch.Size([3, 100, 100]),\n", + "\ttorch.Size([3, 100, 100]),\n", + "\ttorch.Size([3, 100, 100])\n", + "])\n", + "(8, 3, 100, 100)\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "0cZpuiS4UqCf" + }, + "source": [ + "*Design note: We could have alternatively attempted to generalize torch.Tensor by introducing a nested_size method and nested_tensor constructor to produce irregular torch.Tensors, but introducing a separate construct (namely NestedTensor) is presumably easier at first.*\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "YHB6aoBVYJPg" + }, + "source": [ + "### Interop example: resnet18\n", + "\n", + "To showcase just how similar NestedTensors are to regular Tensors let us feed one into a torchvision resnet18." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "3fkr2P1iVoID", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 205, + "referenced_widgets": [ + "4f85dc4ee9b249aebf5adba798180649", + "ad71b29df79b49198a4be3b6b569c4c7", + "f23446cc75a244248681bed4530f4a93", + "91922f02bf794a2fa764a7eccc0f5481", + "50f69fcac83f428d985180e00a83128f", + "b6c744f5b41e4614b48761c2d7a72e79", + "d93c351644a74e6db583bad2dda4f2fa", + "e969b63218dd480c97f837824eda12a0" + ] + }, + "outputId": "864bbaf8-db04-4ce3-be29-dd5c92791398" + }, + "source": [ + "model = torchvision.models.resnet.resnet18(pretrained=True).eval()\n", + "with torch.inference_mode():\n", + " result_model_nt = model(nestedtensor.nested_tensor(EXAMPLE_IMAGE_TENSORS)).unbind()\n", + "# The outputs won't match bit-perfect, but they are allclose\n", + "for i, img in enumerate(EXAMPLE_IMAGE_TENSORS):\n", + " a = result_model_nt[i]\n", + " b = model(img.unsqueeze(0)).squeeze(0)\n", + " # atol and rtol from PyTorch test settings found here https://github.com/pytorch/pytorch/blob/2fe382e931ec5a31715c247fea2b292f7d72cb66/torch/testing/_internal/common_utils.py#L921\n", + " print(torch.allclose(a, b, atol=1e-5, rtol=1.3e-6))" + ], + "execution_count": 28, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Downloading: \"https://download.pytorch.org/models/resnet18-5c106cde.pth\" to /root/.cache/torch/hub/checkpoints/resnet18-5c106cde.pth\n" + ], + "name": "stderr" + }, + { + "output_type": "display_data", + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "4f85dc4ee9b249aebf5adba798180649", + "version_minor": 0, + "version_major": 2 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=46827520.0), HTML(value='')))" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "stream", + "text": [ + "\n" + ], + "name": "stdout" + }, + { + "output_type": "stream", + "text": [ + "/usr/local/lib/python3.7/dist-packages/torch/nn/functional.py:718: UserWarning: Named tensors and all their associated APIs are an experimental feature and subject to change. Please do not use them for anything important until they are released as stable. (Triggered internally at /pytorch/c10/core/TensorImpl.h:1156.)\n", + " return torch.max_pool2d(input, kernel_size, stride, padding, dilation, ceil_mode)\n" + ], + "name": "stderr" + }, + { + "output_type": "stream", + "text": [ + "True\n", + "True\n", + "True\n", + "True\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "STGxLWXXVg5Z" + }, + "source": [ + "### Shape properties of NestedTensors\n", + "Let's spend a bit more time going into the details of NestedTensor properties. Let's use our example tensors as an input to construct a NestedTensor." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "aUIqLTfBVgDa", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "1455c9ce-5196-414f-c5b9-033ea8218e5b" + }, + "source": [ + "nt = nestedtensor.nested_tensor(EXAMPLE_IMAGE_TENSORS)\n", + "print(nt.nested_dim())\n", + "print(nt.tensor_dim())\n", + "print(nt.dim())" + ], + "execution_count": 29, + "outputs": [ + { + "output_type": "stream", + "text": [ + "1\n", + "3\n", + "4\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "1nWeLmBEfF8F" + }, + "source": [ + "Every non-empty NestedTensor is of at least dimension one, because it must represent at least a list. For each level of lists with list entries added we increase the nested dimension by one. That means this NestedTensor is of nested dimension 1.\n", + "\n", + "The tensor dimension is three, because the Tensor constituents are of dimension three.\n", + "\n", + "The overall dimension is four because it is the sum of the nested and tensor dimension.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "yEcOI9BHfrBD" + }, + "source": [ + "Here is another quick example, but this time with nested dimension two." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "vmcT6eOhfn-t", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "7f27193a-8482-4b7e-f2d4-6996c35719dc" + }, + "source": [ + "a = torch.tensor([[1]])\n", + "b = torch.tensor([[2, 2],\n", + " [3, 3],\n", + " [4, 4],\n", + " [5, 5]])\n", + "nt2 = nestedtensor.nested_tensor([[a], [b]])\n", + "print(nt2)\n", + "print(nt2.nested_dim())\n", + "print(nt2.tensor_dim())\n", + "print(nt2.dim())" + ], + "execution_count": 30, + "outputs": [ + { + "output_type": "stream", + "text": [ + "nested_tensor([\n", + " [\n", + " tensor([[1.]])\n", + " ],\n", + " [\n", + " tensor([[2., 2.],\n", + " [3., 3.],\n", + " [4., 4.],\n", + " [5., 5.]])\n", + " ]\n", + "])\n", + "2\n", + "2\n", + "4\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "iaED3KP-VgDd" + }, + "source": [ + "NestedTensor.nested_size can be thought of as the result of replacing the regular Tensor constituents by their size.\n", + "\n", + "NestedTensor.nested_size optionally also accepts a dim argument. This will return a slice across the given dimension. This might be easier to explain via an example below.\n", + "\n", + "nt2.nested_size(0) returns the length of nt or the number of entries in the list it represents. This is very similar to ```list.__len__```.\n", + "\n", + "nt2.nested_size(1) returns the length of the entries of the outer list.\n", + "\n", + "nt2.nested_size(2) returns the first entry of each Tensor constiuent's size. \n", + "\n", + "nt2.nested_size(3) returns the second entry of each Tensor constiuent's size.\n" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "OlggEM84VgDd", + "scrolled": false, + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "3b449f3f-b14d-4f16-d321-6f615c2a1144" + }, + "source": [ + "print(nt2)\n", + "print(nt2.nested_size())\n", + "print(len(nt2))\n", + "print(nt2.nested_size(0))\n", + "print(nt2.nested_size(1))\n", + "print(nt2.nested_size(2))\n", + "print(nt2.nested_size(3))" + ], + "execution_count": 31, + "outputs": [ + { + "output_type": "stream", + "text": [ + "nested_tensor([\n", + " [\n", + " tensor([[1.]])\n", + " ],\n", + " [\n", + " tensor([[2., 2.],\n", + " [3., 3.],\n", + " [4., 4.],\n", + " [5., 5.]])\n", + " ]\n", + "])\n", + "NestedSize([\n", + "\tNestedSize([\n", + "\t\ttorch.Size([1, 1])\n", + "\t]),\n", + "\tNestedSize([\n", + "\t\ttorch.Size([4, 2])\n", + "\t])\n", + "])\n", + "2\n", + "2\n", + "(1, 1)\n", + "((1,), (4,))\n", + "((1,), (2,))\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ZVAOFPm3Uuqg" + }, + "source": [ + "This property might appear a bit cumbersome, but can actually be very useful when you're trying to use the per-element length information in an operation. An example here is summing all word embeddings in a list of sentences and dividing them by their length." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "f3JltclNU9mP", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "25e62428-71ca-4c27-de76-b43e62479570" + }, + "source": [ + "sentences = [\n", + " # We're using arange to make the result easier to reason about\n", + " torch.arange(50).reshape(10, 5),\n", + " torch.arange(25).reshape(5, 5),\n", + " torch.arange(45).reshape(9, 5)]\n", + "with torch.inference_mode(): \n", + " nt = nestedtensor.nested_tensor(sentences)\n", + " print(nt)\n", + " lengths = torch.tensor(nt.nested_size(1)).reshape(-1, 1)\n", + " print(lengths)\n", + " print(nt.sum(1).size())\n", + " print(lengths.size())" + ], + "execution_count": 32, + "outputs": [ + { + "output_type": "stream", + "text": [ + "nested_tensor([\n", + " tensor([[ 0., 1., 2., 3., 4.],\n", + " [ 5., 6., 7., 8., 9.],\n", + " [10., 11., 12., 13., 14.],\n", + " [15., 16., 17., 18., 19.],\n", + " [20., 21., 22., 23., 24.],\n", + " [25., 26., 27., 28., 29.],\n", + " [30., 31., 32., 33., 34.],\n", + " [35., 36., 37., 38., 39.],\n", + " [40., 41., 42., 43., 44.],\n", + " [45., 46., 47., 48., 49.]]),\n", + " tensor([[ 0., 1., 2., 3., 4.],\n", + " [ 5., 6., 7., 8., 9.],\n", + " [10., 11., 12., 13., 14.],\n", + " [15., 16., 17., 18., 19.],\n", + " [20., 21., 22., 23., 24.]]),\n", + " tensor([[ 0., 1., 2., 3., 4.],\n", + " [ 5., 6., 7., 8., 9.],\n", + " [10., 11., 12., 13., 14.],\n", + " [15., 16., 17., 18., 19.],\n", + " [20., 21., 22., 23., 24.],\n", + " [25., 26., 27., 28., 29.],\n", + " [30., 31., 32., 33., 34.],\n", + " [35., 36., 37., 38., 39.],\n", + " [40., 41., 42., 43., 44.]])\n", + "])\n", + "tensor([[10],\n", + " [ 5],\n", + " [ 9]])\n", + "(3, 5)\n", + "torch.Size([3, 1])\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "uVgDOkanVswS", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "c3cbd9e8-2316-4388-c483-ffc69a77f826" + }, + "source": [ + "with torch.inference_mode():\n", + " normalized = nt.sum(1) / lengths\n", + " print(normalized.nested_size())\n", + " print(normalized)" + ], + "execution_count": 33, + "outputs": [ + { + "output_type": "stream", + "text": [ + "NestedSize([\n", + "\ttorch.Size([5]),\n", + "\ttorch.Size([5]),\n", + "\ttorch.Size([5])\n", + "])\n", + "nested_tensor([\n", + " tensor([22.5000, 23.5000, 24.5000, 25.5000, 26.5000]),\n", + " tensor([10., 11., 12., 13., 14.]),\n", + " tensor([20., 21., 22., 23., 24.])\n", + "])\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "6Gw4UKezVgDg" + }, + "source": [ + "NestedTensor.size is a function that returns a tuple of the format\n", + "(n_1, n_2, ..., n_nested_dim, t_1, t_2, ..., t_tensor_dim). The sizes lead by n_ are defined \n", + "to be the nested sizes each at a nested dimension, the sizes lead by t_ are defined to be the \n", + "tensor sizes each at a tensor dimension. They are a reduced version of nested_size and \n", + "aim to represent the size across a slice of nested_size.\n", + "\n", + "size(i) is of value k if all numerical entries of nested_size(dim) are of value k. size(i) is None if there does not exist such value k. size() is a tuple consisting of size(i)." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "T_yUTXLDVgDg", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "7706224c-9b8b-4746-d44d-a8e52393e756" + }, + "source": [ + "print(nt2.nested_size())\n", + "print(nt2.nested_size(0))\n", + "print(nt2.nested_size(1))\n", + "print(nt2.nested_size(2))\n", + "print(nt2.nested_size(3))\n", + "print(nt2.size())" + ], + "execution_count": 34, + "outputs": [ + { + "output_type": "stream", + "text": [ + "NestedSize([\n", + "\tNestedSize([\n", + "\t\ttorch.Size([1, 1])\n", + "\t]),\n", + "\tNestedSize([\n", + "\t\ttorch.Size([4, 2])\n", + "\t])\n", + "])\n", + "2\n", + "(1, 1)\n", + "((1,), (4,))\n", + "((1,), (2,))\n", + "(2, 1, None, None)\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "DA1SrNxlWQ1y" + }, + "source": [ + "### nn.Transformer and nn.EmbeddingBag\n", + "\n", + "Let's look how we can feed NestedTensors into nn.Transformer and nn.EmbeddingBag.\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "E3Ry1qe5mdLi", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "c441c676-f30d-405e-c5b0-fbb9104a1b60" + }, + "source": [ + "EMBED_DIM = 32\n", + "NHEAD = 8\n", + "t = torch.nn.Transformer(EMBED_DIM, NHEAD, dropout=0.0)\n", + "\n", + "src0 = torch.randn(2, EMBED_DIM)\n", + "src1 = torch.randn(4, EMBED_DIM)\n", + "nt_src = nestedtensor.nested_tensor([src0, src1])\n", + "\n", + "tgt0 = torch.randn(3, EMBED_DIM)\n", + "tgt1 = torch.randn(5, EMBED_DIM)\n", + "nt_tgt = nestedtensor.nested_tensor([tgt0, tgt1])\n", + "\n", + "with torch.inference_mode():\n", + " res_0 = t(src0.unsqueeze(1), tgt0.unsqueeze(1)).squeeze(1)\n", + " res_1 = t(src1.unsqueeze(1), tgt1.unsqueeze(1)).squeeze(1)\n", + " res_nt = t(nt_src, nt_tgt)\n", + "\n", + "for t0, t1 in zip(res_nt.unbind(), [res_0, res_1]):\n", + " print(torch.equal(t0, t1))" + ], + "execution_count": 35, + "outputs": [ + { + "output_type": "stream", + "text": [ + "False\n", + "False\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Lv_uuYTyvo5m" + }, + "source": [ + "If you're familiar with [nn.EmbeddingBag](https://pytorch.org/docs/master/generated/torch.nn.EmbeddingBag.html#torch.nn.EmbeddingBag) you know that it currently supports variable shape input via flat data + offset data representation. Let's feed in the first 10 lines of text to demonstrate this.\n", + "\n", + "In particular, offsets need to represent the starting points of each line of indices" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "Tm9xZkEiv2HM", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "9c80babf-a963-469c-d2b5-670c6ea1b9a0" + }, + "source": [ + "ten_tensors = tuple(torch.rand(i).mul(100).long() for i in range(1, 11))\n", + "print(list(t.size() for t in ten_tensors))\n", + "\n", + "input_batch_data = torch.cat(ten_tensors)\n", + "input_batch_offset = torch.cat((torch.tensor([0]), torch.tensor(tuple(len(line) for line in ten_tensors))))\n", + "input_batch_offset = input_batch_offset.cumsum(0)[:-1]\n", + "embedding = torch.nn.EmbeddingBag(100, 10, sparse=True)\n", + "print(input_batch_offset)\n", + "result_tensor = embedding(input_batch_data, input_batch_offset)\n", + "print(result_tensor.size())" + ], + "execution_count": 36, + "outputs": [ + { + "output_type": "stream", + "text": [ + "[torch.Size([1]), torch.Size([2]), torch.Size([3]), torch.Size([4]), torch.Size([5]), torch.Size([6]), torch.Size([7]), torch.Size([8]), torch.Size([9]), torch.Size([10])]\n", + "tensor([ 0, 1, 3, 6, 10, 15, 21, 28, 36, 45])\n", + "torch.Size([10, 10])\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Ow05t57zuKSO" + }, + "source": [ + "Due to cumsum this isn't all that painful, but NestedTensor does clean it up a little bit" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "bPw5t-DTzGEx", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "81b8d48a-ae11-46df-d3b2-5d18d5d5c5d2" + }, + "source": [ + "with torch.inference_mode():\n", + " nt = nestedtensor.nested_tensor(ten_tensors, dtype=torch.int64)\n", + " print(nt.nested_size())\n", + " result_nt = embedding(nestedtensor.nested_tensor(ten_tensors, dtype=torch.int64))\n", + " print(result_nt.nested_size())" + ], + "execution_count": 37, + "outputs": [ + { + "output_type": "stream", + "text": [ + "NestedSize([\n", + "\ttorch.Size([1]),\n", + "\ttorch.Size([2]),\n", + "\ttorch.Size([3]),\n", + "\ttorch.Size([4]),\n", + "\ttorch.Size([5]),\n", + "\ttorch.Size([6]),\n", + "\ttorch.Size([7]),\n", + "\ttorch.Size([8]),\n", + "\ttorch.Size([9]),\n", + "\ttorch.Size([10])\n", + "])\n", + "NestedSize([\n", + "\ttorch.Size([10]),\n", + "\ttorch.Size([10]),\n", + "\ttorch.Size([10]),\n", + "\ttorch.Size([10]),\n", + "\ttorch.Size([10]),\n", + "\ttorch.Size([10]),\n", + "\ttorch.Size([10]),\n", + "\ttorch.Size([10]),\n", + "\ttorch.Size([10]),\n", + "\ttorch.Size([10])\n", + "])\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "QgNFmjtmz4Nh" + }, + "source": [ + "Underneath the hood NestedTensor simply translates into the format required by EmbeddingBag, but doesn't bother the user with converting into this format manually. This is why we get equality in the output." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "KGI8z5540BbR", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "74ec98bb-096c-4807-bfb3-4a3e6c7ac9db" + }, + "source": [ + "for t0, t1 in zip(result_tensor.unbind(), result_nt.unbind()):\n", + " print(torch.equal(t0, t1))" + ], + "execution_count": 38, + "outputs": [ + { + "output_type": "stream", + "text": [ + "True\n", + "True\n", + "True\n", + "True\n", + "True\n", + "True\n", + "True\n", + "True\n", + "True\n", + "True\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "6_oZRWfZoIYF" + }, + "source": [ + "### Autograd\n", + "Due to missing extensibility features of PyTorch nestedtensor currently lacks autograd support. We're actively working on this and recognize that it severely limits the applicability of the project.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "mkPe0uy8xBeM" + }, + "source": [ + "### Summary\n", + "This was a bit of a whirlwind tour to show the basics of the value behind the nestedtensor project and illustrate some of the basic NestedTensor behavior and properties. \n", + "\n", + "Thank you for your time and thank you for reading this tutorial.\n", + "\n", + "We're currently most interested in collecting feedback on the API design and general usability of this project as per the [prototype classification](https://pytorch.org/blog/pytorch-feature-classification-changes/#prototype) of this feature to decide whether we want to move this feature towards a Beta. \n", + "\n", + "We created an [issue template](https://github.com/pytorch/nestedtensor/issues/new?assignees=&labels=&template=prototype-feedback.md&title=) for feedback, but please also feel encouraged to just open a free-form issue if you like." + ] + } + ] +} \ No newline at end of file